html (+ css): biểu thị vị trí ưu tiên cho ngắt dòng


109

Giả sử tôi có văn bản này mà tôi muốn hiển thị trong một ô bảng HTML:

Honey Nut Cheerios, Wheat Chex, Grape-Nuts, Rice Krispies, Some random cereal with a very long name, Honey Bunches of Oats, Wheaties, Special K, Froot Loops, Apple Jacks

và tôi muốn dòng được ưu tiên ngắt sau một trong các dấu phẩy.

Có cách nào để yêu cầu trình kết xuất HTML thử ngắt tại một số điểm được chỉ định và làm điều đó trước khi cố gắng ngắt sau một trong các khoảng trắng mà không sử dụng các khoảng trắng không ngắt? Nếu tôi sử dụng khoảng trắng không ngắt thì nó làm cho chiều rộng lớn hơn vô điều kiện. Tôi muốn ngắt dòng xảy ra sau một trong các khoảng trắng, nếu thuật toán gói dòng đã thử nó với dấu phẩy trước và không thể làm cho dòng vừa khít.

Tôi đã thử gói các đoạn văn bản trong <span>các phần tử nhưng điều đó dường như không làm được gì hữu ích.

<html>
  <head>
      <style type="text/css">
        div.box { width: 180px; }
        table, table td { 
          border: 1px solid; 
          border-collapse: collapse; 
        }
      </style>
  </head>
  <body>
    <div class="box">
      <table>
      <tr>
          <td>lorem ipsum</td>
          <td>lorem ipsum</td>
          <td>lorem ipsum</td>
      </tr>
      <tr>
          <td>lorem ipsum</td>
          <td>
            <span>Honey Nut Cheerios,</span>
            <span>Wheat Chex,</span>
            <span>Grape-Nuts,</span>
            <span>Rice Krispies,</span>
            <span>Some random cereal with a very long name,</span>
            <span>Honey Bunches of Oats,</span>
            <span>Wheaties,</span>
            <span>Special K,</span>
            <span>Froot Loops,</span>
            <span>Apple Jacks</span>
          </td>
          <td>lorem ipsum</td>
      </tr>
      </table>
    </div>
  </body>
</html>

lưu ý: Có vẻ như hành vi CSS3text-wrap: avoid là những gì tôi muốn, nhưng tôi dường như không thể làm cho nó hoạt động.


bạn có thể sử dụng không gian không đứt đoạn bên trong các nhịp.
Gabriele Petrioli

3
Nhưng tôi không muốn sử dụng các khoảng trắng không ngắt. Tôi muốn sử dụng các khoảng trắng "không-muốn-phá-ở-đây-mà-tôi-sẽ-nếu-tôi-có-phải-", nhưng theo tôi biết, chúng tồn tại.
Jason S

@Jason .. tôi cảm thấy bạn .. nhưng nó không thể .. đã thêm một câu trả lời.
Gabriele Petrioli

drat, đó là những gì xảy ra khi các nhà khoa học máy tính viết các thuật toán kết xuất với đầu vào từ các nhà đánh máy.
Jason S

1
bạn nên chấp nhận câu trả lời từ @ EggertJóhannesson vì nó cung cấp một giải pháp tốt!
Gabriele Petrioli

Câu trả lời:


156

Bằng cách sử dụng

span.avoidwrap { display:inline-block; }

và gói văn bản tôi muốn giữ lại với nhau

<span class="avoidwrap"> Text </span>

nó sẽ quấn đầu tiên trong các khối ưu tiên và sau đó là các mảnh nhỏ hơn nếu cần.


16
Hoạt động tuyệt vời! Chỉ cần một lưu ý bổ sung: khoảng trắng ở đầu và cuối của khối nội dòng bị bỏ qua, do đó, để phân tách văn bản trong các khối theo khoảng trắng, bạn cần đặt nó giữa các khối nội dòng. Ví dụ: nếu các nhịp được tạo kiểu để trở thành các khối nội tuyến, thì <span>Hello </span><span> world</span>sẽ như Helloworldvậy và <span>Hello</span> <span>world</span>sẽ bình thường Hello world.
người dùng

2
<wbr> mang nhiều ngữ nghĩa hơn và để lại quyền kiểm soát trong trình duyệt, nói chung là một điều tốt. Trong trường hợp này, nó làm cho việc phá vỡ thời điểm quan trọng có thể xảy ra.
Lodewijk

Hoạt động tốt - khi điều quan trọng là các ký tự như "-" không ngắt. Ví dụ: Perikles <span class = "seekwrap"> (um & nbsp; 500-429 & nbsp; v.Chr.) </span>
Sarah Trees

10
@Lodewijk: <wbr>không chỉ ra nơi ưu tiên để ngắt dòng, nhưng là nơi có thể .
Dan Dascalescu,

1
Lưu ý rằng kỹ thuật này cũng hoạt động đối với các điểm lồng nhau <span>, vì vậy bạn có thể (trên thực tế) chỉ định một hệ thống phân cấp các điểm ngắt được ưu tiên.
Michael Dyck

24

Có một giải pháp RWD rất gọn gàng từ Dan Mall mà tôi thích hơn. Tôi sẽ thêm nó vào đây vì một số câu hỏi khác liên quan đến ngắt dòng đáp ứng được đánh dấu là trùng lặp với câu này.
Trong trường hợp của bạn, bạn có:

<span>Honey Nut Cheerios, <br class="rwd-break">Wheat Chex, etc.</span>

Và một dòng CSS trong truy vấn phương tiện của bạn:

@media screen and (min-width: 768px) {
    .rwd-break { display: none; }
}

7

Một câu trả lời dễ dàng là sử dụng ký tự khoảng trắng 0-width.&#8203; Nó được sử dụng để tạo dấu cách bên trong các từ tại các điểm cụ thể .

đối lập hoàn toàn với dấu cách không ngắt &nbsp; (tốt, thực ra là từ nối &#8288; ) ( word-joiner là phiên bản có độ rộng bằng không của khoảng trắng không ngắt )

(cũng có các mã không ngắt khác như dấu gạch nối không ngắt &#8209; ) (đây là câu trả lời mở rộng về các 'biến thể' khác nhau của nbsp )

Nếu bạn muốn có một giải pháp chỉ HTML (không có CSS ​​/ JS), bạn có thể sử dụng sự kết hợp của khoảng trắng zero-width và khoảng trắng không ngắt , tuy nhiên điều này sẽ thực sự lộn xộn và việc viết một phiên bản có thể đọc được cần một chút nỗ lực .

ctrl+ c, ctrl+ vgiúp

thí dụ:

   Honey&nbsp;Nut&nbsp;Cheerios,<!---->&#8203;<!--
-->Wheat&nbsp;Chex,<!---->&#8203;<!--
-->Grape&#8209;Nuts,<!---->&#8203;<!--
-->Rice&nbsp;Krispies,<!---->&#8203;<!--
-->Some&nbsp;random&nbsp;cereal&nbsp;with&nbsp;a&nbsp;very&nbsp;long&nbsp;name,<!---->&#8203;<!--
-->Honey&nbsp;Bunches&nbsp;of&nbsp;Oats,<!---->&#8203;<!--
-->Wheaties,<!---->&#8203;<!--
-->Special&nbsp;K,<!---->&#8203;<!--
-->Froot&nbsp;Loops,<!---->&#8203;<!--
-->Apple&nbsp;Jacks

không đọc được? đây là cùng một HTML không có thẻ nhận xét:

   Honey&nbsp;Nut&nbsp;Cheerios,&#8203;Wheat&nbsp;Chex,&#8203;Grape&#8209;Nuts,&#8203;Rice&nbsp;Krispies,&#8203;Some&nbsp;random&nbsp;cereal&nbsp;with&nbsp;a&nbsp;very&nbsp;long&nbsp;name,&#8203;Honey&nbsp;Bunches&nbsp;of&nbsp;Oats,&#8203;Wheaties,&#8203;Special&nbsp;K,&#8203;Froot&nbsp;Loops,&#8203;Apple&nbsp;Jacks

Tuy nhiên, vì kết xuất html email không được chuẩn hóa hoàn toàn, nên nó tốt cho loại hình sử dụng đó vì giải pháp này không sử dụng CSS / JS

Ngoài ra, nếu bạn sử dụng điều này kết hợp với bất kỳ <span>giải pháp dựa trên cơ sở nào, bạn sẽ có toàn quyền kiểm soát thuật toán ngắt dòng

(ghi chú biên tập :)

Vấn đề duy nhất mà tôi có thể thấy bạn gặp phải là nếu bạn muốn thay đổi động các điểm ngắt ưu tiên. Điều này sẽ yêu cầu thao tác JS liên tục đối với từng khoảng kích thước tương ứng và phải xử lý các thực thể HTML đó trong văn bản.


1
hack span là gì?
Jason S

Các câu trả lời khác sử dụng thẻ span.

Tôi cũng muốn lưu ý rằng mặc dù giải pháp này có vẻ không phải là đơn giản nhất, nhưng nó là đáng tin cậy nhất, bởi vì các thực thể đó không và không nên thay đổi biểu diễn ngữ nghĩa thường xuyên trên các trình duyệt, trình phân tích email hoặc bất kỳ trình phân tích cú pháp HTML nào khác.

3

Câu trả lời là không ( Bạn không thể thay đổi thuật toán ngắt dòng được sử dụng ).

Nhưng có một số cách giải quyết ( cách tốt nhất là câu trả lời được chấp nhận )

Bạn có thể đi gần bằng dấu cách không ngắt &nbsp;nhưng chỉ giữa các từ đi liền nhau ( những từ bạn có trong khoảng cách, nhưng không phải sau dấu phẩy ) hoặc bạn có thể sử dụng white-space:nowrapnhư @Marcel đã đề cập.

Cả hai giải pháp đều làm điều tương tự và cả hai sẽ không phá vỡ một nhóm từ nếu nó không phù hợp với chính nó.


argh. :-( rằng stinks, nó có nghĩa là tôi hoặc là phải sống với nó, hoặc tôi cần phải cố gắng phát hiện đường dây dài một mình trong một nỗ lực để đánh bại các thuật toán dòng phá.
Jason S

Tôi đã chỉnh sửa câu trả lời của bạn để cung cấp liên kết đến giải pháp, vì tôi gần như không đọc tiếp vì cách diễn đạt dòng đầu tiên của bạn.
arootbeer

@arootbeer: Tôi ủng hộ chỉnh sửa của bạn, nhưng Gaby đã hoàn nguyên nó. Gaby: tại sao? Bạn có muốn đánh lừa người dùng?
Dan Dascalescu,

@DanDascalescu, tất cả câu trả lời là SO được thay đổi để trỏ đến câu trả lời được chấp nhận trong cùng một trang? Câu trả lời của tôi có 1 ( tổng ) phiếu bầu và có một câu trả lời được chấp nhận với 48 phiếu bầu. Tôi khá chắc chắn rằng cái được chấp nhận là cái được chú ý ( và đúng như vậy ). Bên cạnh đó, tôi khẳng định rằng không có cách nào để thay đổi các thuật toán bẻ được sử dụng ( như OP yêu cầu )
Gabriele Petrioli

1
kiểm tra giải pháp của tôi sử dụng logic của riêng bạn chống lại bạn. kết hợp điều đó với bất kỳ giải pháp nhịp nào, sau đó bạn có toàn quyền kiểm soát thuật toán ngắt dòng

2

Với đánh dấu của bạn ở trên sử dụng span { white-space:nowrap }. Nó thực sự tốt như bạn có thể mong đợi.


Cảm ơn, nhưng điều đó sẽ không hoạt động vì về cơ bản nó sẽ dịch các khoảng trắng trong một spanphần tử sang &nbsp;và giữ cho các khoảng trắng không bị phá vỡ. Tôi chỉ muốn ngăn cản trình kết xuất xen vào giữa một trong các mục của tôi, nhưng nếu phải làm như vậy, tôi muốn nó làm như vậy.
Jason S

@Jason S: Tôi đã thêm các tùy chọn khác cho câu trả lời của mình.
Marcel

làm thế nào là &nbsp;<wbr>bất kỳ khác với một không gian? Từ những gì tôi có thể nói, các lựa chọn là một nhân vật nhất định cho phép ngắt hoặc không. Vì vậy, '-' và '' và &#8203;<wbr>&shy;tất cả phép nghỉ ngơi (in một phá vỡ gạch nối chỉ-on-gạch nối, không gian, không có gì, không có gì, và, tương ứng), trong khi đó &nbsp;thì không.
Jason S

@Jason S: Đã thêm cách sử dụng ví dụ.
Marcel

Tôi vừa thử nó, và nó dường như không được ưu tiên hơn khoảng trắng để ngắt dòng. Ưu tiên là những gì tôi cần. Nếu hành vi phá vỡ đối với một ký tự hoặc phần tử khác là có hoặc không, thì không có giải pháp nào cho vấn đề của tôi. Nếu có các ưu tiên ngắt dòng tương đối, thì tôi có thể có một giải pháp.
Jason S

0

Câu trả lời mới bây giờ chúng ta có HTML5:

HTML5 giới thiệu <wbr>thẻ. (Nó là viết tắt của Word Break Opportunity.)

Việc thêm dấu <wbr>cho trình duyệt ngắt ở đó trước bất kỳ nơi nào khác, vì vậy, thật dễ dàng khiến các từ bị ngắt sau dấu phẩy:

Honey Nut Cheerios,<wbr> Wheat Chex,<wbr> Grape-Nuts,<wbr> Rice Krispies,<wbr> Some random cereal with a very long name,<wbr> Honey Bunches of Oats,<wbr> Wheaties,<wbr> Special K,<wbr> Froot Loops,<wbr> Apple Jacks

Nó được hỗ trợ tất cả các trình duyệt chính của tôi ngoại trừ IE.


12
-1. Tại sao bạn không thử nghiệm trước khi tư vấn? Nó không hoạt động. <wbr>có mục đích khác. Chưa kể rằng câu trả lời này là một bản sao của một câu trả lời đã có từ lâu trước đó.
người dùng

1

13
<wbr>chỉ cần thiết lập một cơ hội nghỉ ngơi; nó không "yêu cầu trình duyệt phá vỡ ở đó trước khi bất kỳ nơi nào khác". Được sử dụng trước một khoảng trắng, nó thường vô dụng, vì khoảng trắng thường là cơ hội ngắt dòng.
Jukka K. Korpela

5
Điều này hoàn toàn không hoạt động, trong bất kỳ trình duyệt nào. Câu trả lời là sai: <wbr>không không ưu tiên ngắt dòng qua khoảng trắng bình thường. Vì vậy, gói chỉ xảy ra như bình thường trong ví dụ.
adrian

3
Để làm rõ, <wbr> nhằm báo hiệu "đây là nơi bạn có thể phá vỡ", khi vị trí đó sẽ được coi là bên trong một từ . Nó nói rằng "hãy coi vị trí giữa hai ký tự này như thể có một khoảng trống ở đó", chứ không phải "muốn phá vỡ ở đây". Nếu đã có khoảng trắng, <wbr> không có nghĩa.
Dấu chấm phẩy,

-1

Bạn chỉ có thể điều chỉnh cài đặt lề trong CSS (margin-right trong trường hợp này).

text {
    margin-right: 20%;
}

-3

Sử dụng <div>thay vì <span>hoặc chỉ định một lớp cho SPAN và cung cấp cho nó thuộc tính display: block .


-5

Có một yếu tố HTML cho ™ rằng: sự (nay là tiêu chuẩn hóa) <wbr>yếu tố .

Tôi khuyên bạn nên sử dụng nó. Nó có thể không hoạt động ở mọi nơi , nhưng đó là điều tốt nhất bạn có thể làm mà không cần trải qua vòng lặp.


3
-1: <wbr>là để đánh dấu điểm break tại từ rất lâu, nó không giải quyết vấn đề với ngắt dòng ưa thích
sử dụng

4
@ user3075942 Trích dẫn trực tiếp từ thông số kỹ thuật : “Phần wbrtử đại diện cho cơ hội ngắt dòng”. Đây chính xác là những gì OP yêu cầu. Ngừng phản đối mọi người dựa trên những gì bạn đọc trên wiki.
Mathias Bynens,

3
Vâng, cơ hội . Nhưng các trình duyệt đã có cơ hội để phá vỡ các khoảng trắng. Câu hỏi đặt ra là làm thế nào để thông báo cho trình duyệt biết những khoảng trống nào nó thích hợp để phá vỡ.
người dùng

1
… Và câu trả lời là sử dụng <wbr>.
Mathias Bynens

8
Không, đó không phải là câu trả lời. Nó không làm tăng khả năng sử dụng một điểm ngắt cụ thể đã có từ trước; nó chỉ bổ sung thêm một vị trí điểm ngắt mới, nơi chưa tồn tại. Có hai vị trí liên tiếp không có ích gì. developer.mozilla.org/en-US/docs/Web/HTML/Element/wbr
Torin Finnemann
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.