<br />を使用せずにcssから改行する方法は?


398

出力:

こんにちは
お元気ですか

コード:

<p>hello <br> How are you </p>

なしで同じ出力を達成するにはどうすればよい<br>ですか?

回答:


385

同じHTML構造では不可能です。Helloとを区別するためのものが必要How are youです。

span<div>実際と同じように)ブロックとして表示するsを使用することをお勧めします。

p span {
  display: block;
}
<p><span>hello</span><span>How are you</span></p>


37
マークアップの追加量にも注意してください- <br />要素は非常に正当な理由で存在します。別々の段落であるために改行が必要な場合は、それらを別々の段落としてマークアップします。
Rowland Shaw

8
実際に段落を使用せずに構造化された行が必要になる場合があります。たとえば、詩、歌、住所などをマークアップするには
Vincent Robert

2
@VincentRobert正解ですが、詩はいつ<br>が正しいマークアップであるかの典型的な例です。詩のスパンは「間違っている」でしょう。
アランH.

8
要素にdisplay:blockを割り当てると、行の前後で強制的に改行されることに注意してください。したがって、1つの改行を持つこととはまったく異なります。
jerseyboy 2013

17
必ず<p>要素を使用してください。<span>要素をdisplay:blockにしないでください。<span>の要点はインラインであることです。<div> <p>こんにちは</ p> <p>お元気ですか</ p> </ div>。必要なCSSは必要ありません。
マイル

354

を使用white-space: pre;して、要素をのよう<pre>に動作させ、改行を保持できます。例:

p {
  white-space: pre;
}
<p>hello 
How are you</p>

IEについては、これはIE8 +でのみ機能することに注意してください。


133
多くの場合、prepre-lineラッピングを許可するよりも優れています。
アランH.

14
pre.lineとpre-wrapの違いに関する詳細はdeveloper.mozilla.org/en-US/docs/Web/CSS/white-space
patrick

1
私はテキストオーバーフローも使用できるため、私の場合はpreを優先しました
Greg

最終的にはテキストがバンドルされて同じ行に配置されるため、white-spaceCSSルールをトリガーしないため、reactでは機能しません。
Vadorequest

119

<br/>通常どおり使用しますが、不要な場合は非表示にしdisplay: noneます。

この質問を見つけたほとんどの人は、CSS /レスポンシブデザインを使用して、特定の場所に改行が表示されるかどうかを判断することを期待しています。(そして個人的なものは何もありません<br/>

すぐにはわかりませんが、実際にタグを適用display:none<br/>て非表示にすることができます。これにより、セマンティックBRタグと組み合わせてメディアクエリを使用できます。

 <div>
   The quick brown fox<br />
   jumps over the lazy dog
 </div>

 @media screen and (min-width: 20em) 
 {
    br 
    { 
       display: none;   // hide the BR tag for wider screens (i.e. disable the line break)
    }
 }

これは、正確な区切りでテキストを強制的に2行にするレスポンシブデザインで役立ちます。

http://jsfiddle.net/nNbD3/1/


5
サイモン、あなたはスポットを当てています—あなたが挙げる例は、私がこの質問を調査していた正確な理由であり、display: none解決策は断然最も適切で有用です。
abbottjam 14年

8
単語が一緒に実行される場合は、のdisplay: inline-block; width: 1em;代わりになどを使用できますnone
Beejor

2
<br class='foo'>さらに制御が必要な場合は、クラスをに適用することもできますが、おかしくなりすぎないでください。
Simon_Weaver 2016年

別の「なぜ私はこれについて考えなかったのですか?!」回答。<br/>それが何をするかに優れています。ホイールを再発明する必要はありません。ありがとう!
rinogo 2017年

:同様のコンセプトは、フレックスボックスのレイアウトに適用することができstackoverflow.com/questions/29732575/...
Simon_Weaver

106

空白と改行の処理を定義するためのいくつかのオプションがあります。たとえば<p>タグにコンテンツを配置できる場合、必要なものを簡単に取得できます。

以下のための改行ではなく空白の保存使用pre-line(ないpre中など):

<style>
 p {
     white-space: pre-line; /* collapse WS, preserve LB */
   }
</style>

<p>hello
How are you</p>

別の動作が必要な場合は、次のいずれかを選択してください(WS = WhiteSpace、LB = LineBreak):

     white-space: normal;   /* collapse WS, wrap as necessary, collapse LB */
     white-space: nowrap;   /* collapse WS, no wrapping,       collapse LB */
     white-space: pre;      /* preserve WS, no wrapping,       preserve LB */
     white-space: pre-wrap; /* preserve WS, wrap as necessary, preserve LB */
     white-space: inherit;  /* all as parent element */

出典:W3 Schools


4
完璧。選択した答えでなければなりません。
ベン・林

1
これがOPが求めていることだと思います。
John Sardinha 2016年

64

CSS「\ a」コマンドはキャリッジリターンを生成します。これはCSSではなくHTMLなので、必要なものに近くなります。余分なマークアップはありません

以下の例では、ブロック引用符でタイトルとソースリンクの両方を表示し、キャリッジリターン("\a")で2つを区切ります。

blockquote[title][cite]:after {
    content:attr(title)"\a"attr(cite)
}

派手ですが、質問が何であるかについてはまったく必要ありません。
YePhIcK 2014

15
+1は、CSSのみであり、pre、brタグの使用も、表示モードのブロックへの変更もお勧めしていません(これにより、異なる動作が追加され、親が存在しdisplay:flex、したがってこのコンテキストでハッキングされている場合は壊れる可能性があります)。派手ではありませんが、実際には、単にモダンなテクニックです。まったく同じマークアップが必要だが、実際には異なる反応をする場合は、それが方法です。
2014

素晴らしいアイデア。"–を特殊文字として解析'できるように\aするため、単純な引用符は使用しないでください。
Hafenkranich

2
+1したいのですが、
Chrome

4
もしあなたが何をしているのかを視覚化するのに役立つHTMLやフィドルがあったら、私はこれに賛成票を投じたでしょう。
John

29

CSSでコードを使用する

p {
    white-space: pre-line;
}

このコードcssを使用すると、Pタグ内のすべての入力がhtmlのブレークラインになります。


1
これがまさに私が探していたものです!エスケープ/サニタイズ(たとえば、ngBindHtmlを使用しない場合の通常のAngularJSエスケープ動作)を通過するJSから生成された要素コンテンツ(たとえば、AJAXクエリからのJSON結果、angular-schema-formなど)に対して完全に機能します
Stefan Dragnev

28

これまで述べてきたことを踏まえて、これは機能する純粋なCSSソリューションです。

<style>
  span {
    display: inline;
  }
  span:before {
    content: "\a ";
    white-space: pre;
  }
</style>
<p>
  First line of text. <span>Next line.</span>
</p>

下のボタンをクリックできるようにするため、このアプローチのバリエーションが複数行のinput type='text', wrapping the input, and then laying the text over it with a wrapper div . That also requires pointer-events:none; `に役立つことがわかりました:before
エリックリース

10
<pre> <---------------------------------------
lorem ipsum
lorem ipsum
lorem ipsum
lorem ipsum
lorem ipsum
</pre> <--------------------------------------

または

<div style="white-space:pre">  <-----------------------------------
lorem ipsum
lorem ipsum
lorem ipsum
lorem ipsum
lorem ipsum
</div>                         <-----------------------------------

ソース:https : //stackoverflow.com/a/36191199/2377343


9

要素に改行を入れるには、次のように割り当てます。

display:block;

ブロックレベル要素の後の非浮動要素は次の行に表示されます。<p>や<div>などの多くの要素はすでにブロックレベルの要素なので、そのまま使用できます。

しかし、これは知っておくと良いことですが、これはコンテンツのコンテキストにより大きく依存します。あなたの例では、改行を強制するためにCSSを使用したくないでしょう。意味的には、pタグが表示するテキストに最も適切であるため、<br />が適切です。CSSをハングアップさせるだけのマークアップを追加する必要はありません。技術的にはそうではありません正確に段落が、ない<挨拶>タグがありませんので、あなたが持っているものを使用します。HTMLとよくあなたのコンテンツを記述する方法がより重要である-あなたが持っていることの後に、その後それはかなり見えるようにする方法を見つけ出します。


1
ただし、これによりコンテナーの全幅になります。これは、不要な副作用になる可能性があります(特に、アイテムがアンカー/リンクの場合)。
NickG

はい、幅を設定しない限り、デフォルトでブロックレベルの要素は全幅を使用します。コンテキストについての私のパラグラフを読んでください。デザインに基づいてHTMLを選択するのではなく、セマンティックコンテキストの観点から考えると、通常、このような問題に遭遇するのを防ぐのに役立ちます。
構文エラー

1
多くの場合、<br>タグを回避する必要がある理由は、セマンティックよりも技術的です。<br>タグはスタンドアロンであり、ページのレンダリング時に前の要素が存在するかどうかわからないため、必ずしも使用できるとは限らないため、空白行は必要ない場合があります。縦向きのメニューにある<a>リンクのリストを考えてみてください。すべてを1行にまとめたいが、サーバー側のルールのためにどのリンクが非表示になるかわからないため、<br>は使用できません。<br>が使用されている場合、リンクを非表示にすると、空白行が表示されます。
NickG

1
..そのため、多くの場合、<ul>リストを使用して箇条書きを非表示にしますが、これはかなりハックです。「常に自分のラインでレンダリングする」とだけ言っているCSSルールがあればもっと良いでしょう。
NickG

1
しかし、最初のコメントで述べたように、要素が全幅になるという望ましくない副作用があります:)全行幅ではなく、新しい行に項目が必要です。アイテムがページの左端のリンクである場合は、画面の右端をクリックしてもリンク先をたどります。
NickG

8

ここに悪い質問に対する悪い解決策がありますが、文字通り概要に出会うものです:

p {
    width : 12ex;
}

p:before {
    content: ".";
    float: right;
    padding-left: 6ex;
    visibility: hidden;
}

1
タイプミスまたは何をすexべきですか?pそして、eキーボードの近くには、それは私が求めている理由ですされていないこと
MMachinegun


1
悪いかどうか、これは実際にはかなり賢いです。
ジョナサンデュメイン

5

リンク一覧

その他の回答は、状況に応じて、改行を追加するいくつかの良い方法を提供します。ただし、:afterセレクターは、リンクのリストに対するCSS制御のためにこれを行うためのより良い方法の1つであることに注意してください。、下記の理由により(および同様のもの)。

目次を想定した例を次に示します。

<style type="text/css">
    .toc a:after{ content: "\a"; white-space: pre; }
</style>

<span class="toc">
    <a href="#a1">Item A1</a> <a href="#a2">Item A2</a>
    <a href="#b1">Item B1</a> <a href="#b2">Item B2</a>
</span>

そして、これがSimon_Weaverのテクニックです。これはよりシンプルで互換性があります。それはスタイルとコンテンツをそれほど分離せず、より多くのコードを必要とし、事実の後に改行を追加したい場合があるかもしれません。ただし、特に古いIEの場合は、依然として優れたソリューションです。

<style type="text/css">
    .toc br{ display: none; } /* comment out for horizontal links */
</style>

<span class="toc">
    <a href="#a1">Item A1</a><br/> <a href="#a2">Item A2</a><br/>
    <a href="#b1">Item B1</a><br/> <a href="#b2">Item B2</a><br/>
</span>

上記のソリューションの利点に注意してください。

  • HTMLの空白に関係なく、出力は同じです(vs. pre
  • 要素に余分なパディングは追加されません(NickGの display:blockコメントを)
  • スタイルを変更するためにすべてのHTMLファイルにアクセスすることなく、いくつかの共有CSSを使用して、リンクの水平リストと垂直リストを簡単に切り替えることができます。
  • いいえfloatまたはclear周囲のコンテンツに影響するスタイル
  • スタイルはコンテンツとは別です(<br/>またはpreハードコードされた改行付き)
  • これは、ルーズリンクでも使用できます。 a.toc:after、および<a class="toc">
  • 複数の区切りを追加したり、プレフィックス/サフィックステキストを追加することもできます

4

多分誰かが私と同じ問題を抱えているでしょう:

と一緒に要素display: flexを使用していたため、使用する必要がありましたflex-direction: column


4

設定brにタグをdisplay: noneと便利ですが、WordsRunTogetherになってしまう可能性があります。代わりに、次のように、スペース文字に置き換える方が便利だと思います。

HTML:

<h1>
    Breaking<br />News:<br />BR<br />Considered<br />Harmful!
</h1>

CSS:

@media (min-device-width: 1281px){
    h1 br {content: ' ';}
    h1 br:after {content: ' ';}
}

2
また、水平に移動するときに単語が一緒に実行brdisplay: inline-block; width: 1em;れないようにする設定を検討することもできます。
Beejor

1
私はあなたの提案が好きです。次回これに遭遇したら、それを試します。
ブライアン


2

たとえば、多くのパディングを追加して、テキストを強制的に新しい行に分割できます。

p{
    padding-right: 50%;
}

レスポンシブデザインの場合、テキストを分割するために必要な特定の幅の範囲内でのみ問題なく機能しました。


1
いいアイデアに聞こえますが、パディングを増やすと、オブジェクトの全体的な幅も増えます。そして、特にレスポンシブなページの場合、それはマイナスの影響を与える可能性があります。
itols 2015年

1

私は非常にシンプルなソリューションが好きです、これがもう1つあります

<p>hello <span>How are you</span></p>

とCSS

p {
 display: flex;
 flex-direction: column;
}

1

overflow-wrap:break-word;を使用します。お気に入り :

.yourelement{
overflow-wrap: break-word;
}

1

内でコンテンツを宣言する必要があります<span class="class_name"></span>。その後、行は中断されます。

\A 改行文字を意味します。

.class_name::after {
  content: "\A";
  white-space: pre;
}

0

ビンセントロバートとジョーイアダムスの両方の回答が有効です。ただし、マークアップを変更したくない場合は、<br /> JavaScriptを使用して。

マークアップを変更せずにCSSでそれを行う方法はありません。


それは正確ではありません。:afterそれ:beforeを使用したり、実行したりできます。
Artur Bodera

0

私の場合、入力ボタンの前に改行を入れる必要がありました。
次のスタイルをボタンに適用しましたが、うまくいきました。

clear:both;

0

これが誰かを助ける場合...

あなたはこれを行うことができます:

<p>This is an <a class="on-new-line">inline link</a>?</p>

このCSSで:

a.on-new-line:before { 
  content: '&nbsp;'; 
  font-size:0; 
  display:block;
  line-height:0;
}

または.on-new-line:before {content: ""; display: block;}
meuwka

0

&nbsp;スペースの代わりに使用すると、改行が防止されます。

<span>I&nbsp;DONT&nbsp;WANT&nbsp;TO&nbsp;BREAK&nbsp;THIS&nbsp;LINE&nbsp;UP, but this text can be on any line.</span>


0

ブレークポイントは常に改行されるため、ブレークポイントを使用したくないと思います。あれは正しいですか?もしそうなら<br />、あなたのテキストにブレークポイントを追加するのはどう<br class="hidebreak"/>ですか、それからあなたにそれを非表示にするためにブレークしたいサイズのすぐ上のメディアクエリを使用するようなクラスをそれに与えます<br />特定の幅でブレークするが、その幅より上にインラインのままであるようにます。

HTML:

<p>
The below line breaks at 766px.
</p>

<p>
 This is the line of text<br class="hidebreak"> I want to break.
</p>

CSS:

@media (min-width: 767px) {
  br.hidebreak {display:none;}
}

https://jsfiddle.net/517Design/o71yw5vd/


Simon_Weaverが私のような回答を投稿したことに気づきました。申し訳ありませんが、サイモンはあなたの応答を盗用しようとしていませんでした。私が投稿する前にすべての回答を読んだわけではないので、あなたの回答に気づかなかった。私の悪い...教訓..私は将来私のものを投稿する前に他の答えを読みます。
クランキット

心配ない!しかし、あなたは私に詩を書かなければなりません。w3schools.com/tags/tag_br.asp から"Tip: The <br> tag is useful for writing addresses or poems."
Simon_Weaver

0

コードは

<div class="text-class"><span>hello</span><span>How are you</span></div>

CSSは

.text-class {
     display: flex;
     justify-content: flex-start;
     flex-direction: column;
     align-items: center;
 }

-1

しないでください。強制改行が必要な場合は、改行してください。


3
+1はい。ただし、新しい行が純粋にプレゼンテーション用である場合display: block;
Web_Designer

21
この回答が賛成票を獲得した理由がわかりません。ハード改行を使用できる場合は、この質問を見ていません。
Trliner
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.