web-dev-qa-db-ja.com

フレックスコンテナーが100%の幅ではなく、コンテンツの幅を取るようにする

以下の例では、次のスタイルのボタンがあります...

.button-flexbox-approach {
    /* other button styles */
    display: flex;
    justify-content: center;
    align-items: center;
    padding: 1.5rem 2rem;
}

http://codepen.io/3stacks/pen/JWErZJ

ただし、コンテンツの幅ではなく、自動的に100%に拡大縮小されます。明示的な幅を設定できますが、それではテキストが自然に折り返されることはありません。

内側のテキストがflexboxで中央揃えになっているが、コンテナーのサイズに合わせて拡大しないボタンを作成するにはどうすればよいですか?

.container {
  width: 100%;
  height: 100%;
}

.button {
/*   Simply flexing the button makes it grow to the size of the container... How do we make it only the size of the content inside it? */
  display: flex;
  justify-content: center;
  align-items: center;
  -webkit-appearance: none;
  border-radius: 0;
  border-style: solid;
  border-width: 0;
  cursor: pointer;
  font-weight: normal;
  line-height: normal;
  margin: 0;
  position: relative;
  text-align: center;
  text-decoration: none;
  padding: 1rem 2rem 1.0625rem 2rem;
  font-size: 1rem;
  background-color: #D60C8B;
  border-color: #ab0a6f;
  color: #fff;
}

.one {
  margin-bottom: 1rem;
}

.two {
/* You can put an explicit width on that, but then you lose the flexibility with the content inside */
  width: 250px;
}
<div class="container">
  <p>
    Button one is flexed with no width and it grows to the size of its container
  </p>
  <p>
    <a class="button one" href="#">Button</a>
  </p>
  <p>
    Button two is flexed with an explicit width which makes it smaller, but we have no flexibility for changing the content
  </p>
  <p>
    <a class="button two" href="#">Button 2</a>
  </p>
</div>
13
3stacks

コンテナのdisplay: flexの代わりに、display: inline-flexを使用します。

これにより、コンテナーがブロックレベル(親の幅全体を使用)からインラインレベル(コンテンツの幅を使用)に切り替わります。

このサイズ設定の動作は、display: blockdisplay: inline-blockに似ています。

関連する問題と解決策については、以下を参照してください。

18
Michael_B

編集:Michael_Bは彼の答えで、親のインラインフレックスがこのユースケースの正しいプロパティであると指摘しました。私はそれに応じて私のブログ投稿を更新しました。

理想的ではありませんが、インラインブロックのコンテナーでボタンをラップすると、ボタンはコンテンツに合わせて自然にスケーリングされます。

.button {
  /* other button styles */
  display: flex;
  justify-content: center;
  align-items: center;
  padding: 1.5rem 2rem;
}
<div style="display: inline-block;">
  <a class="button">Button</a>
</div>

次に、コンテナの最大幅を設定すると、テキストは複数行に折り返されますが、正しい垂直方向の中央揃えは維持されます。

これについては、最新のブログ投稿で詳しく説明しています。 https://lukeboyle.com/css-buttons-solved-flexbox/

2
3stacks