Bungkus kata dalam tabel HTML

566

Saya telah menggunakan word-wrap: break-worduntuk membungkus teks dalam divs dan spans. Namun, sepertinya tidak berfungsi dalam sel tabel. Saya memiliki tabel yang disetel width:100%, dengan satu baris dan dua kolom. Teks dalam kolom, meskipun ditata dengan yang di atas word-wrap, tidak membungkus. Ini menyebabkan teks melewati batas sel. Ini terjadi pada Firefox, Google Chrome dan Internet Explorer.

Seperti apa sumbernya:

td {
  border: 1px solid;
}
<table style="width: 100%;">
  <tr>
    <td>
      <div style="word-wrap: break-word;">
        Looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong word
      </div>
    </td>
    <td><span style="display: inline;">Short word</span></td>
  </tr>
</table>

Kata panjang di atas lebih besar dari batas halaman saya, tetapi tidak putus dengan HTML di atas. Saya sudah mencoba saran di bawah ini untuk menambahkan text-wrap:suppressdan text-wrap:normal, tetapi tidak ada yang membantu.

psikotik
sumber
tambahkan tanda hubung keras. <tr> <td style = "text-wrap: normal; word-wrap: break-word"> Ini adalah pre-sentation. </td> </tr>
adatapost
Sayangnya, teks di sana berasal dari konten yang dibuat pengguna. Tentu saja, saya bisa melakukan pra-proses dan menambahkan tanda hubung, tetapi saya berharap akan ada cara yang lebih baik.
psychotik
Saya minta maaf karena menggunakan kata 'hard-hyphen'. Dalam HTML, tanda hubung sederhana diwakili oleh karakter "-" (& # 45; atau & # x2D;). Tanda hubung lunak diwakili oleh referensi entitas karakter & pemalu; (& # 173; atau & # xAD;)
adatapost
Apakah Anda benar-benar menggunakan <code>break-wor<em>k</em> </code>? Mungkin itu ada hubungannya dengan itu.
Ms2ger
1
Jika Anda di sini, Anda mungkin ingin juga melihat white-space: pre-wrap developer.mozilla.org/en-US/docs/Web/CSS/white-space
Tom Prats

Jawaban:

624

Berikut ini berfungsi untuk saya di Internet Explorer. Perhatikan penambahan table-layout:fixedatribut CSS

td {
  border: 1px solid;
}
<table style="table-layout: fixed; width: 100%">
  <tr>
    <td style="word-wrap: break-word">
      LongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongWord
    </td>
  </tr>
</table>

Marc Stober
sumber
@ewomac ya, kadang-kadang saya hanya perlu mengabaikan kesalahan VS2010 tentang HTML / CSS jika saya tahu itu akan berfungsi di browser.
Marc Stober
2
@marc !! Bung, terima kasih banyak untuk ini. Saya ditugaskan untuk membangun versi seluler dari situs klien yang menggunakan tabel, dan saya mengalami kesulitan untuk mengaktifkannya! tata letak meja: tetap melakukan trik!
debug
17
Ini membuat kolom lainnya terlalu lebar.
Clément
2
Pastikan untuk membaca developer.mozilla.org/en-US/docs/Web/CSS/table-layout Lebar tabel dan kolom ditentukan oleh lebar tabel dan elemen col atau dengan lebar baris sel pertama. Sel di baris berikutnya tidak memengaruhi lebar kolom. Kedengarannya seperti ini juga baik untuk kinerja.
Sam Barnum
2
@ Clément lihat jawaban Indrek di bawah tentang <colgroup>, ini memperbaiki ini untuk saya.
andrewtweber
164
<td style="word-break:break-all;">longtextwithoutspace</td>

atau

<span style="word-break:break-all;">longtextwithoutspace</span>
Pratik Stephen
sumber
Dapat mengonfirmasi bahwa pendekatan Pratik juga berfungsi pada Safari di iOS (iPhone).
occulus
Untuk mengatasi masalah dengan beberapa kata pendek dan beberapa panjang, Anda bisa berpotensi preprocess teks dan hanya bungkus kata-kata panjang (katakanlah,> 40 karakter) di <span>.
nornagon
9
ini tidak didukung oleh firefox, opera
meotimdihia
5
ini tidak istimewa pada karakter non-kata (seperti, jika saya memiliki serangkaian kata yang lebih pendek yang dipisahkan oleh spasi, kata-kata itu akan selalu berjalan hingga garis, kemudian memecah kata terakhir menjadi dua). Word-wrapakan melanggar kata-kata hanya bila perlu
Hashbrown
Pendekatan ini lebih baik karena tidak memerlukan table-layout: fixed;.
Finesse
125

Tembakan panjang, tapi periksa dengan Firebug (atau serupa) bahwa Anda tidak sengaja mewarisi aturan berikut:

white-space:nowrap;

Ini dapat mengesampingkan perilaku break line yang Anda tentukan.

Rick Grundy
sumber
Inilah yang diwariskan dan memecahkan kata pembungkus untuk saya
shane lee
@RickGrundy Apa yang Anda ubah jika Anda memiliki masalah itu?
Cokedude
7
@cokedude Saya terlambat di sini, tapi iniwhite-space:normal;
Beer Me
46

Ternyata tidak ada cara yang baik untuk melakukan ini. Yang paling dekat dengan saya adalah menambahkan "overflow: hidden;" ke div di sekitar meja dan kehilangan teks. Solusi sebenarnya tampaknya adalah untuk parit tabel. Menggunakan divs dan posisi relatif saya dapat mencapai efek yang sama, minus warisan<table>

UPDATE 2015: Ini untuk orang-orang seperti saya yang menginginkan jawaban ini. Setelah 6 tahun, ini berhasil, terima kasih kepada semua kontributor.

* { // this works for all but td
  word-wrap:break-word;
}

table { // this somehow makes it work for td
  table-layout:fixed;
  width:100%;
}
psikotik
sumber
29

Seperti disebutkan, menempatkan teks dalam divhampir berfungsi. Anda hanya perlu menentukan widthdaridiv , yang beruntung untuk layout yang statis.

Ini berfungsi pada FF 3.6, IE 8, Chrome.

<td>
  <div style="width: 442px; word-wrap: break-word">
    <!-- Long Content Here-->
  </div>
</td>
loungerdork
sumber
2
Anda dapat menambahkan min-width: 100%bersama dengan widthuntuk memastikan divmengambil seluruh sel.
user1091949
Saya ingin melakukan bungkus kata dengan koma (,). Seperti Long,Long,Long,Long,Long. Saya ingin membungkus ini dengan setelah koma (,).
Karthikeyan
20

Penanganan masalah yang menggunakan overflow-wrap dan berfungsi dengan baik dengan tata letak tabel normal + lebar tabel 100%

https://jsfiddle.net/krf0v6pw/

HTML

<table>
  <tr>
    <td class="overflow-wrap-hack">
      <div class="content">
        wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
      </div>
    </td>
  </tr>
</table>

CSS

.content{
  word-wrap:break-word; /*old browsers*/
  overflow-wrap:break-word;
}

table{
  width:100%; /*must be set (to any value)*/
}

.overflow-wrap-hack{
  max-width:1px;
}

Manfaat:

  • Gunakan overflow-wrap:break-wordbukanword-break:break-all . Yang lebih baik karena mencoba untuk memecahkan ruang terlebih dahulu, dan memotong kata hanya jika kata itu lebih besar dari itu wadah.
  • Tidak table-layout:fixeddibutuhkan Gunakan ukuran otomatis reguler Anda.
  • Tidak perlu mendefinisikan piksel tetap widthatau tetap max-width. Tentukan %induknya jika perlu.

Diuji dalam FF57, Chrome62, IE11, Safari11

Alph.Dev
sumber
Meskipun peretasan ini tampaknya berfungsi di semua peramban, berhati-hatilah karena spesifikasi CSS tidak menjamin hal ini. Per w3.org/TR/CSS21/visudet.html#propdef-max-width , "efek 'min-width' dan 'max-width' pada tabel, tabel inline, sel tabel, kolom tabel, dan grup kolom adalah tidak terdefinisi " .
Mark Amery
17

Ubah kode Anda

word-wrap: break-word;

untuk

word-break:break-all;

Contoh

<table style="width: 100%;">
  <tr>
    <td>
      <div style="word-break:break-all;">longtextwithoutspacelongtextwithoutspace Long Content, Long Content, Long Content, Long Content, Long Content, Long Content, Long Content, Long Content, Long Content, Long Content</div>
    </td>
    <td><span style="display: inline;">Short Content</span>
    </td>
  </tr>
</table>

Duc Nguyen
sumber
-1; ini membuat browser benar-benar mengabaikan istirahat dan istirahat di tengah-tengah kata bahkan jika itu tidak perlu. Itu jarang perilaku yang diinginkan dan mungkin bukan perilaku yang diinginkan OP, atau kalau tidak mereka tidak akan pernah menggunakan break-worddi tempat pertama.
Mark Amery
16

Masalah dengan

<td style="word-break:break-all;">longtextwithoutspace</td>

adalah bahwa itu akan berfungsi tidak begitu baik ketika teks memiliki beberapa spasi, mis

<td style="word-break:break-all;">long text with andthenlongerwithoutspaces</td>

Jika kata andthenlongerwithoutspacescocok dengan sel tabel dalam satu baris tetapi long text with andthenlongerwithoutspacestidak, kata panjang akan dipecah menjadi dua, bukannya dibungkus.

Solusi alternatif: masukkan U + 200B ( ZWSP ), U + 00AD ( soft hyphen ) atau U + 200C ( ZWNJ ) di setiap kata panjang setelah setiap, katakanlah, karakter 20 (namun, lihat peringatan di bawah):

td {
  border: 1px solid;
}
<table style="width: 100%;">
  <tr>
    <td>
      <div style="word-wrap: break-word;">
        Looooooooooooooooooo&#xAD;oooooooooooooooooooo&#xAD;oooooooooooooooooooo&#xAD;oooooooooooooooooooo&#xAD;oooooooooooooooooooo&#xAD;oooooooooooooooooooo&#xAD;oooooooooooooooooooo&#xAD;oooooooooooooooooooo&#xAD;oooooooooooooooooooo&#xAD;oooooooooooooong word
      </div>
    </td>
    <td><span style="display: inline;">Short word</span></td>
  </tr>
</table>

Peringatan : memasukkan karakter tambahan dengan panjang nol tidak memengaruhi pembacaan. Namun, itu mempengaruhi teks yang disalin ke clipboard (karakter ini tentu saja disalin juga). Jika teks clipboard nantinya digunakan dalam beberapa fungsi pencarian di aplikasi web ... pencarian akan rusak. Meskipun solusi ini dapat dilihat di beberapa aplikasi web terkenal, hindari jika memungkinkan.

Peringatan : saat memasukkan karakter tambahan, Anda tidak harus memisahkan beberapa titik kode dalam grapheme. Lihat https://unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries untuk info lebih lanjut.

Piotr Findeisen
sumber
Mungkin output dari ini sedikit lebih baik jika, dengan kata-kata yang cukup panjang, Anda memasukkan tanda hubung yang lembut setelah setiap karakter, sehingga browser dapat secara andal memecahkan kata di tepi kanan elemen yang mengandung.
Mark Amery
Meskipun ini adalah solusi yang layak, saran yang tampaknya tidak berbahaya untuk menambahkan sesuatu "setelah setiap, katakanlah, karakter ke-20" penuh dengan perangkap jika Anda ingin melakukannya secara terprogram di server Anda. Iterasi atas karakter string Unicode sulit di sebagian besar bahasa pemrograman. Paling- paling , sebuah bahasa mungkin membuatnya mudah untuk diulangi lebih dari titik kode Unicode, tetapi itu tidak selalu apa yang ingin kita sebut sebagai "karakter" (misalnya dapat ditulis sebagai dua titik kode). Kami mungkin benar-benar berarti "grapheme", tapi saya tidak tahu bahasa apa pun yang membuatnya sepele untuk mengulanginya.
Mark Amery
1
@MarkAmery kamu benar. Namun, bahkan dengan ASCII biasa ini tidak bagus. Saya menambahkan "peringatan".
Piotr Findeisen
14

Lihat demo ini

   <table style="width: 100%;">
    <tr>
        <td><div style="word-break:break-all;">LongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWord</div>
        </td>
        <td>
            <span style="display: inline;">Foo</span>
        </td>
    </tr>
</table>

Inilah tautan untuk membaca

AabinGunz
sumber
-1; menggunakan break-allakan menyebabkan browser untuk benar-benar mengabaikan jeda kata ketika memutuskan di mana harus menempatkan jeda baris, dengan efek bahwa meskipun sel Anda berisi prosa normal tanpa kata-kata yang sangat panjang, Anda akan berakhir dengan jeda baris di tengah kata. Ini biasanya tidak diinginkan.
Mark Amery
10

Diuji dalam IE 8 dan Chrome 13.

<table style="table-layout: fixed; width: 100%">
    <tr>
        <td>
              <div style="word-wrap: break-word;">
                 longtexthere
              </div>
        </td>
        <td><span style="display: inline;">Foo</span></td>
    </tr>
</table>

Ini menyebabkan tabel sesuai dengan lebar halaman dan setiap kolom mengambil 50% dari lebar.

Jika Anda lebih suka kolom pertama untuk mengambil lebih banyak halaman, tambahkan width: 80%ke tdseperti dalam contoh berikut, menggantikan 80% dengan persentase pilihan Anda.

<table style="table-layout: fixed; width: 100%">
    <tr>
        <td style="width:80%">
               <div style="word-wrap: break-word;">
                 longtexthere
               </div>
            </td>
        <td><span style="display: inline;">Foo</span></td>
    </tr>
</table>
Waylon Flinn
sumber
10

Satu-satunya hal yang perlu dilakukan adalah menambahkan lebar ke <td>atau di <div>dalam<td> tergantung pada tata letak yang ingin Anda capai.

misalnya:

<table style="width: 100%;" border="1"><tr>
<td><div style="word-wrap: break-word; width: 100px;">looooooooooodasdsdaasdasdasddddddddddddddddddddddddddddddasdasdasdsadng word</div></td>
<td><span style="display: inline;">Foo</span></td>
</tr></table>

atau

 <table style="width: 100%;" border="1"><tr>
    <td width="100" ><div style="word-wrap: break-word; ">looooooooooodasdsdaasdasdasddddddddddddddddddddddddddddddasdasdasdsadng word</div></td>
    <td><span style="display: inline;">Foo</span></td>

</tr></table>
Shalom Sam
sumber
1
Ini pada dasarnya hanya mengulangi apa yang sudah dikatakan jawaban loungerdork beberapa bulan sebelumnya tanpa menambahkan informasi atau wawasan baru.
Mark Amery
Ini bekerja untuk saya
core114
8

Jawaban yang memenangkan hadiah itu benar, tetapi tidak berfungsi jika baris pertama tabel memiliki sel yang digabung / bergabung (semua sel mendapatkan lebar yang sama).

Dalam hal ini Anda harus menggunakan colgroupdan coltag untuk menampilkannya dengan benar:

<table style="table-layout: fixed; width: 200px">
<colgroup>
    <col style="width: 30%;">
    <col style="width: 70%;">
</colgroup>
<tr>
    <td colspan="2">Merged cell</td>
</tr>
<tr>
    <td style="word-wrap: break-word">VeryLongWordInThisCell</td>
    <td style="word-wrap: break-word">Cell 2</td>
</tr>
</table>
Indrek
sumber
8
<p style="overflow:hidden; width:200px; word-wrap:break-word;">longtexthere<p>
Sarawut Positwinyu
sumber
1
-1 untuk kedua kurangnya penjelasan dan solusi buruk. Menempatkan konten di pdalam lebar piksel tetap dalam sel tabel yang tidak memiliki lebar piksel tetap hampir pasti akan berakhir dengan pmeluap atau gagal mengisi sel tabel.
Mark Amery
8

Tampaknya Anda perlu mengatur word-wrap:break-word;elemen blok ( div), dengan lebar yang ditentukan (bukan relatif). Ex:

<table style="width: 100%;"><tr>
    <td><div style="display:block; word-wrap: break-word; width: 40em;">loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong word</div></td>
    <td><span style="display: inline;">Foo</span></td>
</tr></table>

atau menggunakan word-break:break-allsesuai saran Abhishek Simon.

stslavik
sumber
5

Ini bekerja untuk saya:

<style type="text/css">
    td {

        /* CSS 3 */
        white-space: -o-pre-wrap;
        word-wrap: break-word;
        white-space: pre-wrap;
        white-space: -moz-pre-wrap;
        white-space: -pre-wrap;
    }

Dan atribut tabel adalah:

   table {
      table-layout: fixed;
      width: 100%
   }

</style>
Lavekush Agrawal
sumber
Seperti beberapa jawaban lain, bit kunci di sini yang membuatnya berfungsi adalah menggunakan table-layout: fixed, tetapi sudah ada jawaban yang jauh lebih tua menyarankan itu, jadi jawaban ini tidak menambahkan informasi baru.
Mark Amery
4

Jika Anda tidak memerlukan batas tabel, terapkan ini:

table{
    table-layout:fixed;
    border-collapse:collapse;
}
td{
    word-wrap: break-word;
}
Fusi
sumber
Sudah ada jawaban yang jauh lebih tua yang menyarankan untuk digunakan table-layout: fixed; ini tidak menambahkan sesuatu yang baru ke halaman.
Mark Amery
4

Saya menemukan solusi yang sepertinya berfungsi di Firefox, Google Chrome dan Internet Explorer 7-9. Untuk melakukan tata letak tabel dua kolom dengan teks panjang di satu sisi. Saya mencari di seluruh untuk masalah yang sama, dan apa yang bekerja di satu browser memecah yang lain, atau menambahkan lebih banyak tag ke tabel sepertinya pengkodean yang buruk.

Saya TIDAK menggunakan tabel untuk ini. DL DT DD untuk menyelamatkan. Setidaknya untuk memperbaiki tata letak dua kolom, yang pada dasarnya adalah pengaturan glosarium / kamus / arti kata.

Dan beberapa gaya generik.

    dl {
        margin-bottom:50px;
    }

    dl dt {
        background:#ccc;
        color:#fff;
        float:left;
        font-weight:bold;
        margin-right:10px;
        padding:5px;
        width:100px;
    }

    dl dd {
        margin:2px 0;
        padding:5px 0;
        word-wrap:break-word;
        margin-left:120px;
    }
<dl>
    <dt>test1</dt>
    <dd>Fusce ultricies mi nec orci tempor sit amet</dd>
    <dt>test2</dt>
    <dd>Fusce ultricies</dd>
    <dt>longest</dt>
    <dd>
        Loremipsumdolorsitametconsecteturadipingemipsumdolorsitametconsecteturaelit.Nulla
        laoreet ante et turpis vulputate condimentum. In in elit nisl. Fusce ultricies
        mi nec orci tempor sit amet luctus dui convallis. Fusce viverra rutrum ipsum,
        in sagittis eros elementum eget. Class aptent taciti sociosqu ad litora
        torquent per conubia nostra, per.
    </dd>
</dl>

Menggunakan kata-mengambang dan margin tersisa, saya mendapatkan apa yang saya butuhkan. Hanya berpikir saya akan berbagi ini dengan orang lain, mungkin itu akan membantu orang lain dengan tata letak gaya definisi dua kolom, dengan kesulitan mendapatkan kata-kata untuk membungkus.

Saya mencoba menggunakan kata-bungkus dalam sel tabel, tetapi hanya bekerja di Internet Explorer 9, (dan Firefox dan Google Chrome tentu saja) terutama mencoba untuk memperbaiki browser Internet Explorer yang rusak di sini.

Yogurt Yang Bijaksana
sumber
2

Tabel dibungkus secara default, jadi pastikan tampilan sel tabel adalah table-cell:

td {
   display: table-cell;
}
besi
sumber
-1; teks dalam setiap elemen HTML membungkus secara default, tidak hanya meja. Saran di sini tidak masuk akal.
Mark Amery
1

style = "table-layout: fixed; width: 98%; word-wrap: break-word"

<table bgcolor="white" id="dis" style="table-layout:fixed; width:98%; word-wrap:break-word" border="0" cellpadding="5" cellspacing="0" bordercolordark="white" bordercolorlight="white" >

Demo - http://jsfiddle.net/Ne4BR/749/

Ini bekerja baik untuk saya. Saya memiliki tautan panjang yang akan menyebabkan tabel melebihi 100% di browser web. Diuji pada IE, Chrome, Android dan Safari.

Polisi
sumber
Ini pada dasarnya duplikat sebagai jawaban terpilih ; dalam kedua kasus, solusinya adalah "menggunakan table-layout: fixed".
Mark Amery
0

Solusi yang bekerja dengan Google Chrome dan Firefox (tidak diuji dengan Internet Explorer) adalah ditetapkan display: table-cellsebagai elemen blok.

Antoine Guiral
sumber
0

Anda dapat mencoba ini jika itu cocok untuk Anda ...

Letakkan teks di dalam td Anda dan nonaktifkan dengan warna latar belakang putih dan tentukan jumlah barisnya.

<table style="width: 100%;">
  <tr>
    <td>
        <textarea rows="4" style="background-color:white;border: none;" disabled>      Looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong word
      </textarea>
    </td>
    <td><span style="display: inline;">Short word</span></td>
  </tr>
</table>
Adarsh ​​Singh
sumber