Tabela transbordando fora de div

94

Estou tentando impedir que uma tabela com largura declarada explicitamente transborde fora de seu pai div. Presumo que posso fazer isso de alguma forma usando max-width, mas não consigo fazer isso funcionar.

O código a seguir (com uma janela muito pequena) causará isso:

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

A linha vermelha é a borda direita do dive, se você diminuir a janela do navegador, verá que a tabela não cabe nela.

waiwai933
fonte
2
Fora do assunto: não use <center>. Ele está obsoleto há anos. Além disso, você já tem um align="center"na sua mesa.
ЯegDwight
Infelizmente, isso é algo que não tenho controle. O conteúdo dentro do div é, na verdade, incluído em um arquivo que não foi gerado por mim. Só posso tocar no CSS, mas eliminaria o <center> se pudesse.
waiwai933

Respostas:

24

Vire ao contrário fazendo:

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

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

Também o aconselharia a:

  • Não use a centertag (ela está obsoleta)
  • Não use width, bgcoloratributos, defini-los por CSS ( widthe background-color)

(assumindo que você pode controlar a tabela que foi renderizada)

Zyphrax
fonte
Se eu fizer largura: 100%, ele ignora minha margem: direita. o que causa a rolagem da barra horizontal
Jesse
208

Você pode evitar que as tabelas se expandam além de seu div pai usando table-layout:fixed.

O CSS abaixo fará com que suas tabelas se expandam para a largura da div que as cerca.

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

Eu encontrei esse truque aqui .

James Lawruk
fonte
63
Isso força todas as colunas a terem a mesma largura ... não muito útil
Serj Sagan
11
Na verdade, você ainda pode fazer as colunas com larguras diferentes, você só precisa especificar as larguras em <col>s ou nos s da primeira linha <td>(em vez de deixar fluir com base no tamanho do texto). Do MDN: "fixo: as larguras das tabelas e colunas são definidas pelas larguras dos elementos da tabela e da coluna ou pela largura da primeira linha de células. As células nas linhas subsequentes não afetam as larguras das colunas."
philfreo
1
muito obrigado. Esta foi uma grande ajuda que você tem feito por mim ...
Parthan_akon
67

Uma solução bruta é definir display: tableo div que o contém.

Questzen
fonte
8
Isso é brilhante, exatamente o que eu estava procurando. Para ajudar os outros, aqui estão algumas strings que podem ser acessadas no Google: Eu estava tentando usar CSS para ajustar o div pai para estourar ou ajustar um plano de fundo para cobrir o conteúdo da tabela estourado. Funcionou perfeitamente, muito obrigado!
trisweb
Apenas um adendo, por favor, preste atenção ao contexto onde isto está sendo aplicado, isto é usado para transmitir o layout da tabela como o comportamento e, portanto, a presença de outros atributos de estilo como linha da tabela, célula da tabela. Os layouts tabulares não são flutuantes. No momento, a exibição: propriedade da tabela por si só não é suficiente
questzen
Também vim aqui depois de horas procurando por uma resposta. Strings para mecanismo de pesquisa: a tabela dentro de div não rola, firefox. Div com tabela não rola, firefox. Nenhuma barra de rolagem aparecendo na tabela dentro de um div.
anevaude
2
Eu tentei algumas coisas, mas apenas adicionei display: table ao div pai superior. O problema foi resolvido, obrigado.
Günay Gültekin
Melhor solução para as tabelas com nomes de cabeçalho longos e conteúdo de células longas. Obrigado!.
Ege Bayrak de
34

Tentei todas as soluções mencionadas acima, mas não funcionou. Tenho 3 tabelas uma abaixo da outra. O último transbordou. Consertei usando:

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

Para o IE11 no modo de borda, você precisa definir isso para word-break:break-all

Sr. Doomsbuster
fonte
12

No começo, usei o método de James Lawruk. No entanto, isso mudou todas as larguras do td's.

A solução para mim foi usar white-space: normalnas colunas (que foi definido como white-space: nowrap). Dessa forma, o texto sempre vai quebrar. O uso word-wrap: break-wordgarantirá que tudo será interrompido quando necessário, mesmo no meio de uma palavra.

O CSS terá a seguinte aparência:

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

Essa pode nem sempre ser a solução desejável, pois word-wrap: break-wordpode tornar suas palavras ilegíveis na tabela. No entanto, manterá sua mesa com a largura certa.

Sander Koedood
fonte
5

Tentei quase tudo acima, mas não funcionou para mim ... O seguinte funcionou

word-break: break-all;

Isso deve ser adicionado ao div pai (contêiner da tabela).

Waheed Asghar
fonte
1
overflow-x: auto;
overflow-y : hidden;

Aplique o estilo acima ao div pai.

Christian Heath
fonte
-3

Tem um width="400"na mesa, retire e vai funcionar ...

Vale
fonte