HTML tablosunda sözcük kaydırma


566

word-wrap: break-wordMetinleri divs ve spans'ye kaydırmak için kullanıyorum . Ancak, tablo hücrelerinde çalışmıyor gibi görünüyor. width:100%Bir satır ve iki sütun ile ayarlanmış bir tablo var . Sütunlardaki metin, yukarıdakilerle stilize edilmiş olmasına rağmen kaydırılmaz word-wrap. Metnin hücrenin sınırlarını aşmasına neden olur. Bu Firefox, Google Chrome ve Internet Explorer'da olur.

Kaynak şöyle görünür:

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>

Yukarıdaki uzun kelime, sayfamın sınırlarından daha büyük, ancak yukarıdaki HTML ile kesilmiyor. Aşağıdaki önerileri ekleyerek denedim text-wrap:suppressve text-wrap:normalikisi de yardımcı olmadı.


sert tire ekleyin. <tr> <td style = "text-wrap: normal; word-wrap: break-word"> Bu bir ön gösterimdir. </td> </tr>
adatapost

Ne yazık ki, oradaki metin kullanıcı tarafından oluşturulan içerikten geliyor. Elbette, ön işlem yapabilir ve kısa çizgi ekleyebilirim, ancak daha iyi bir yol olacağını umuyordum.
psychotik

'Sert tire' kelimesini kullandığım için özür dilerim. HTML'de, düz tire "-" karakteriyle (& # 45; veya & # x2D;) temsil edilir. Yumuşak tire karakteri varlık referansı & shy; (& # 173 ya da # & XAD;)
adatapost

Gerçekten <code> break-wor<em>k</em> </code> kullanıyor musunuz? Belki bununla bir ilgisi olabilir.
Ms2ger

1
white-space: pre-wrap
Tom Prats

Yanıtlar:


624

Internet Explorer'da aşağıdakiler benim için çalışıyor. table-layout:fixedCSS özelliğinin eklendiğine dikkat edin

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


@ewomac evet, bazen tarayıcıda çalışacağını biliyorsanız, HTML / CSS ile ilgili VS2010 hatalarını görmezden gelmek zorundayım.
Marc Stober

2
@marc !! ahbap, bunun için çok teşekkürler. Tabloları kullanan bir istemci sitesinin mobil sürümünü oluşturmakla görevlendirildim ve bu işe almakta sorun yaşıyordum! masa düzeni: hile yaptı sabit!
hata ayıklama

17
Bu, diğer sütunları çok geniş yapar.
Clément

2
Emin okuma Be developer.mozilla.org/en-US/docs/Web/CSS/table-layout Tablo ve sütun genişlikleri masa ve sütun elemanları genişlikleri ile veya hücrelerin ilk sıranın genişliği ayarlanır. Sonraki satırlardaki hücreler sütun genişliklerini etkilemez. Bunun gibi bir şey de performans için iyidir.
Sam Barnum

2
@ Clément Indrek'in aşağıdaki cevabına bakınız <colgroup>, bunu benim için düzeltti.
andrewtweber

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

veya

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

Pratik'in yaklaşımının iOS'ta (iPhone) Safari'de de çalıştığını doğrulayabilir.
okulu

Kısa ve bazı uzun kelimelerle problemi çözmek için, metni potansiyel olarak önceden işleyebilir ve yalnızca uzun kelimeleri (örneğin,> 40 karakter) sarabilirsiniz <span>.
nornagon

9
Bu firefox, opera tarafından desteklenmiyor
meotimdihia

5
bu tercihli olarak kelime olmayan karakterleri kırmazdı (boşluklarla ayrılmış bir dizi kısa kelimem olsaydı, kelimeleri her zaman çizgiye kadar çalıştırır, son kelimeyi ikiye bölerdi). Word-wrapkelimeleri yalnızca gerektiğinde kıracak
Hashbrown

Bu yaklaşım daha iyidir çünkü gerektirmez table-layout: fixed;.
Finesse

125

Uzun bir atış, ancak Firebug (veya benzeri) ile yanlışlıkla aşağıdaki kuralı devralmadığınızı kontrol edin:

white-space:nowrap;

Bu, belirttiğiniz satır sonu davranışınızı geçersiz kılabilir .


Bu kalıtsaldı ve benim için kelime kaydırmayı kırdı
shane lee

@RickGrundy Bu sorununuz varsa bunu neyle değiştirirsiniz?
cokedude

7
@ cokedude Buraya çok geç kaldım, ama buwhite-space:normal;
Beer Me

46

Bunu yapmanın iyi bir yolu olmadığı anlaşılıyor. En yakın geldiğim "taşma: gizli;" masa etrafında div ve metin kaybetme. Gerçek çözüm olsa masa hendek gibi görünüyor. Div'leri ve göreli konumlandırmayı kullanarak aynı etkiyi elde edebildim,<table>

2015 GÜNCELLEME: Bu benim gibi bu cevabı isteyen kişiler içindir. 6 yıl sonra, tüm katkıda bulunanlar sayesinde bu işe yarıyor.

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

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

29

Belirtildiği gibi, metni divneredeyse işe koyuyor . Sadece belirtmek zorunda widtharasında divstatiktir düzenleri için şanslı olan.

Bu, FF 3.6, IE 8, Chrome'da çalışır.

<td>
  <div style="width: 442px; word-wrap: break-word">
    <!-- Long Content Here-->
  </div>
</td>

2
Tüm hücrenin alınmasını sağlamak için min-width: 100%ile birlikte ekleyebilirsiniz . widthdiv
user1091949

Virgülle (,) sözcük kaydırma yapmak istiyorum. Gibi Long,Long,Long,Long,Long. Bunu herhangi bir virgül (,) sonra kaydırmak istiyorum.
Karthikeyan

20

Taşma sargısı kullanan ve normal tablo düzeni + tablo genişliği% 100 ile iyi çalışan geçici çözüm

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

Yararları:

  • Kullanımları overflow-wrap:break-wordyerine word-break:break-all. Bu daha iyidir çünkü önce boşlukları kırmaya çalışır ve sözcüğü sadece kaptan daha büyükse keser.
  • Gerek yok table-layout:fixed. Normal otomatik boyutlandırmanızı kullanın.
  • Sabit widthveya max-widthpiksel cinsinden sabit tanımlamak için gerekli değildir . %Gerekirse ebeveyni tanımlayın .

FF57, Chrome62, IE11, Safari11'de test edildi


Bu kesmek aslında tüm tarayıcılarda çalışıyor gibi görünse de, CSS spesifikasyonunun bunu garanti etmediğine dikkat edin. Ortalama w3.org/TR/CSS21/visudet.html#propdef-max-width , "tablo, satır içi tablolar, tablo hücreleri tablo sütunları ve sütun grupları min-genişliği ve max-width etkisidir undefined " .
Mark Amery

17

Kodunuzu değiştirin

word-wrap: break-word;

için

word-break:break-all;

Misal

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


1; bu, tarayıcının kelime sonlarını tamamen görmezden gelmesine ve gerek duymasa bile kelimelerin ortasında kırılmasına neden olur. Bu nadiren istenen davranıştır ve muhtemelen OP'nin istediği davranış değildir, aksi takdirde break-wordilk etapta kullanmazlardı.
Mark Amery

16

İle ilgili sorun

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

o iyiliği öyle değil çalışacaktır olmasıdır metin zaman vardır bazı boşluklar, örneğin

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

Sözcük andthenlongerwithoutspacestek bir satırda tablo hücresine sığarsa, long text with andthenlongerwithoutspacesuymazsa, uzun sözcük sarılmak yerine ikiye bölünür.

Alternatif çözüm: U + 200B ( ZWSP ), U + 00AD ( yumuşak kısa çizgi ) veya U + 200C ( ZWNJ ), her 20 karakterden sonra her uzun kelimeye ekleyin (ancak aşağıdaki uyarıya bakın):

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>

Uyarı : sıfır uzunluklu ek karakterler eklemek okumayı etkilemez. Bununla birlikte, panoya kopyalanan metni etkiler (bu karakterler elbette kopyalanır). Pano metni daha sonra web uygulamasındaki bazı arama işlevlerinde kullanılırsa ... arama kesilir. Bu çözüm iyi bilinen bazı web uygulamalarında görülebilse de, mümkünse kaçının.

Uyarı : Ek karakterler eklerken, grafik içinde birden çok kod noktasını ayırmamalısınız. Daha fazla bilgi için bkz. Https://unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries .


Belki de, yeterince uzun sözcüklerle, her karakterden sonra yumuşak bir tire eklerseniz , tarayıcının içerdiği öğenin sağ kenarındaki kelimeyi güvenilir bir şekilde kırabilmesi durumunda, bunun çıktısı biraz daha iyidir .
Mark Amery

Bu uygun bir çözüm olsa da , sunucunuzda programlı olarak yapmak istiyorsanız "her 20, karakterden sonra" bir şey eklemek için görünüşte zararsız öneri tuzaklarla doludur. Çoğu programlama dilinde bir Unicode dizesinin karakterleri üzerinde yineleme yapmak zordur. En iyi ihtimalle , bir dil Unicode kod noktaları üzerinden yinelemeyi kolaylaştırabilir, ancak bunlar mutlaka "karakter" olarak adlandırmak istediğimiz şey değildir (örneğin iki kod noktası olarak yazılabilir). Muhtemelen gerçekten "grafikler" demek istiyoruz, ama bunlar arasında geçiş yapmayı önemsiz kılan bir dil bilmiyorum .
Mark Amery

1
@MarkAmery haklısın. Ancak, düz ASCII ile bile bu harika değil. "Uyarılar" ekledim.
Piotr Findeisen

14

Bu demoya göz atın

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

İşte okumak için bağlantı


1; kullanımı break-all, satır sonlarını nereye koyacağınıza karar verirken tarayıcının kelime sonlarını tamamen görmezden gelmesine neden olur; bunun sonucunda, hücreniz çok uzun kelimeler olmadan normal düzyazı içeriyor olsa bile, kelimelerin ortasında satır sonları elde edersiniz. Bu genellikle istenmeyen bir durumdur.
Mark Amery

10

IE 8 ve Chrome 13'te test edilmiştir.

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

Bu, tablonun sayfanın genişliğine sığmasına ve her sütunun genişliğin% 50'sini almasına neden olur.

Sayfanın daha yukarı çekmek için ilk sütunu tercih ediyorsanız, bir ekleme width: 80%için tdseçtiğiniz yüzdesi ile% 80 yerine, aşağıdaki örnekte olduğu gibi.

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

10

Yapılması gereken tek şey, elde etmek istediğiniz düzene bağlı olarak <td>veya <div>içine genişlik eklemektir <td>.

Örneğin:

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

veya

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

1
Bu temelde, loungerdork'un daha önce söylediklerini aylar önce yeni bir bilgi ya da içgörü eklemeden tekrarlıyor .
Mark Amery

Benim için çalıştı
core114

8

Ödül kazanan cevap doğrudur, ancak tablonun ilk satırında birleştirilmiş / birleştirilmiş hücre varsa (tüm hücreler eşit genişliğe sahipse) işe yaramaz .

Bu durumda, colgroupve coletiketlerini düzgün görüntülemek için kullanmalısınız :

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

8
<p style="overflow:hidden; width:200px; word-wrap:break-word;">longtexthere<p>

1
-1 herhangi bir açıklama eksikliği ve kötü çözüm için. İçeriği sabit piksel genişliğine sahip olmayanp bir tablo hücresinin içine sabit piksel genişliğinin içine yerleştirmek, neredeyse ya taşan ya da tablo hücresini dolduramamakla sonuçlanır . p
Mark Amery

8

Belirtilen (göreceli olmayan) genişliğe sahip word-wrap:break-word;bir blok öğesi ( div) ayarlamanız gerekir . Ör:

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

veya word-break:break-allAbhishek Simon'un önerisine göre.


5

Bu benim için çalışıyor:

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

Ve tablo özelliği:

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

</style>

Diğer bazı cevaplar gibi, burada çalışmasını sağlayan anahtar bit kullanıyor table-layout: fixed, ancak bunu öneren çok daha eski bir yanıt var, bu nedenle bu cevap yeni bir bilgi eklemiyor.
Mark Amery

4

Tablo kenarlığına ihtiyacınız yoksa bunu uygulayın:

table{
    table-layout:fixed;
    border-collapse:collapse;
}
td{
    word-wrap: break-word;
}

Bir Zaten var çok daha eski cevabı kullanımına düşündüren table-layout: fixed; bu sayfaya yeni bir şey eklemez.
Mark Amery

4

Firefox, Google Chrome ve Internet Explorer 7-9'da işe yarayan bir çözüm buldum. Bir tarafında uzun metin bulunan iki sütunlu bir tablo düzeni yapmak için. Benzer bir sorun için her yerde aradım ve bir tarayıcıda işe yarayan diğerini kırdı veya bir tabloya daha fazla etiket eklemek kötü kodlama gibi görünüyor.

Bunun için bir tablo kullanmadım. DL DT DD kurtarmaya. En azından iki sütunlu bir düzeni düzeltmek için, bu temelde bir sözlük / sözlük / kelime anlamı düzeneğidir.

Ve bazı genel tasarım.

    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>

Kayan word-wrap ve kenar boşluğu kullanarak, tam olarak ihtiyacım olanı aldım. Bunu başkalarıyla paylaşacağımı düşündüm, belki iki kelimeyi tanımlamak için başkalarına yardımcı olacak ve sözcükleri sarmak için sorun yaşayacaktır.

Tablo hücresinde sözcük kaydırmayı kullanmayı denedim, ancak yalnızca Internet Explorer 9'da (ve tabii ki Firefox ve Google Chrome'da) çalıştı.


2

Tablolar varsayılan olarak sarılır, bu nedenle tablo hücrelerinin görüntüsünün olduğundan emin olun table-cell:

td {
   display: table-cell;
}

1; metin herhangi bir HTML öğesine varsayılan değil, sadece tablolar ile sarar. Buradaki öneri gerçekten bir anlam ifade etmiyor.
Mark Amery

1

style = "tablo düzeni: sabit; genişlik:% 98; sözcük kaydırma: kesme sözcüğü"

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

Bu benim için harika çalıştı. Tablonun web tarayıcılarında% 100'ü aşmasına neden olacak uzun bağlantılar vardı. IE, Chrome, Android ve Safari'de test edildi.


Bu temelde en çok oy alan cevap olarak bir kopyadır ; her iki durumda da çözelti "kullanım table-layout: fixed" a kaynar .
Mark Amery

0

Google Chrome ve Firefox ile çalışan bir çözüm (Internet Explorer ile test edilmemiştir) display: table-cellbir blok öğesi olarak ayarlamaktır .


0

Size uygunsa bunu deneyebilirsiniz ...

TD'nize bir metin alanı koyun ve arka plan rengi beyaz ile devre dışı bırakın ve satır sayısını tanımlayın.

<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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.