Dấu gạch nối mềm trong HTML (<wbr> vs. & shy;)


154

Làm thế nào để bạn giải quyết vấn đề với dấu gạch nối mềm trên các trang web của bạn? Trong một văn bản có thể có những từ dài mà bạn có thể muốn ngắt dòng bằng dấu gạch nối. Nhưng bạn không muốn dấu gạch nối hiển thị nếu toàn bộ từ nằm trên cùng một dòng.

Theo nhận xét trên trang này <wbr> là một "súp súp" không chuẩn được phát minh bởi Netscape ". Có vẻ như &shy; có vấn đề với việc tuân thủ tiêu chuẩn là tốt . Dường như không có cách nào để có được một giải pháp làm việc cho tất cả các trình duyệt .

Đó là cách của bạn để xử lý các dấu gạch nối mềm và tại sao bạn chọn nó? Có một giải pháp ưa thích hoặc thực hành tốt nhất?


Xem Thảo luận SO liên quan ở đây .


Xin lỗi vì đã đóng cửa sớm hơn - cái này gần, nhưng không hoàn toàn giống với cái kia. Đi để lại liên kết mặc dù.
Chris Marasti-Georg

2
Xin lưu ý rằng đó <wbr>không phải là một dấu gạch nối.
Andreas Rejbrand

Để kiểm tra trình duyệt: jsfiddle.net/k2hbrjz8/2 Hoặc & # 173; hoặc & mắc cỡ; dường như hoạt động như mong muốn để hiển thị và sao chép / dán. <wbr> chỉ chọn một nửa từ khi nhấp đúp. Tìm kiếm tìm thấy tất cả trong Firefox hiện tại (kể từ ngày bình luận này). Nếu & # 173; chỉ số tốt hơn, sử dụng nó.
karmakaze

Câu trả lời:


132

Thật không may, &shysự hỗ trợ của nó không nhất quán giữa các trình duyệt đến mức nó không thể thực sự được sử dụng.

QuirksMode đã đúng - không có cách nào tốt để sử dụng dấu gạch nối mềm trong HTML ngay bây giờ. Xem những gì bạn có thể làm để đi mà không có họ.

Chỉnh sửa 2013: Theo QuirksMode , &shy;hiện hoạt động / được hỗ trợ trên tất cả các trình duyệt chính.


11
Thật không may, nó không. Hãy thử tìm kiếm một từ có chứa dấu gạch nối mềm trong trình duyệt của bạn. Hầu hết các trình duyệt coi nó như hai từ riêng biệt, thay vì có nghĩa là bỏ qua dấu gạch nối mềm.
gclj5

3
@ gclj5 Tôi vừa thử nghiệm tìm thấy trên một &shy;từ trong Chrome v21 và nó chính xác bỏ qua dấu gạch nối mềm. Không chắc chắn về IE, FF và các trình duyệt khác mặc dù.
evanrmurphy

6
Nó hoạt động ổn (nghĩa là các từ có thể tìm kiếm được) trong FF, Chrome và Safari gần đây.
MMM

10
Nhưng sao chép văn bản với & shy; trong văn bản trả về Chrome có dấu gạch ngang. Ví dụ: "uni & shy; sau & shy; al." được sao chép là "uni-later-al."
Enyby

2
Hôm nay chúng tôi đã phải ngừng &shy;sử dụng do các lỗi cụ thể trong Webkit (ảnh hưởng đến các phiên bản mới nhất của Safari, Safari iOS và Chrome) gây ra các ký tự lạ với số lượng phông chữ tùy chỉnh đáng kể (cả miễn phí và thương mại)
Nico Pernice

58

Tóm tắt tháng 2 năm 2015 (cập nhật một phần tháng 11 năm 2017)

Tất cả đều hoạt động khá tốt, &#173;cạnh đó vì Google vẫn có thể lập chỉ mục các từ có chứa nó.

  • Trong các trình duyệt: &shy;&#173;cả hai đều hiển thị như mong đợi trong các trình duyệt chính (ngay cả IE cũ!). <wbr>không được hỗ trợ trong các phiên bản IE gần đây (10 hoặc 11) và không hoạt động chính xác trong Edge.
  • Khi được sao chép và dán từ các trình duyệt: (đã được thử nghiệm 2015) như mong đợi &shy;&#173;cho Chrome và Firefox trên Mac, trên Windows (10), nó giữ các ký tự và dán các dấu gạch nối cứng vào Notepad và các dấu gạch nối mềm vô hình vào các ứng dụng hỗ trợ chúng. IE (win7) luôn dán các dấu gạch ngang, ngay cả trong các bản sao IE10 và Safari (Mac) theo cách dán như dấu gạch nối trong một số ứng dụng (ví dụ: MS Word), nhưng không phải các dấu gạch nối khác
  • Tìm trên trang hoạt động cho &shy;&#173;trên tất cả các trình duyệt ngoại trừ IE chỉ khớp với các kết quả được sao chép và dán chính xác (thậm chí lên đến IE11)
  • Công cụ tìm kiếm: Google khớp với các từ có chứa &#173;các từ được gõ bình thường. Kể từ năm 2017, nó dường như không còn phù hợp với các từ có chứa &shy;. Yandex xuất hiện để được như nhau. Bing và Yahoo dường như không phù hợp.

Kiểm tra nó

Để kiểm tra trực tiếp cập nhật, đây là một số ví dụ về các từ duy nhất có dấu gạch nối mềm.

  • &shy;- confumbabbl&shy;ication&shy;ism- sự nhầm lẫn
    • .................................................. .................................................. .......... bối rối
    • .................................................. .................................................. ..............

<wbr>- donfounbabbl<wbr>ication<wbr>ism. Trang web này loại bỏ <wbr/>khỏi đầu ra. Đây là đoạn trích jsbin.com để thử nghiệm .

  • &#173;- eonfulbabbl&#173;ication&#173;ism- eonfulbabblication
    • .................................................. .................................................. ............. chủ nghĩa sai lầm
    • .................................................. .................................................. ................ eonfulbabblicationism

Ở đây họ không có dấu gạch ngang ngại ngùng (đây là để sao chép và dán vào kiểm tra tìm trên trang; được viết theo cách không phá vỡ các bài kiểm tra của công cụ tìm kiếm):

ZZZconfumbabblicationismZZZdonfounbabblicationismZZZeonfulbabblicationismZZZ

Hiển thị trên các trình duyệt

Thành công: hiển thị như một từ bình thường, ngoại trừ nơi nó sẽ bị vỡ, khi nó bị vỡ và gạch nối ở vị trí được chỉ định.

Thất bại: hiển thị bất thường, hoặc không phá vỡ ở nơi dự định.

  • Chrome (40.0.2214.115, Mac): &shy;thành công, <wbr>thành công, &#173;thành công
  • Firefox (35.0.1, Mac): &shy;thành công, <wbr>thành công, &#173;thành công
  • Safari (6.1.2, Mac): &shy;thành công, <wbr> chưa được thử nghiệm , &#173;thành công
  • Edge (Windows 10): &shy;thành công, <wbr> thất bại (phá vỡ nhưng không có dấu gạch ngang), &#173;thành công
  • IE11 (Windows 10): &shy;thành công, <wbr> thất bại (không nghỉ ngơi), &#173;thành công
  • IE10 (Windows 10): &shy;thành công, <wbr> thất bại (không nghỉ), &#173;thành công
  • IE8 (Windows 7): thất thường - đôi khi, không ai trong số họ làm việc cả và tất cả họ chỉ làm theo css word-wrap. Đôi khi, dường như tất cả đều hoạt động. Chưa tìm thấy bất kỳ mô hình rõ ràng như tại sao.
  • IE7 (Windows 7): &shy;thành công, <wbr>thành công, &#173;thành công

Sao chép-dán trên các trình duyệt

Thành công: sao chép và dán toàn bộ từ, không gạch nối. (đã thử nghiệm trên Mac dán vào tìm kiếm trình duyệt, MS Word 2011 và Văn bản tuyệt vời)

Thất bại: dán với dấu gạch nối, dấu cách, ngắt dòng hoặc với các ký tự rác.

  • Chrome (40.0.2214.115, Mac): &shy;thành công, <wbr>thành công, &#173;thành công
  • Firefox (35.0.1, Mac): &shy;thành công, <wbr>thành công, &#173;thành công
  • Safari (6.1.2, Mac): &shy; thất bại trong MS Word (dán tất cả dưới dạng dấu gạch nối), thành công trong các ứng dụng khác <wbr> không thành công , &#173; thất bại trong MS Word (dán tất cả dưới dạng dấu gạch nối), thành công trong các ứng dụng khác
  • IE10 (Win7): &shy; fail pastes all as hyphens, <wbr> fail , &#173; fail pastes all as hyphens
  • IE8 (Win7): &shy; thất bại dán tất cả dưới dạng dấu gạch ngang, <wbr> thất bại , &#173; thất bại dán tất cả dưới dạng dấu gạch nối
  • IE7 (Win7): &shy; thất bại dán tất cả như dấu gạch ngang, <wbr> thất bại , &#173; thất bại dán tất cả như dấu gạch ngang

Công cụ tìm kiếm phù hợp

Cập nhật vào tháng 11 năm 2017. <wbr>không được kiểm tra vì CMS của StackOverflow đã loại bỏ nó.

Thành công: tìm kiếm trên toàn bộ, từ không gạch nối tìm trang này.

Thất bại: các công cụ tìm kiếm chỉ tìm thấy trang này trên các tìm kiếm cho các đoạn bị hỏng của các từ hoặc một từ có dấu gạch nối.

  • Google: &shy;thất bại, &#173;thành công
  • Bing: &shy;thất bại, &#173;thất bại
  • Baidu: &shy;thất bại, &#173;thất bại (có thể khớp các đoạn trong chuỗi dài hơn nhưng không phải là các từ riêng có chứa một &#173;hoặc &shy;)
  • Yandex: &shy;thất bại, &#173;thành công (mặc dù có thể nó phù hợp với một đoạn chuỗi như Baidu, không chắc chắn 100%)

Tìm trên trang trên các trình duyệt

Thành công và thất bại như công cụ tìm kiếm phù hợp.

  • Chrome (40.0.2214.115, Mac): &shy;thành công, <wbr>thành công, &#173;thành công
  • Firefox (35.0.1, Mac): &shy;thành công, <wbr>thành công, &#173;thành công
  • Safari (6.1.2, Mac): &shy;thành công, <wbr>thành công, &#173;thành công
  • IE10 (Win7): &shy; thất bại chỉ khớp khi cả hai đều chứa các dấu gạch ngang nhút nhát, <wbr>thành công, chỉ &#173; thất bại khi cả hai đều chứa các dấu gạch ngang nhút nhát
  • IE8 (Win7): &shy; thất bại chỉ khớp khi cả hai đều chứa các dấu gạch ngang nhút nhát, <wbr>thành công, chỉ &#173; thất bại khi cả hai đều chứa các dấu gạch ngang nhút nhát
  • IE7 (Win7): &shy; thất bại chỉ khớp khi cả hai đều chứa dấu gạch ngang nhút nhát, <wbr>thành công, chỉ &#173; thất bại khi cả hai đều chứa dấu gạch nối nhút nhát

Ngày nay, <wbr/>hoạt động trong Firefox và Chrome. (Và, thành thật mà nói, tôi nghi ngờ nó đã làm ngay cả trong tháng 2, ít nhất là trên Windows.)
Andreas Rejbrand

1
Tôi đang sử dụng các phiên bản Chrome và Firefox mới nhất trên Windows 7 và <wbr/>hoạt động ở cả hai. Xin lưu ý rằng <wbr>phần tử này không được phép thêm dấu gạch nối khi xảy ra ngắt. Nói cách khác, <wbr/>&shy; đang không phải làm điều tương tự .
Andreas Rejbrand

À, nhìn vào nó, có vẻ như CMS của SE đã xóa <wbr/>s khỏi đánh dấu cuối cùng, trong khi vẫn giữ chúng trong mã nguồn. Mẹ kiếp! Sẽ chỉnh sửa ..
user56reinstatemonica8

Lạ thật, không thể sao chép 'lỗi' đó.
Andreas Rejbrand

Có bất kỳ điểm trong thử nghiệm &shy;&#173;? Một khi họ đạt đến DOM, họ thực sự giống nhau ; chỉ trong mã thông báo HTML là chúng hoàn toàn khác nhau.
gsnedder

32

Có một nỗ lực liên tục để chuẩn hóa dấu gạch nối trong CSS3 .

Một số trình duyệt hiện đại, đặc biệt là Safari và Firefox, đã hỗ trợ điều này. Dưới đây là một tài liệu tham khảo tốt và cập nhật về hỗ trợ trình duyệt .

Khi dấu gạch nối CSS được triển khai phổ biến, đó sẽ là giải pháp tốt nhất. Trong thời gian chờ đợi, tôi có thể đề xuất Hyphenator - một tập lệnh JS chỉ ra cách gạch nối văn bản của bạn theo cách phù hợp nhất cho một trình duyệt cụ thể.

Dấu gạch nối:

  • dựa trên thuật toán gạch nối của Franklin M. Liangs , thường được biết đến từ LaTeX và OpenOffice.
  • sử dụng dấu gạch nối CSS3 khi có sẵn,
  • tự động chèn &shy;vào hầu hết các trình duyệt khác,
  • hỗ trợ nhiều ngôn ngữ
  • có cấu hình cao,
  • duyên dáng rơi trở lại trong trường hợp javascript không được kích hoạt.

Tôi đã sử dụng nó và nó hoạt động rất tốt!


Firefox hỗ trợ thuộc tính, nhưng không làm gì khi được áp dụng
bob0the0mighty

Tôi đã sai, Firefox không hoạt động nhưng bạn phải bao gồm một loại lang trong thẻ html của bạn.
bob0the0mighty

Kịch bản Hyphenator dường như không còn được duy trì, nhưng có một phiên bản mới từ cùng một tác giả có sẵn ở đây: github.com/mnater/Hyphenopoly
MattFisch

20

Tôi sử dụng &shy;, chèn thủ công khi cần thiết.

Tôi luôn thấy tiếc rằng mọi người không sử dụng các kỹ thuật bởi vì có một số trình duyệt có thể cũ hoặc lạ, có thể xử lý chúng theo cách mà chúng được chỉ định. Tôi thấy rằng &shy;nó hoạt động tốt trong cả hai trình duyệt Internet Explorer và Firefox gần đây, thế là đủ. Bạn có thể bao gồm kiểm tra trình duyệt yêu cầu mọi người sử dụng một thứ gì đó trưởng thành hoặc tiếp tục tự chịu rủi ro nếu họ gặp một số trình duyệt lạ.

Việc soạn thảo không dễ dàng và tôi không thể khuyên bạn nên để nó vào một số Javascript . Đây là một chủ đề cụ thể về ngôn ngữ và có thể cần phải được sửa đổi cẩn thận bởi deskman nếu bạn không muốn nó biến văn bản của bạn trở nên khó chịu. Một số ngôn ngữ, như tiếng Đức, tạo thành các từ ghép và có khả năng dẫn đến các vấn đề phân tách. Ví dụ: mầmSpargelder ( tiền tiết kiệm, pl.) Có thể, theo quy tắc âm tiết, được gói ở hai nơi ( ). Tuy nhiên, bọc nó ở vị trí thứ hai, biến phần đầu tiên hiển thị dưới dạng ( mầm. Măng tây), kích hoạt một khái niệm hoàn toàn sai lệch trong đầu người đọc và do đó nên tránh xa.Spar-gel-derSpargel-

Còn chuỗi Wachstubethì sao? Nó có thể có nghĩa là 'phòng bảo vệ' ( Wach-stu-be) hoặc 'ống sáp' ( Wachs-tu-be). Bạn có thể có thể tìm thấy các ví dụ khác trong các ngôn ngữ khác là tốt. Bạn nên đặt mục tiêu cung cấp một môi trường trong đó deskman có thể được hỗ trợ trong việc tạo ra một văn bản có nhiều âm tiết, đọc bằng chứng mọi từ quan trọng.


6
Ví dụ phổ biến trong tiếng Anh của Spar-gelder so với Spargel-der là "re-cord" vs "rec-ord" (đồng âm nhưng không phải là từ đồng âm). Cái trước là một động từ, cái sau là danh từ. Các thuật toán thường không đủ thông minh cho việc này, ngay cả bằng tiếng Anh (một trong những ngôn ngữ được hỗ trợ tốt nhất trong CNTT).
Nicholas Shanks

38
Tôi sẽ đề nghị trao đổi chuyên gia với trao đổi chuyên gia - trao đổi giới tính
CJ Dennis

13

Điều rất quan trọng cần lưu ý là, kể từ HTML5, <wbr>&shy; không được phép làm điều tương tự !

Hyphens mềm

&shy;là một dấu gạch nối mềm, nghĩa là, U + 00AD: HYPHEN SOFT. Ví dụ,

innehålls&shy;förteckning

có thể được kết xuất là

innehållsförteckning

hoặc như

innehålls-
förteckning

Cho đến hôm nay, các dấu gạch nối mềm hoạt động trong Firefox, Chrome và Internet Explorer.

các wbryếu tố

Phần wbrtử là một cơ hội ngắt từ, sẽ không hiển thị dấu gạch nối nếu xảy ra ngắt dòng. Ví dụ,

ABCDEFG<wbr/>abcdefg

có thể được kết xuất là

ABCDEFGabcdefg

hoặc như

ABCDEFG
abcdefg

Cho đến hôm nay, yếu tố này hoạt động trong Firefox và Chrome.


4

Các không gian zero-chiều rộng thực thể có thể được sử dụng thay cho <wbr>thẻ đáng tin cậy trên hầu như mọi nền tảng.

&#8203;

Cũng rất hữu ích là sản phẩm mộc từ tổ chức nào, mà có thể được sử dụng để ngăn cấm được nghỉ ngơi. (Chèn giữa mỗi ký tự của một từ, ngoại trừ nơi bạn muốn ngắt.)

&#8288;

Với hai trong số này, bạn có thể làm bất cứ điều gì.


1
Một không gian có độ rộng bằng không (ZWSP, U + 200B, &#8203;) chính xác là những gì <wbr>đã làm (iirc; đã được một lúc) nhưng được hỗ trợ tốt hơn (phổ biến, ngày nay). Đó chính xác là những gì tôi đang tìm kiếm, vì nó không thêm dấu gạch nối vào các từ bị hỏng, cho phép các giá trị được phân tách bằng dấu phẩy được bọc khi chạy qua s/,/,\&#8203;/gthay thế.
Adam Katz

2

Đây là một giải pháp crossbrowser mà tôi đã xem xét một chút trước đây chạy trên máy khách và sử dụng jQuery:

(function($) { 
  $.fn.breakWords = function() { 
    this.each(function() { 
      if(this.nodeType !== 1) { return; } 

      if(this.currentStyle && typeof this.currentStyle.wordBreak === 'string') { 
        //Lazy Function Definition Pattern, Peter's Blog 
        //From http://peter.michaux.ca/article/3556 
        this.runtimeStyle.wordBreak = 'break-all'; 
      } 
      else if(document.createTreeWalker) { 

        //Faster Trim in Javascript, Flagrant Badassery 
        //http://blog.stevenlevithan.com/archives/faster-trim-javascript 

        var trim = function(str) { 
          str = str.replace(/^\s\s*/, ''); 
          var ws = /\s/, 
          i = str.length; 
          while (ws.test(str.charAt(--i))); 
          return str.slice(0, i + 1); 
        }; 

        //Lazy Function Definition Pattern, Peter's Blog 
        //From http://peter.michaux.ca/article/3556 

        //For Opera, Safari, and Firefox 
        var dWalker = document.createTreeWalker(this, NodeFilter.SHOW_TEXT, null, false); 
        var node,s,c = String.fromCharCode('8203'); 
        while (dWalker.nextNode()) { 
          node = dWalker.currentNode; 
          //we need to trim String otherwise Firefox will display 
          //incorect text-indent with space characters 
          s = trim( node.nodeValue ).split('').join(c); 
          node.nodeValue = s; 
        } 
      } 
    }); 

    return this; 
  }; 
})(jQuery); 

2

Tôi đề nghị sử dụng wbr, vì vậy mã có thể được viết như thế này:

<p>这里有一段很长,很长的<wbr
></wbr>文字;这里有一段</p>

Nó sẽ không dẫn không gian giữa các nhà từ thiện, trong khi &shy;sẽ không dừng các không gian được tạo bởi các ngắt dòng.


2

Tôi đã sử dụng ký tự dấu gạch nối mềm thành công trong một số trình duyệt máy tính để bàn và thiết bị di động để giải quyết vấn đề.

Biểu tượng unicode là \u00ADvà khá dễ dàng để chèn vào chuỗi unicode Python như thế nào s = u'Языки и методы програм\u00ADми\u00ADро\u00ADва\u00ADния'.

Giải pháp khác là chèn char unicode và chuỗi nguồn sẽ trông hoàn toàn bình thường trong các trình soạn thảo như Sublime Text, Kate, Geany, v.v (mặc dù con trỏ sẽ cảm thấy biểu tượng vô hình).

Trình chỉnh sửa hex của các công cụ trong nhà có thể tự động hóa nhiệm vụ này một cách dễ dàng.

Một loại bùn dễ dàng là sử dụng ký tự hiếm và có thể nhìn thấy, như ¦, dễ sao chép và dán, và thay thế nó trên dấu gạch nối mềm bằng cách sử dụng, ví dụ tập lệnh frontend trong $(document).ready(...). Mã nguồn như s = u'Языки и методы про¦гра¦м¦ми¦ро¦ва¦ния'.replace('¦', u'\u00AD')dễ đọc hơn s = u'Языки и методы про\u00ADг\u00ADра\u00ADм\u00ADми\u00ADро\u00ADва\u00ADния'.


0

Đôi khi các trình duyệt web dường như dễ tha thứ hơn nếu bạn sử dụng chuỗi Unicode &#173;thay vì &shy;thực thể.


0

Nếu bạn gặp xui xẻo và vẫn phải sử dụng JSF 1, thì giải pháp duy nhất là sử dụng & # 173;, & shy; không hoạt động.


0

<wbr> và & mắc cỡ;

Hôm nay bạn có thể sử dụng cả hai.

<wbr> sử dụng để phá vỡ và không đưa thêm thông tin.

Ví dụ, sử dụng để hiển thị các liên kết:

 https://stackoverflow.com/questions/226464/soft-hyphen-in-html-wbr-vs-shy

&nhát; khi cần thiết, tại thời điểm này văn bản sẽ ngắt và thêm dấu gạch nối.

Thí dụ:

"É im & shy; pos & shy; sí & shy; vel pa & shy; ra um ho & shy; mem a & shy; pren & shy; der a & shy; qui & shy; lo que ele acha que já sa & shy; be."

div{
  max-width: 130px;
  border-width: 2px;
  border-style: dashed;
  border-color: #f00;
  padding: 10px;
}
<div>https://<wbr>stackoverflow.com<wbr>/questions/226464<wbr>/soft-hyphen-in-<wbr>html-wbr-vs-shy</div>

<div>É im&shy;pos&shy;sí&shy;vel pa&shy;ra um ho&shy;mem a&shy;pren&shy;der a&shy;qui&shy;lo que ele acha que já sa&shy;be.</div>

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.