CSSは要素内の各単語の後に改行を強制できますか?


159

私は多言語サイトを構築しており、所有者がいくつかの翻訳を手伝ってくれています。表示されるフレーズのいくつかは、サイトのスタイルを維持するために改行が必要です。

残念ながら、所有者はコンピューターの男ではないため、foo<br />bar翻訳中にデータを何らかの方法で変更する可能性があると彼が見た場合。

すべての単語の後で壊れる要素に適用するCSSソリューション(幅を変更する以外に)はありますか?

(私はこれをPHPで実行できることを知っていますが、CSSで知らない気の利いたトリックがCJK機能で同じことを達成するためにあるかどうか疑問に思っています。)

編集

私は何が起こっているのかを図解しようとします:

----------------          ----------------
| Short Word   |          | Gargantuan   |
|              |          | Word         |
----------------          ----------------

長い単語は自動的に壊れますが、短い単語は壊れません。私はそれをこのように見せたいです:

----------------          ----------------
| Short        |          | Gargantuan   |
| Word         |          | Word         |
----------------          ----------------

2
HTMLでは、特定の要素の幅で必要な場合、要素はすべての単語の後に壊れます。言葉の中でですか?
ポールD.ウェイト2010年

@Paul-いいえ、幅の固定に基づいていない解決策が必要です。問題は、一部のフレーズが長くなり(説明したように)自動的に分割され、一部のフレーズは短く、分割されないため、一貫性のないプレゼンテーションが作成されることです。
ベン

@Paul-はい、それはあなたが正確に説明しているようなものです。レイアウトを損なうことはありませんが、見栄えが良くなる可能性があります。
ベンは

単語間隔を使用できますが、すべての単語に影響します。これらの単語をspan要素でラップすることはできません。
meo

@meo-そのように見えます、考えをありがとう
Ben

回答:


261

使用する

.one-word-per-line {
    word-spacing: <parent-width>; 
}

.your-classname{
    width: min-intrinsic;
    width: -webkit-min-content;
    width: -moz-min-content;
    width: min-content;
    display: table-caption;
    display: -ms-grid;
    -ms-grid-columns: min-content;
}

ここで、<parent-width>親要素(または1行に収まらない任意の高い値)の幅です。これにより、1文字の後に改行があることを確認できます。Chrome / FF / Opera / IE7 +で動作します(ワードスペースをサポートしているため、おそらくIE6でも動作します)。


これは間違いなく最高の答えですimho
Hezad

31
@ToniMichelCaubet答えは本当に解釈するのは難しいですが、彼は意味します:親要素の幅は.parent { word-spacing: 100px; }どこですか100px。問題は、流動的な親がいる場合、このソリューションは機能しないことです。
John Kurlak

5
などの単語間隔に非常に高い値を設定するだけでword-spacing: 100000px、親が幅に関して流動的であることを心配する必要はありません。単語の間隔を100%に設定することは理にかなっています(親の幅の100%でした)が、パーセンテージで表される値はそのcssプロパティではサポートされていません。
sboisse 2014

1
これはとても役に立ちました。:私は1で、私は、彼らがすべて同じ高さですので、タブ内のテキストが折り返されたい幅応答状況、それを使用word-spacing: 2em; してモバイル幅で、私は彼らがシングルラインになりたい:word-spacing: unset;
ウィル

1
これは素晴らしいです。今後数年間、たくさんありがとう:)
Lucas Medina

124

@HursVanBloobの回答は、固定幅の親コンテナーでのみ機能しますが、流動幅コンテナーの場合は失敗します。

多くのプロパティを試しましたが、期待どおりに機能しませんでした。最後にword-spacing、非常に大きな値を指定しても問題なく機能するという結論に達しました。

p { word-spacing: 9999999px; }

または、最近のブラウザーでは、CSS vwユニット(画面サイズの視覚的幅(%))を使用できます。

p { word-spacing: 100vw; }

それは私がしようとするものです!
vaskort 2014年

これは素晴らしいソリューションです!
Joe Conlin、2015

&nbsp;で完全に壊れる でも。
マットフレッチャー

2
コンテナの流体幅が非常に大きくなるのは、私にはうまくいきません。
Onza

@Onzaは、問題を示すフィドルリンクを共有できますか?
Deepak Yadav 2017

37

別の解決策は、要素に適用することにより、行ごとに1つの単語別の文で説明されdisplay:table-caption;ています


これは実際には、最も長い単語の幅に基づいて単語をグループ化するだけです。
James South

1
これは単語を1行にまとめることができますが、多くの状況で非常にうまく機能し、大量の単語間隔オプションほどハッキリとは感じません。
2016

1
これは私にとって完璧に機能したものです。
マットフレッチャー

1
結果はありません
jafarbtech 2017

32

を使用してみてくださいwhite-space: pre-line;。コード内で改行が出現する場所には改行が作成されますが、余分な空白(タブやスペースなど)は無視されます。

まず、コードの別の行に単語を記述します。

<div>Short
Word</div>

次に、単語を含む要素にスタイルを適用します。

div { white-space: pre-line; }

注意してくださいしかし、要素内のコード内のすべての改行は、改行を作成します。したがって、次のように書くと、最初の単語の前と最後の単語の後に余分な改行が生じます。

<div>
    Short
    Word
</div>

他の空白属性を説明するCSSトリックに関する素晴らしい記事があります。


white-space質問への回答にどのように使用できるかを説明する必要があります。すみませんが、方法がわかりません。
jlgrall 2013年

2
CSS Tricksの記事で十分に説明されているので、ここで答えを逆流させようとするのではなく、リンクで十分だと思いました。
Nass、2013年

それでは、ソースに実際の改行を入れ、CSS " white-space: pre;"を使用して<pre>タグのように改行を表示することをお勧めしますか?これは機能する可能性があり、改行は翻訳者にとって<br />。より自然に見えるはずです。私はあなたの答えを編集して追加しようとします:)
jlgrall

丁度。white-space: pre-line;コードの余分な空白を無視するため、実際にはおそらくより適切でしょう。答えを更新します。
Nass 2013

良い、多分ちょうど追加しwhite-space: pre;IE 7のために
jlgrall

12

与えられた答えに加えて、さまざまなソリューションから選択できるようにしたい場合...

別の方法は、コンテナの幅を0にして、オーバーフローが確実に表示されるようにすることです。次に、各単語がオーバーフローし、独自の行に配置されます。

div {
  width: 0;
  overflow: visible;
}
<div>Short Word</div>
<hr>
<div>Gargantuan Word</div>

または、これらの新しく提案されたwidth値の1つを使用することもできます。

div {
  width: min-intrinsic;       /* old Chrome, Safari */
  width: -webkit-min-content; /* less old Chrome, Safari */
  width: -moz-min-content;    /* current Firefox */
  width: min-content;         /* current Chrome, Safari; not IE or Edge */
}
<div>Short Word</div>
<hr>
<div>Gargantuan Word</div>


4

CSSで各単語をターゲットにすることはできません。ただし、jQueryを少し使用すれば、おそらく可能です。

jQueryを使用する<span>と、各単語をaでラップしてから、CSSがスパンを設定display:blockし、それを独自の行に配置できます。

もちろん理論的には:P


うん、怖かった。PHPでもできますが、醜い解決策のようです。私は:first-child何かトリックがあるかもしれないと思っていました...
Ben

@Steve:いいえ、CSSセレクターでは現在、HTMLノードのみを選択でき、テキストノードは選択できません。私はCSS 3 Textモジュールを調べましが、要素内の各単語の後に強制的に中断するものは何もないようです。マークのソリューションが最善の策です。
ポールD.ウェイト

@ Paul、@ Mark-誰かが担当者を望んでいるなら、あなたはそれを答えにすることができ、私はそれを受け入れます。これをmeta.stackoverflow.com/questions/48013/…ごとに(今のところ)応答不能としてマークします。
ベン

マークはすでに答えを出していると思います。担当者はすべて私に関する限り彼のものです。
ポールD.ウェイト2010年

@Paul-+1チームプレーヤーが男にバッジか何かを与える:)
Ben

2

https://jsfiddle.net/bm3Lfcod/1/

両方の次元で柔軟な子を持つ柔軟な親コンテナー内で機能するソリューションを求めている人のために。例えば。ナビゲーションバーボタン。

//the parent (example of what it may be)
div {
  display:flex;
  width: 100%;
}

//The children
a {
  display: inline-block;
}

//text wrapper
span {
  display: table-caption;
}

CSSあなたが与えることができる他のどんな特性にもそれを与えることを試みなさい。発生する可能性のある物件をbrowser reflow
発言してください

1
ブラウザのリフロー?
Onza

2

私は同じ問題に直面しました、そして、ここでのオプションのどれも私を助けませんでした。一部のメールサービスは、指定されたスタイルをサポートしていません。これが私のバージョンです。問題を解決し、チェックしたすべての場所で機能します。

<table>
    <tr>
        <td width="1">Gargantuan Word</td>
    </tr>
</table>

またはCSSを使用:

<table>
    <tr>
        <td style="width:1px">Gargantuan Word</td>
    </tr>
</table>

2

最善の解決策はword-spacingプロパティです。

<p>特定のサイズのコンテナに追加し(例300px)、そのサイズをワードスペースの値として追加する必要があります。

HTML

<div>
 <p>Sentence Here</p>
</div>

CSS

div {
 width: 300px;
}

p {
 width: auto;
 text-align: center;
 word-spacing: 300px;
}

このようにして、文は常に分割されて列に設定されますが、段落のwithは動的になります。

ここに Codepen の例


-1

私の場合、

    word-break: break-all;

完璧に働いた、それが私のような他のすべての新人を助けることを願っています。


これは不正解なので、私から-1が返されます。これにより、必要に応じてすべての文字で行が区切られます。
Emobe
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.