如何在不使用<br />的情况下从CSS换行?


398

输出:

你好
你好吗

码:

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

没有相同的输出,如何实现<br>

Answers:


385

使用相同的HTML结构是不可能的,您必须有一些区别HelloHow are you

我建议使用spans,然后将其显示为块(就像<div>实际一样)。

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


37
还请注意还有多少额外的标记-该<br />元素存在的理由非常充分。如果由于它们是单独的段落而需要换行,则只需将它们标记为单独的段落即可。
罗兰·肖

8
您可能需要结构化的行而不实际使用段落。例如,标记一首诗,一首歌或一个地址
文森特·罗伯特

2
@VincentRobert对,但是一首诗是什么时候<br>正确标记的典型例子。一首诗的跨度将是“错误的”。
艾伦·H.

8
请注意,将display:block分配给元素将在换行前后强制换行,因此与换行完全不同。
jerseyboy

17
绝对使用<p>元素。不应将<span>元素设置为display:block,<span>的要点在于它是内联的。我会这样:<div> <p>你好</ p> <p>你好吗</ p> </ div>。没有需要的CSS。
英里

353

您可以white-space: pre;用来使元素的行为类似<pre>,从而保留换行符。例:

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

请注意IE,这仅适用于IE8 +。


133
往往比prepre-line,它允许包装。
艾伦·H.

14
有关预行和预包装之间的区别的更多信息,请访问developer.mozilla.org/en-US/docs/Web/CSS/white-space
patrick 2014年

1
我更喜欢pre,因为我也可以使用文本溢出
Greg

请注意,这不能与react一起使用,因为文本最终会被捆绑在一起,并且将放在同一行上,这不会触发white-spaceCSS规则。
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)
    }
 }

这在响应式设计中很有用,在该设计中,您需要在确切的时间点将文本强制分成两行。

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


5
Simon,您真不错—您提到的示例正是我研究此问​​题的确切原因,而该display: none解决方案是迄今为止最合适和最有用的解决方案。
abbottjam 2014年

8
请注意,在某些情况下会导致单词一起运行,您可以使用display: inline-block; width: 1em;代替none
Beejor

2
<br class='foo'>如果您需要更多控制权,也可以将课程应用于,但不要太着急!
Simon_Weaver

另一个“为什么我没想到呢?!” 回答。<br/>善于做事;无需重新发明轮子。谢谢!
rinogo

类似的概念可以应用于弹性盒布局:stackoverflow.com/questions/29732575/…–
Simon_Weaver

106

有几个选项可用于定义空白和换行符的处理。如果可以将内容放入<p>标签中,则很容易获得所需的内容。

为了保留换行符,但不保留空格,请使用pre-line(not 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学校


4
完善。应该是选定的答案。
本林

1
我相信这就是OP正在寻找的东西。
约翰·萨丁尼亚

64

CSS中的“ \ a”命令生成回车符。这是CSS,而不是HTML,因此它将更接近您想要的:没有额外的标记

在blockquote中,下面的示例显示标题和源链接,并用回车符("\a")分隔两者:

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

花哨的,但根本不需要这个问题。
YePhIcK 2014年

15
+1是因为其仅CSS,并且不建议使用pre,br标签,也不建议将显示模式更改为block(这会增加不同的行为,如果父级在其中,则可能会中断display:flex,因此在这种情况下是hack)。它并不花哨,实际上只是一种现代技术。如果您希望使用完全相同的标记,但实际上要做出不同的反应,那么这就是方法。
renoirb 2014年

卓见。注意"–请勿使用简单的引号,'因为您希望允许将\a其解析为特殊字符。
Hafenkranich

2
我想给+1,但不适用于Chrome 55
Pery mimon

4
如果有一些HTML,也许还有一个Fiddle可以帮助您可视化您在做什么,那我会投票赞成。
约翰·

29

在CSS上使用代码

p {
    white-space: pre-line;
}

使用此代码css,P标记内的每个输入都将成为html的换行符。


1
这正是我想要的!非常适合从JS生成的元素内容(例如AJAX查询的JSON结果,angular-schema-form等)通过转义/消毒处理(例如,不使用ngBindHtml时正常的AngularJS转义行为)
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 指针事件很有帮助,因为: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强制换行。<br />是适当的,因为在语义上p标记最适合您显示的文本。仅仅为了将CSS挂起就不需要更多标记。从技术上讲,它不完全是一个段落,但是没有<greeting>标记,因此请使用已有的标记。用HTMl很好地描述您的内容更为重要-在拥有内容之后,弄清楚如何使其看起来更漂亮。


1
但这使它成为容器的整个宽度,这可能是有害的副作用(尤其是如果该项目是锚点/链接)。
NickG

是的,默认情况下,块级元素占用整个宽度,除非您设置宽度。阅读我关于上下文的段落-从语义上下文的角度进行思考,而不是根据设计来选择html,通常有助于防止您遇到类似的问题。
语法错误

1
通常,需要避免<br>标签的原因比语义上更具技术性。<br>标签是独立的,您不一定要使用它们,因为您不知道在呈现页面时前面的元素是否会存在,因此您可能不需要空白行。考虑一下垂直菜单上的<a>链接列表,您希望它们全部位于其自己的行上,但由于您不知道由于服务器端规则而隐藏了哪些链接,因此不能使用<br>。如果使用<br>,则隐藏链接将导致空白行。
NickG 2015年

1
出于这个原因,人们经常使用<ul>列表,然后隐藏项目符号,但这确实很棘手。如果有一个css规则只是说“总是在自己的行上渲染”,那会更好。
NickG 2015年

1
但是,正如我在第一条评论中所说的那样-元素全角会带来不良的副作用:)我只需要在新行中添加项目,而不必使它们全角。如果该项目是页面最左侧的链接,则意味着即使单击屏幕最右侧,也会跟随该链接。
NickG


5

有关链接列表

其他答案根据情况提供了一些添加换行符的好方法。但应注意的是,:after选择器是对链接列表进行CSS控制的更好方法之一出于以下原因(及类似内容)之一。

这是一个示例,假设有一个目录:

<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中的空格如何,输出都是相同的(与 pre
  • 没有向元素添加额外的填充(请参见NickG的 display:block注释)
  • 您可以使用一些共享的CSS轻松地在水平和垂直链接列表之间切换,而无需进入每个HTML文件进行样式更改
  • floatclear样式会影响周围的内容
  • 样式与内容是分开的(与<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
听起来不错,但增加填充也将增加对象的整体宽度。这可能会产生负面影响,特别是在响应页面的情况下。
itsols

1

我喜欢非常简单的解决方案,这里还有一个

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

和CSS

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

1

使用溢出包装:断字;喜欢 :

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


0

文森特·罗伯特(Vincent Robert)和乔伊·亚当斯(Joey Adams)的答案都是有效的。但是,如果您不想更改标记,则只需插入一个<br />使用javascript。

在CSS中没有更改标记就无法做到这一点。


那是不正确的。一个人可以使用:after:before这样做。
Artur Bodera 2012年

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 '19

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发布了与我相似的答案。抱歉,西蒙(Simon),并没有to窃您的回应。在发布我的答案之前,我没有阅读所有答案,因此也没有注意到您的答案。我的教训很糟糕。在以后发布我的课程之前,我会阅读其他答案。
肯尼特

别担心!但是你必须给我写一首诗。来自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 2012年

21
我不明白为什么这个答案获得了最多的支持。如果我有能力使用强行换行符,那么我不会考虑这个问题。
trliner 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.