Làm cách nào để ngắt dòng từ css mà không cần sử dụng <br />?


398

đầu ra:

xin chào
Bạn khỏe không

mã:

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

Làm thế nào để đạt được cùng một đầu ra mà không cần <br>?

Câu trả lời:


385

Không thể có cùng cấu trúc HTML, bạn phải có một cái gì đó để phân biệt giữa HelloHow are you.

Tôi đề nghị sử dụng spans mà sau đó bạn sẽ hiển thị dưới dạng các khối (giống như <div>thực tế).

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


37
cũng lưu ý có bao nhiêu đánh dấu bổ sung - <br />yếu tố tồn tại vì một lý do rất tốt. Nếu bạn muốn ngắt dòng vì chúng là các đoạn riêng biệt, thì chỉ cần đánh dấu chúng là các đoạn riêng biệt.
Rowland Shaw

8
Bạn có thể cần các dòng có cấu trúc mà không thực sự sử dụng các đoạn văn. Để đánh dấu một bài thơ, một bài hát hoặc một địa chỉ chẳng hạn
Vincent Robert

2
@VincentRobert Đúng, nhưng một bài thơ là ví dụ điển hình cho khi nào <br>là đánh dấu chính xác. Khoảng cách cho một bài thơ sẽ là sai.
Alan H.

8
Lưu ý rằng việc chỉ định hiển thị: chặn cho một phần tử sẽ buộc ngắt dòng trước và sau, và do đó không hoàn toàn giống như ngắt một dòng.
jerseyboy

17
Chắc chắn sử dụng các yếu tố <p>. Phần tử <span> KHÔNG nên được hiển thị trong khối: khối, toàn bộ điểm của <span> là nội tuyến. Tôi sẽ làm theo cách này: <div> <p> xin chào </ p> <p> Bạn thế nào </ p> </ div>. Không yêu cầu CSS.
Miles

353

Bạn có thể sử dụng white-space: pre;để làm cho các yếu tố hoạt động như thế <pre>, mà bảo tồn các dòng mới. Thí dụ:

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

Lưu ý cho IE rằng điều này chỉ hoạt động trong IE8 +.


133
thường tốt hơn prepre-line, cho phép gói.
Alan H.

14
Tìm hiểu thêm về sự khác biệt giữa tiền tuyến và tiền gói tại developer.mozilla.org/en-US/docs/Web/CSS/white-space
patrick

1
Tôi thích tiền tố trong trường hợp của mình, vì tôi cũng có thể sử dụng tràn văn bản
Greg

Lưu ý rằng điều này sẽ không hoạt động với phản ứng vì văn bản cuối cùng được gói lại và sẽ được đặt trên cùng một dòng, điều này sẽ không kích hoạt white-spacequy tắc CSS.
Vadorequest

119

Sử dụng <br/>như bình thường, nhưng ẩn nó display: nonekhi bạn không muốn.

Tôi hy vọng hầu hết mọi người tìm thấy câu hỏi này muốn sử dụng thiết kế css / responsive để quyết định xem có ngắt dòng xuất hiện ở một nơi cụ thể hay không. (và không có bất cứ điều gì cá nhân chống lại <br/>)

Mặc dù không rõ ràng ngay lập tức, nhưng bạn thực sự có thể áp dụng display:nonecho một <br/>thẻ để ẩn nó, điều này cho phép sử dụng các truy vấn phương tiện song song với các thẻ BR ngữ nghĩa.

 <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)
    }
 }

Điều này rất hữu ích trong thiết kế đáp ứng khi bạn cần buộc văn bản thành hai dòng tại một điểm ngắt chính xác.

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


5
Simon, bạn đang chú ý - ví dụ bạn đặt tên là lý do chính xác tôi đã nghiên cứu câu hỏi này và display: nonegiải pháp cho đến nay là thích hợp và hữu ích nhất.
abbottjam

8
Lưu ý rằng đối với các trường hợp nó sẽ khiến các từ chạy cùng nhau, bạn có thể sử dụng từ nào display: inline-block; width: 1em;đó thay vì none.
Beejor

2
Bạn thậm chí có thể áp dụng một lớp học <br class='foo'>nếu bạn cần kiểm soát nhiều hơn nhưng đừng quá điên rồ!
Simon_Weaver

Một câu "tại sao tôi không nghĩ về điều này?!" câu trả lời. <br/>là tuyệt vời ở những gì nó làm; Không cần phải phát minh lại bánh xe. Cảm ơn!
rinogo

Khái niệm tương tự có thể được áp dụng cho bố cục hộp flex: stackoverflow.com/questions/29732575/
triệt

106

Có một số tùy chọn để xác định việc xử lý khoảng trắng và ngắt dòng. Nếu một người có thể đặt nội dung vào ví dụ như một <p>thẻ, thì khá dễ dàng để có được bất cứ thứ gì họ muốn.

Để bảo toàn ngắt dòng nhưng không sử dụng khoảng trắng, hãy sử dụng pre-line(không pre) như trong:

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

<p>hello
How are you</p>

Nếu muốn có một hành vi khác, hãy chọn một trong những hành vi này (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 */

NGUỒN: Trường W3


4
hoàn hảo. nên là câu trả lời được chọn
Ben Lin

1
Tôi tin rằng đây là những gì OP đang tìm kiếm.
John Sardinha

64

Lệnh "\ a" trong CSS tạo ra lợi nhuận vận chuyển. Đây là CSS, không phải HTML, vì vậy nó sẽ gần hơn với những gì bạn muốn: không đánh dấu thêm .

Trong một blockquote, ví dụ bên dưới hiển thị cả tiêu đề và liên kết nguồn và phân tách hai cái bằng trả về vận chuyển ( "\a"):

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

Fancy, nhưng hoàn toàn không cần thiết cho câu hỏi là gì.
YePhIcK

15
+1 vì chỉ CSS và không khuyến nghị sử dụng thẻ pre, br cũng như không thay đổi chế độ hiển thị thành chặn (điều này thêm hành vi khác nhau, có thể bị phá vỡ nếu cha mẹ đang ở trong display:flexvà do đó là một hack trong bối cảnh này). Nó không lạ mắt, thực sự, chỉ là một kỹ thuật hiện đại. Nếu bạn muốn đánh dấu chính xác giống nhau, nhưng thực sự phản ứng khác nhau đó là cách để đi.
renoirb

Ý tưởng tuyệt vời. Lưu ý "- không sử dụng các trích dẫn đơn giản 'vì bạn muốn cho phép \aphân tích cú pháp dưới dạng một ký tự đặc biệt.
Hafenkranich

2
tôi muốn cho +1 nhưng nó không hoạt động với tôi trên chrome 55
pery mimon

4
Tôi đã bình chọn điều này nếu có một số HTML và có thể là một Fiddle để giúp hình dung những gì bạn đang làm.
Giăng

29

Tại CSS sử dụng mã

p {
    white-space: pre-line;
}

Với mã này css, mỗi lần nhập bên trong thẻ P sẽ là một dòng ngắt tại html.


1
Điều này thật đúng với gì mà tôi đã tìm kiếm! Hoạt động hoàn hảo cho nội dung yếu tố tạo ra từ JS (ví dụ JSON kết quả từ truy vấn AJAX, góc-schema-hình thức, vv) mà được thông qua thông qua thoát / sanitization (ví dụ AngularJS bình thường thoát hành vi khi không sử dụng ngBindHtml)
Stefan Dragnev

28

Dựa trên những gì đã nói trước đây, đây là một giải pháp CSS thuần túy hoạt động.

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

Tôi chỉ tìm thấy một biến thể của cách tiếp cận này là hữu ích cho các sự kiện con trỏ input type='text', wrapping the input, and then laying the text over it with a wrapper div nhiều dòng . That also requires : none; `trên :befoređể vẫn có thể nhấp vào nút bên dưới.
Eric thuê

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

HOẶC LÀ

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

nguồn: https://stackoverflow.com/a/36191199/2377343


9

Để làm cho một phần tử có một ngắt dòng sau đó, gán nó:

display:block;

Các phần tử không nổi sau phần tử mức khối sẽ xuất hiện trên dòng tiếp theo. Nhiều phần tử, chẳng hạn như <p> và <div> đã là các phần tử mức khối để bạn chỉ có thể sử dụng các phần tử đó.

Nhưng trong khi điều này là tốt để biết, điều này thực sự phụ thuộc nhiều hơn vào bối cảnh nội dung của bạn. Trong ví dụ của bạn, bạn sẽ không muốn sử dụng CSS để buộc ngắt dòng. <br /> là phù hợp vì về mặt ngữ nghĩa, thẻ p là phù hợp nhất cho văn bản bạn đang hiển thị. Thêm đánh dấu chỉ để treo CSS nó là không cần thiết. Về mặt kỹ thuật, đây không chính xác là một đoạn văn, nhưng không có thẻ <hello>, vì vậy hãy sử dụng những gì bạn có. Mô tả nội dung của bạn tốt với HTMl là cách quan trọng hơn - sau khi bạn có được điều đó thì hãy tìm ra cách làm cho nó trông thật đẹp.


1
Nhưng điều này làm cho nó có chiều rộng đầy đủ của container, có thể là một tác dụng phụ không mong muốn (đặc biệt nếu vật phẩm là neo / liên kết).
NickG

Có, theo mặc định, các thành phần cấp khối chiếm hết chiều rộng trừ khi bạn đặt chiều rộng. Đọc đoạn văn của tôi về bối cảnh - suy nghĩ theo ngữ cảnh ngữ nghĩa thay vì chọn html dựa trên thiết kế của bạn thường giúp bạn không gặp phải các vấn đề như vậy.
Lỗi cú pháp

1
Thông thường các lý do <br> thẻ cần phải tránh là kỹ thuật hơn ngữ nghĩa. Thẻ <br> là độc lập và bạn không nhất thiết phải sử dụng chúng vì bạn không biết liệu các phần tử phía trước có tồn tại vào thời điểm bạn kết xuất trang hay không, vì vậy bạn có thể không muốn các dòng trống. Xem xét danh sách <a> liên kết trên menu dọc nơi bạn muốn tất cả chúng trên dòng riêng của mình, nhưng không thể sử dụng <br> vì bạn không biết liên kết nào sẽ bị ẩn do quy tắc phía máy chủ. Ẩn các liên kết sẽ gây ra các dòng trống nếu <br> được sử dụng.
NickG

1
.. Vì lý do đó, mọi người thường sử dụng danh sách <ul> và sau đó giấu đạn, nhưng điều đó khá khó khăn. Sẽ tốt hơn nếu có một quy tắc css chỉ nói "luôn hiển thị trên dòng riêng".
NickG

1
Nhưng như tôi đã nói trong nhận xét đầu tiên của mình - điều đó có tác dụng phụ không mong muốn của các yếu tố là chiều rộng đầy đủ :) Tôi chỉ cần các mục trên một dòng mới, mà không có chiều rộng đầy đủ. Nếu mục là một liên kết ở phía bên trái của trang, điều đó có nghĩa là các nhấp chuột ở phía bên phải của màn hình theo liên kết.
NickG

8

Đây là một giải pháp tồi cho một câu hỏi tồi, nhưng một câu trả lời đúng theo nghĩa đen:

p {
    width : 12ex;
}

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

1
lỗi đánh máy hay exlà gì? pekhông phải là gần trên bàn phím, đó là lý do tại sao tôi hỏi
MMachinegun


1
Xấu hay không, điều này thực sự khá thông minh.
Jonathan Dumaine

5

Đối với một danh sách các liên kết

Các câu trả lời khác cung cấp một số cách tốt để thêm ngắt dòng, tùy thuộc vào tình huống. Nhưng cần lưu ý rằng :afterbộ chọn là một trong những cách tốt hơn để làm điều này để kiểm soát CSS đối với danh sách các liên kết (và những thứ tương tự), vì những lý do được ghi chú dưới đây.

Đây là một ví dụ, giả sử một bảng nội dung:

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

Và đây là kỹ thuật của Simon_Weaver, đơn giản hơn và tương thích hơn. Nó không tách biệt phong cách và nội dung nhiều, đòi hỏi nhiều mã hơn và có thể có trường hợp bạn muốn thêm dấu ngắt sau thực tế. Vẫn là một giải pháp tuyệt vời, đặc biệt là đối với IE cũ.

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

Lưu ý ưu điểm của các giải pháp trên:

  • Bất kể khoảng trắng trong HTML, đầu ra đều giống nhau (so với pre)
  • Không có phần đệm thêm nào được thêm vào các yếu tố (xem display:blockbình luận của NickG )
  • Bạn có thể dễ dàng chuyển đổi giữa danh sách liên kết ngang và dọc với một số CSS được chia sẻ mà không cần truy cập vào mọi tệp HTML để thay đổi kiểu
  • Không floathoặc clearphong cách ảnh hưởng đến nội dung xung quanh
  • Phong cách tách biệt với nội dung (so với <br/>hoặc prevới các ngắt mã hóa cứng)
  • Điều này cũng có thể làm việc cho các liên kết lỏng bằng cách sử dụng a.toc:after<a class="toc">
  • Bạn có thể thêm nhiều dấu ngắt và thậm chí cả văn bản tiền tố / hậu tố

4

Có lẽ ai đó sẽ có cùng một vấn đề như tôi:

Tôi đã ở trong một yếu tố với display: flexvì vậy tôi phải sử dụng flex-direction: column.


4

Đặt brthẻ thành display: nonehữu ích, nhưng sau đó bạn có thể kết thúc bằng WordsRunTogether. Tôi đã thấy hữu ích hơn khi thay thế nó bằng một nhân vật không gian, như vậy:

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
Bạn cũng có thể xem xét cài đặt brđể display: inline-block; width: 1em;ngăn các từ chạy cùng nhau khi đi ngang.
Beejor

1
Tôi thích đề nghị của bạn hơn. Tôi sẽ thử điều đó vào lần tới khi tôi gặp điều này.
Bryan

3

Làm thế nào về <pre>thẻ?

nguồn: http://www.w3schools.com/tags/tag_pre.asp


Oh! Tôi hiểu ý bạn là gì. Sau đó, bạn sử dụng khoảng trắng trong của bạn <pre>để nó phá vỡ dòng. Nếu bạn muốn có khoảng trắng thường xuyên thì sao?
Micha Mazaheri

Thẻ trước sẽ diễn giải lợi nhuận vận chuyển được thực hiện trong. Vì vậy, nếu bạn ngắt dòng giữa 'xin chào' và 'bạn thế nào' trong thẻ trước, giờ nghỉ sẽ được kết xuất
Godineau Félicie

2

Bạn có thể thêm rất nhiều phần đệm và buộc văn bản được chia thành dòng mới, ví dụ

p{
    padding-right: 50%;
}

Làm việc tốt với tôi trong một tình huống với thiết kế đáp ứng, trong đó chỉ trong một phạm vi chiều rộng nhất định, văn bản cần được phân chia.


1
Âm thanh là một ý tưởng hay nhưng tăng phần đệm cũng sẽ tăng chiều rộng tổng thể của một đối tượng. Và điều đó có thể có tác động tiêu cực, đặc biệt trong trường hợp trang phản hồi.
itols

1

Tôi thích các giải pháp rất đơn giản, đây là một giải pháp nữa

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

và css

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

1

Sử dụng overflow-quấn: break-word; giống :

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

1

Bạn cần khai báo nội dung bên trong <span class="class_name"></span>. Sau đó, dòng sẽ bị phá vỡ.

\A có nghĩa là ký tự nguồn cấp dữ liệu.

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

0

Cả hai câu trả lời của Vincent Robert và Joey Adams đều hợp lệ. Tuy nhiên, nếu bạn không muốn thay đổi đánh dấu, bạn chỉ cần chèn một<br /> javascript bằng cách sử dụng.

Không có cách nào để làm điều đó trong CSS mà không thay đổi đánh dấu.


Điều đó không chính xác. Người ta có thể sử dụng :afterhoặc :befoređể làm điều đó.
Artur Bodera

0

Trong trường hợp của tôi, tôi cần một nút đầu vào để ngắt dòng trước nó.
Tôi đã áp dụng kiểu sau cho nút và nó hoạt động:

clear:both;

0

Trong trường hợp điều này giúp ai đó ...

Bạn có thể làm điều này:

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

Với css này:

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

hoặc.on-new-line:before {content: ""; display: block;}
meuwka

0

Sử dụng &nbsp;thay vì không gian sẽ ngăn chặn một phá vỡ.

<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

Điều này hoạt động trong Chrome:

p::after {
    content: "-";
    color: transparent;
    display: block;
}

0

Tôi đoán bạn không muốn sử dụng điểm dừng vì nó sẽ luôn phá vỡ dòng. Đúng không? Nếu vậy, làm thế nào về việc thêm một điểm dừng <br />trong văn bản của bạn, sau đó cung cấp cho nó một lớp giống như <br class="hidebreak"/>sau đó sử dụng truy vấn phương tiện ngay trên kích thước bạn muốn nó phá vỡ để ẩn <br />để nó phá vỡ ở một chiều rộng cụ thể nhưng vẫn nằm trên chiều rộng đó.

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/517Thiết kế / o71yw5vd /


Tôi chỉ nhận thấy rằng Simon_Weaver đã đăng một câu trả lời tương tự như của tôi. Xin lỗi Simon, đã không cố gắng ăn cắp phản ứng của bạn. Tôi đã không đọc tất cả các câu trả lời trước khi tôi đăng bài của mình và do đó không nhận thấy câu trả lời của bạn. Bài học tồi ... của tôi đã học được .. Tôi sẽ đọc các câu trả lời khác trước khi đăng bài của tôi trong tương lai.
Krankit

Đừng lo lắng! Nhưng bạn phải viết cho tôi một bài thơ. Từ w3schools.com/tags/tag_br.asp "Tip: The <br> tag is useful for writing addresses or poems."
Simon_Weaver

0

Mã có thể là

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

CSS sẽ là

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

-1

Đừng. Nếu bạn muốn ngắt dòng cứng, sử dụng một.


3
+1 Có, nhưng nếu dòng mới hoàn toàn dành cho sử dụng thuyết trình display: block;.
Web_Designer

21
Tôi không hiểu tại sao câu trả lời này nhận được bất kỳ phiếu bầu nào. Nếu tôi có khả năng sử dụng ngắt dòng cứng, tôi sẽ không nhìn vào câu hỏi này.
xe điện
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.