🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

2回答

1761閲覧

display: flex, flex-shrink: 0配下で文字列が折返しできない問題

Kimsehwa

総合スコア312

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

1クリップ

投稿2021/03/27 02:16

css

1display: flex; 2flex-shrink: 0;

だと文字列がはみ出てしまいますが、

イメージ説明

css

1display: block !important; 2flex-shrink: 1 !important;

display: block + flex-shrink: 1にすると改善されました。

イメージ説明


上記現象についていつくか質問させてください。

質問1.

文字列折り返しできない問題は
word-breakとかoverflow-wrapで解決できると思いましたが、display: flex;配下ではまったく効きませんでした。

display: flex;配下ではword-breakとかoverflow-wrapは効かない仕様でしょうか?

質問2.

display: blockでもflex-shrinkのオプションは有効に使われますか?

今まで、display: flexの時だけflex-shrinkのオプションが有効だと思いましたが、
display: blockだけではなくflex-shrinkも1にしないと問題が解決できなかったので
今までの自分の理解が誤ってたのかの確認をしたいです。

質問3.

そもそもdisplay: block + flex-shrink: 1することでなぜ折返しできない問題が改善されますか?

全体のコードはこちらです。

html

1<!DOCTYPE html> 2<html> 3 <head> 4 <meta charset="utf-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1"> 6 <title>Hello Bulma!</title> 7 <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.2/css/bulma.min.css"> 8 </head> 9 <body> 10 <section class="section has-background-white-ter"> 11 <div class="container"> 12 <div class="columns is-tablet is-centered"> 13 <div class="column is-three-fifths has-background-white"> 14 <div class="level is-mobile"> 15 <div class="level-left level-left-flex-off"> 16 <div class="level-item"> 17 <h1 class="title is-size-4">aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</h1> 18 </div> 19 </div> 20 21 </div> 22 <style type="text/css">.level-left-flex-off{display:block !important;flex-shrink:1 !important}</style> 23 24 </div> 25 </div> 26 </div> 27 </section> 28 29 <!-- <section class="section"> 30 <div class="container"> 31 <h1 class="title"> 32 Hello World 33 </h1> 34 <p class="subtitle"> 35 My first website with <strong>Bulma</strong>! 36 </p> 37 </div> 38 </section>--> 39 </body> 40</html>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

質問者さんの疑問点からFlexboxにおいてのフレックスコンテナとフレックスアイテムについて理解ができてないのかなと感じました。
display: flex;が設定された要素がフレックスコンテナになります。その子要素がフレックスアイテムになります。
flex-shrinkはフレックスアイテムに設定するプロパティです。
まずは、その点を理解してください。(できていたのならすみせまでした。)
フレックスコンテナとフレックスアイテムについては、Lhankor_Mhyさんの回答にも指摘があります。

次に、CSSフレームワークの BULMA を使ってますね。
CSSフレームワークを使うメリットは、CSSは使わずに、HTMLでのクラス設定のみでレイアウトや装飾が可能な点です。独自のCSSを設定する場合は、CSSフレームワークのCSS設定とバッティングしないようにする必要があります。
今回の症状はCSSフレームワークの設定と関連して発生しているものなので、それを無視して議論して無意味です。

まず、.level-left-flex-off{display:block !important;flex-shrink:1 !important} というCSSを設定していますが、とりあえずこれを削除してCSSフレームワークのみの設定にしてみてください。すると、文字列が折返しされずにはみ出ます。つまり、独自に指定したCSSの設定の問題ではなくBULMAの設定がそうなっているからです。

HTMLのBULMAの設定を検証ツールで確認してみましょう。
関係するところだけ抜き出します。

html

1 <div class="level is-mobile"> /* 親 */ 2 <div class="level-left level-left-flex-off"> /* 子 */ 3 <div class="level-item"> /* 孫 */ 4 <h1 class="title is-size-4">aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</h1> 5 </div> 6 </div> 7 8 </div>

親から孫までのそれぞれに level level-left level-item のクラスが設定されています。このどのクラスにもdisplay: flex;が設定されています。つまり、この親、子、孫はすべてフレックスコンテナであり、子と孫はフレックスアイテムでもあります。
さらに、level-left level-item のクラスにはflex-shrink: 0;が設定されているので、子と孫は縮小されません。そのため中身のテキストが折り返されずにはみ出ます。

次に .level-left-flex-off(子)に、下記のように独自CSSを設定します。

css

1.level-left-flex-off { 2 display: flex; 3 flex-shrink: 1; 4}

子はflex-shrink: 1;になりましたが、孫のflex-shrink: 0;は活きていますので縮小されることがないので折り返されません。
つまり、

display: flex;配下ではword-breakとかoverflow-wrapは効かない仕様でしょうか?

は全く関係なく、孫のflex-shrink: 0;が効いているから折り返されないだけです。

そもそもdisplay: block + flex-shrink: 1することでなぜ折返しできない問題が改善されますか?

display: blockとすることでその要素はフレックスコンテナではなくなります。すると子要素はフレックスアイテムではなくなります。フレックスアイテムにおいて有効なflex-shrinkも無効になります。

つまり、子にdisplay: blockを設定したので孫のflex-shrink: 0;が無効になりました。そのため、子も孫も縮小するようになり折り返されるようになったのです。

BULMAは私は使ったことがないので、level level-left level-item はどの用途のもので、なぜ、flex-shrink: 0;が設定されているかは分かりませんが、CSSフレームワークを使うなら、極力独自のCSSは使わない。使うなら、フレームワークの設定を理解したうえで、それととバッティングしないように注意して、使用するようにすべきでしょう。

投稿2021/03/27 05:53

編集2021/03/27 09:25
hatena19

総合スコア34073

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。

__display: flex;配下ではword-breakとかoverflow-wrapは効かない仕様でしょうか? __

いいえ。
当方の環境で試してみましたが、以下のCSSでも折り返しました。

css

1 display: flex; 2 flex-shrink: 1;

display: blockでもflex-shrinkのオプションは有効に使われますか?

はい。
flex-shrink は、フレックスアイテムに効きますので、逆にdisplay: flexであってもフレックスアイテムでなければ効きません。
フレックスコンテナに効かせようとしているのであれば、勘違いだと思います。

flex-shrink は CSS のプロパティで、フレックスアイテムの縮小係数を設定します。

flex-shrink - CSS: カスケーディングスタイルシート | MDN


そもそもdisplay: block + flex-shrink: 1することでなぜ折返しできない問題が改善されますか?

質問1への回答でも書きましたが、display: blockは不要でした。

折り返しができないのは、ブロックの幅が拡大しているからです。
文字の折り返しは、ボックスから文字があふれる時に起きます。
逆に言うと、ボックスが際限なく大きくなるのであれば、文字を折り返す必要がないのです。

word-break は CSS のプロパティで、改行しなければテキストがコンテンツボックスからあふれる場合に、ブラウザーが改行を挿入するかどうかを指定します。

word-break - CSS: カスケーディングスタイルシート | MDN

投稿2021/03/27 02:39

Lhankor_Mhy

総合スコア36930

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Lhankor_Mhy

2021/03/27 09:34 編集

hatena19さんの回答を見て理解しました。 .level-left-flex-off に当てているスタイルの話なのですね。 スクリーンショットで示されている .title のことかと勘違いしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問