html (+ css): menunjukkan tempat yang disukai untuk jeda baris

109

Katakanlah saya memiliki teks ini yang ingin saya tampilkan dalam sel tabel 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

dan saya ingin baris tersebut putus secara istimewa setelah salah satu koma.

Adakah cara untuk memberi tahu perender HTML untuk mencoba melanggar di beberapa tempat yang ditentukan, dan melakukannya terlebih dahulu sebelum mencoba memutuskan setelah salah satu spasi, tanpa menggunakan spasi non-breaking? Jika saya menggunakan spasi non-breaking maka itu membuat lebarnya lebih besar tanpa syarat. Saya ingin jeda baris terjadi setelah salah satu spasi, jika algoritme pembungkusan baris telah mencobanya dengan koma terlebih dahulu dan tidak dapat menyesuaikan baris.

Saya mencoba membungkus fragmen teks dalam <span>elemen tetapi itu tampaknya tidak membantu.

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

catatan: Sepertinya perilaku CSS3text-wrap: avoid adalah yang saya inginkan, tetapi saya tidak bisa membuatnya berfungsi.

Jason S
sumber
Anda dapat menggunakan spasi non-breaking di dalam span.
Gabriele Petrioli
3
Tapi saya tidak ingin menggunakan spasi yang tidak terputus. Saya ingin menggunakan spasi "jangan-ingin-putus-di sini-tapi-saya-akan-jika-saya-punya-untuk", tetapi sejauh yang saya tahu, itu ada.
Jason S
@Jason .. aku merasakanmu .. tapi itu tidak mungkin .. menambahkan jawaban.
Gabriele Petrioli
drat, itulah yang terjadi ketika ilmuwan komputer menulis algoritma rendering tanpa masukan dari juru ketik.
Jason S
1
Anda harus menerima jawaban dari @ EggertJóhannesson karena ini memberikan solusi yang baik!
Gabriele Petrioli

Jawaban:

156

Dengan menggunakan

span.avoidwrap { display:inline-block; }

dan membungkus teks yang ingin saya simpan bersama

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

itu akan membungkus pertama dalam blok pilihan dan kemudian dalam fragmen yang lebih kecil sesuai kebutuhan.

Eggert Jóhannesson
sumber
16
Bekerja dengan baik! Hanya satu catatan tambahan: spasi di awal dan akhir blok-sebaris diabaikan, sehingga untuk membatasi teks dalam blok dengan spasi, Anda perlu menempatkannya di antara blok-sebaris. Misalnya, jika span ditata menjadi blok-sebaris, maka <span>Hello </span><span> world</span>akan menjadi Helloworld, dan <span>Hello</span> <span>world</span>akan menjadi normal Hello world.
pengguna
2
<wbr> lebih semantik dan meninggalkan kendali di browser, yang umumnya merupakan hal yang baik. Dalam hal ini memungkinkan pemutusan hubungan kerja ketika vital.
Lodewijk
Berfungsi dengan baik - jika penting, karakter seperti "-" tidak putus. Contoh: Perikles <span class = "avoidwrap"> (um & nbsp; 500-429 & nbsp; v.Chr.) </span>
Sarah Trees
10
@Lodewijk: <wbr>tidak menunjukkan tempat yang disukai untuk memutuskan garis, tapi kemungkinan tempat .
Dan Dascalescu
1
Perhatikan bahwa teknik ini juga berfungsi untuk tempat bertingkat <span>, sehingga Anda dapat (pada dasarnya) menentukan hierarki titik henti yang diinginkan.
Michael Dyck
24

Ada solusi RWD yang sangat rapi dari Dan Mall yang saya sukai. Saya akan menambahkannya di sini karena beberapa pertanyaan lain tentang jeda baris responsif ditandai sebagai duplikat dari pertanyaan ini.
Dalam kasus Anda, Anda akan memiliki:

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

Dan satu baris CSS di kueri media Anda:

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

Jawaban yang mudah adalah dengan menggunakan karakter spasi lebar-nol. &#8203; Ini digunakan untuk membuat spasi putus di dalam kata-kata pada titik-titik tertentu .

Apakah kebalikan dari spasi non-breaking &nbsp; (yah, sebenarnya word-joiner &#8288; ) ( word-joiner adalah versi lebar-nol dari spasi non-breaking )

(ada juga kode non-breaking lainnya seperti tanda hubung non-breaking &#8209; ) (berikut adalah jawaban ekstensif tentang 'varian' nbsp yang berbeda )

Jika Anda menginginkan solusi HTML-only (tanpa CSS / JS), Anda dapat menggunakan kombinasi ruang lebar-nol dan ruang non-breaking , namun ini akan sangat berantakan , dan menulis versi yang dapat dibaca manusia membutuhkan sedikit usaha .

ctrl+ c, ctrl+ vmembantu

contoh:

   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

tidak terbaca? ini adalah HTML yang sama tanpa tag komentar:

   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

Namun, karena rendering html email tidak sepenuhnya terstandarisasi, ini bagus untuk penggunaan semacam itu karena solusi ini tidak menggunakan CSS / JS

Juga, jika Anda menggunakan ini dalam kombinasi dengan salah satu <span>solusi berbasis, Anda akan memiliki kendali penuh atas algoritme pemutusan garis.

(catatan editorial :)

Satu-satunya masalah yang saya lihat adalah jika Anda ingin mengubah titik kerusakan yang diinginkan secara dinamis. Ini akan membutuhkan manipulasi JS yang konstan dari setiap span dengan ukuran proporsional, dan harus menangani entitas HTML tersebut dalam teks.

Komunitas
sumber
1
apa itu span hacks?
Jason S
Jawaban lainnya memanfaatkan tag span.
Saya juga ingin mencatat bahwa meskipun solusi ini tampaknya bukan yang paling sederhana, ini adalah yang paling dapat diandalkan, karena entitas tersebut tidak dan tidak boleh sering mengubah representasi semantik di browser, pengurai email, atau pengurai HTML lainnya.
3

Jawabannya adalah tidak ( Anda tidak dapat mengubah algoritma pemutusan garis yang digunakan ).

Tetapi ada beberapa solusi (yang terbaik adalah jawaban yang diterima )

Anda dapat mendekati dengan spasi non-breaking &nbsp;tetapi hanya antara kata-kata yang menyatu ( apa yang Anda miliki di span, tetapi tidak setelah koma ), atau Anda dapat menggunakan white-space:nowrapseperti yang disebutkan @Marcel.

Kedua solusi melakukan hal yang sama, dan keduanya tidak akan merusak sekelompok kata jika tidak cocok dengan sendirinya.

Gabriele Petrioli
sumber
argh. :-( itu bau, artinya saya harus menerimanya, atau saya perlu mencoba mendeteksi antrean panjang sendiri dalam upaya mengalahkan algoritme pemutusan garis.
Jason S
Saya mengedit jawaban Anda untuk memberikan tautan ke solusi, karena saya hampir tidak melanjutkan membaca karena cara kalimat pertama Anda diutarakan.
arootbeer
@arootbeer: Saya mendukung suntingan Anda, tetapi Gaby mengembalikannya. Gaby: kenapa? Apakah Anda ingin menyesatkan pengguna?
Dan Dascalescu
@DanDascalescu, haruskah semua jawaban SO diubah agar mengarah ke yang diterima di halaman yang sama? Jawaban saya ada 1 ( jumlah ) suara dan ada jawaban diterima dengan 48 suara. Saya cukup yakin bahwa yang diterima adalah orang yang mendapatkan perhatian ( dan memang demikian ). Selain itu, saya bersikeras bahwa tidak ada cara untuk mengubah algoritma pemutusan yang digunakan ( seperti yang diminta OP )
Gabriele Petrioli
1
periksa solusi saya menggunakan logika Anda sendiri terhadap Anda. menggabungkannya dengan salah satu solusi span, maka Anda memiliki kendali penuh atas algoritme pemutusan garis
2

Dengan mark-up Anda di atas digunakan span { white-space:nowrap }. Ini sebaik yang Anda harapkan.

Marcel
sumber
Terima kasih, tetapi itu tidak akan berhasil karena pada dasarnya menerjemahkan spasi dalam spanelemen menjadi &nbsp;, dan menjaga agar spasi tidak rusak sama sekali. Saya hanya ingin mencegah perender membobol di antara salah satu item saya, tetapi jika harus, saya ingin melakukannya.
Jason S
@Jason S: Saya telah menambahkan opsi lain ke jawaban saya.
Marcel
bagaimana &nbsp;<wbr>berbeda dari ruang? Dari apa yang saya tahu, pilihannya adalah karakter tertentu memungkinkan istirahat atau tidak. Jadi '-' dan '' dan &#8203;dan <wbr>dan &shy;semua memungkinkan jeda (mencetak tanda hubung, spasi, tidak ada, tidak ada, dan tanda hubung-hanya-saat-putus, masing-masing), sedangkan &nbsp;tidak.
Jason S
@Jason S: Menambahkan penggunaan contoh.
Marcel
Saya baru saja mencobanya, dan sepertinya tidak memprioritaskan ruang untuk pemutusan hubungan. Prioritas adalah yang saya butuhkan. Jika perilaku melanggar untuk karakter atau elemen yang berbeda adalah ya atau tidak, maka tidak ada solusi untuk masalah saya. Jika ada prioritas pemutusan garis relatif, maka saya mungkin punya solusi.
Jason S
1

Jawaban baru sekarang kami memiliki HTML5:

HTML5 memperkenalkan <wbr>tag. (Itu singkatan dari Word Break Opportunity.)

Menambahkan a <wbr>memberi tahu browser untuk berhenti di sana sebelum di tempat lain, jadi mudah untuk membuat kata-kata putus setelah koma:

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

Ini mendukung semua browser utama saya selain IE.

ACarter
sumber
12
-1. Mengapa Anda tidak menguji sebelum memberi nasihat? Itu tidak berhasil. <wbr>memiliki tujuan lain. Belum lagi jawaban ini merupakan duplikat dari jawaban yang sudah ada jauh sebelumnya.
pengguna
1
WBR tidak memiliki tujuan lain. developer.mozilla.org/en-US/docs/Web/HTML/Element/wbr
Lodewijk
13
<wbr>hanya menyiapkan kesempatan istirahat; itu tidak "memberi tahu browser untuk membobol sana sebelum di mana pun". Digunakan sebelum spasi, biasanya tidak berguna, karena spasi biasanya merupakan peluang jeda baris.
Jukka K. Korpela
5
Ini tidak berfungsi sama sekali, di browser apa pun. Jawabannya adalah salah: <wbr>tidak tidak memprioritaskan satu baris lebih spasi biasa. Jadi pembungkusan terjadi seperti biasa dalam contoh.
adrian
3
Untuk memperjelas, <wbr> dimaksudkan untuk memberi sinyal "di sini adalah tempat yang dapat Anda hancurkan", ketika posisi itu akan dianggap di dalam sebuah kata . Dikatakan "perlakukan titik di antara dua karakter ini seolah-olah ada ruang di sana", bukan "lebih suka istirahat di sini". Jika sudah ada spasi, <wbr> tidak ada artinya.
Titik koma
-1

Anda bisa menyesuaikan pengaturan margin di CSS (margin-right dalam kasus ini).

text {
    margin-right: 20%;
}
orang bodoh
sumber
-3

Gunakan <div>sebagai pengganti <span>, atau tentukan kelas untuk SPAN dan berikan atribut display: block .

justacoder
sumber
-5

Ada sebuah elemen HTML untuk ™ yang: (sekarang standar) <wbr>elemen .

Saya menyarankan Anda untuk menggunakannya. Ini mungkin tidak berfungsi di mana-mana , tetapi itu yang terbaik yang dapat Anda lakukan tanpa melalui rintangan.

Mathias Bynens
sumber
3
-1: <wbr>untuk menandai break point pada kata-kata yang sangat panjang, itu tidak menyelesaikan masalah dengan jeda baris yang diinginkan
pengguna
4
@ user3075942 Kutipan langsung dari spesifikasi : " wbrElemen mewakili peluang jeda baris." Ini adalah persis apa yang diminta OP untuk. Berhentilah merendahkan orang berdasarkan apa yang Anda baca di wiki.
Mathias Bynens
3
Ya, kesempatan . Tapi browser sudah memiliki kesempatan untuk merusak ruang. Pertanyaannya adalah bagaimana memberi tahu browser di ruang mana yang lebih disukai untuk dihancurkan.
pengguna
1
… Dan jawabannya adalah dengan menggunakan <wbr>.
Mathias Bynens
8
Tidak, itu bukanlah jawabannya. Ini tidak meningkatkan kemungkinan untuk penggunaan kemungkinan break point tertentu yang sudah ada sebelumnya; itu hanya menambah kemungkinan break point baru, di mana satu belum ada. Memiliki dua kemungkinan berturut-turut tidak ada gunanya. developer.mozilla.org/en-US/docs/Web/HTML/Element/wbr
Torin Finnemann