Tabela przepełniona poza div

97

Próbuję powstrzymać tabelę, która ma jawnie zadeklarowaną szerokość, przed przepełnieniem poza jej rodzica div. Przypuszczam, że mogę to zrobić w jakiś sposób za pomocą max-width, ale nie wydaje mi się, aby to działało.

Następujący kod (z bardzo małym oknem) spowoduje to:

<style type="text/css">
  #middlecol {
    width: 45%;
    border-right:2px solid red;
  }
  #middlecol table {
    max-width:100% !important;
  }
</style>

<div id="middlecol">
  <center>
    <table width="400" cellpadding="3" cellspacing="0" border="0" align="center">
      <tr>
        <td bgcolor="#DDFFFF" align="center" colspan="2">
          <strong>Notification!</strong>
        </td>
      <tr>
        <td width="50">
          <img src="http://www.example.com/img.png" width="50" height="50" alt="" border="0">
        </td>
        <td>
          Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
        </td>
      </tr>
    </table>
  </center>
 </div>

Czerwona linia jest prawą krawędzią div, a jeśli zmniejszysz okno przeglądarki, zobaczysz, że tabela nie pasuje do niego.

waiwai933
źródło
2
Nie na temat: nie używaj <center>. Od lat jest przestarzały. Poza tym masz już align="center"na swoim stole.
ЯegDwight
To niestety coś, na co nie mam wpływu. Treść wewnątrz div jest w rzeczywistości zawarta z pliku, który nie został przeze mnie wygenerowany. Mogę dotknąć tylko CSS, ale gdybym mógł, wyeliminowałbym <center>.
waiwai933

Odpowiedzi:

25

Odwróć to, wykonując:

<style type="text/css">
  #middlecol {
    border-right: 2px solid red;
    width: 45%;
  }

  #middlecol table {
    max-width: 400px;
    width: 100% !important;
  }
</style>

Radziłbym również:

  • Nie używaj centertagu (jest wycofany)
  • Nie używać width, bgcoloratrybuty, ustawić je przez CSS ( widthi background-color)

(zakładając, że możesz kontrolować renderowaną tabelę)

Zyphrax
źródło
Jeśli zrobię szerokość: 100%, zignoruje mój margines: prawda. co powoduje przewijanie paska poziomego
Jesse
214

Możesz zapobiec rozszerzaniu tabel poza ich nadrzędny element div, używając table-layout:fixed.

Poniższy kod CSS spowoduje rozszerzenie tabel do szerokości otaczającego je elementu div.

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

Znalazłem tę sztuczkę tutaj .

James Lawruk
źródło
65
To zmusza wszystkie kolumny do tej samej szerokości ... niezbyt przydatne
Serj Sagan,
11
Właściwie nadal możesz ustawić różne szerokości kolumn, po prostu musisz określić szerokości w <col>s lub w pierwszym wierszu <td>(zamiast pozwalać na przepływ w oparciu o rozmiar tekstu). Z MDN: „stałe: szerokości tabeli i kolumn są ustawiane na podstawie szerokości elementów tabeli i col lub szerokości pierwszego wiersza komórek. Komórki w kolejnych wierszach nie mają wpływu na szerokości kolumn”.
philfreo
1
Dziękuję bardzo. To była duża pomoc, którą mi zrobiłeś ...
Parthan_akon
67

Prostym rozwiązaniem jest ustawienie display: tablezawierającego div.

questzen
źródło
8
To jest genialne, dokładnie to, czego szukałem. Aby pomóc innym, oto kilka ciągów, które można wygooglować: Próbowałem użyć CSS, aby dopasować nadrzędny div do przepełnienia lub dopasować tło, aby zakryć przepełnioną zawartość tabeli. To działało idealnie, wielkie dzięki!
trisweb
To tylko dodatek, proszę zwrócić uwagę na kontekst, w którym jest to stosowane, jest to używane do nadania układu tabeli zachowania, a tym samym obecności innych atrybutów stylu, takich jak wiersz tabeli, komórka tabeli. Układy tabelaryczne nie są ruchome. W tym momencie wyświetlacz: sama własność stołu nie wystarcza
questzen
Przyszedłem też tutaj po godzinach szukania odpowiedzi. Ciągi znaków dla wyszukiwarki: Tabela wewnątrz elementu div nie będzie się przewijać, firefox. Div z tabelą się nie przewija, Firefox. Brak pasków przewijania w tabeli wewnątrz elementu div.
anevaude
2
Próbowałem kilku rzeczy, ale po prostu dodałem display: table do najwyższego div nadrzędnego. Problem został rozwiązany, dzięki.
Günay Gültekin
Najlepsze rozwiązanie dla tabel z długimi nazwami nagłówków i długą zawartością komórek. Dzięki!.
Ege Bayrak
34

Wypróbowałem wszystkie powyższe rozwiązania, ale nie działały. Mam 3 tabele jeden pod drugim. Ostatnia przelała się. Naprawiłem to za pomocą:

/* Grid Definition */
table {
    word-break: break-word;
}

W przypadku IE11 w trybie krawędzi musisz ustawić to na word-break:break-all

Panie Doomsbuster
źródło
12

Na początku użyłem metody Jamesa Lawruka. To jednak zmieniło wszystkie szerokości plików td.

Rozwiązaniem dla mnie było użycie white-space: normalna kolumnach (które było ustawione na white-space: nowrap). W ten sposób tekst zawsze będzie się łamał. Użycie word-wrap: break-wordzapewni, że wszystko się zepsuje, gdy będzie to potrzebne, nawet w połowie słowa.

CSS będzie wtedy wyglądać następująco:

td, th {
    white-space: normal; /* Only needed when it's set differntly somewhere else */
    word-wrap: break-word;
}

Nie zawsze jest to pożądane rozwiązanie, ponieważ word-wrap: break-wordTwoje słowa w tabeli mogą być nieczytelne. Dzięki temu stół będzie miał odpowiednią szerokość.

Sander Koedood
źródło
5

Próbowałem prawie wszystkich powyższych, ale nie zadziałało ... Następujące zrobiły

word-break: break-all;

Należy to dodać do nadrzędnego elementu DIV (kontenera tabeli).

Waheed Asghar
źródło
1
overflow-x: auto;
overflow-y : hidden;

Zastosuj powyższy styl do nadrzędnego elementu DIV.

Christian Heath
źródło
0

Możesz spróbować tego CSS. Doświadczyłem tego zawsze.

div {
  border-style: solid;
  padding: 5px;
}

table {
  width: 100%;
  word-break: break-all;
  border-style: solid;
}
<div style="width:200px;">
  <table>
    <tr>
      <th>Col 1</th>
      <th>Col 2</th>
      <th>Col 3</th>
      <th>Col 4</th>
      <th>Col 5</th>
    </tr>
    <tr>
      <td>data 1</td>
      <td>data 2</td>
      <td>data 3</td>
      <td>data 4</td>
      <td>data 5</td>
    </tr>
    <table>
</div>

Kanab Paul
źródło
2
Prosimy nie publikować identycznych odpowiedzi na wiele pytań. Zamiast tego po prostu odpowiedz na jedno i skomentuj (lub zaznacz / zamknij głosowanie, gdy już masz reputację), że pozostałe są duplikatami. Dla porównania
odsyłam do
Ponadto prosimy o udzielanie tylko odpowiedzi, które zawierają coś nowego. Na to rozwiązanie word-break: break-wordudzieliło już wiele, wiele odpowiedzi.
TylerH
@TylerH Dzięki za sugestię.
Kanab Paul
-3

Jest width="400"na stole, wyjmij go i będzie działać ...

dołek
źródło