Alguém sabe por que os elementos de entrada com largura de 100% ultrapassam a borda das células da tabela.
No exemplo simples abaixo, a caixa de entrada ultrapassa a borda das células da tabela e o resultado é horrível. Isso foi testado e acontece da mesma forma em: Firefox, IE7 e Safari.
Isso faz sentido para você? Estou faltando alguma coisa, você sabe sobre uma possível solução?
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <!-- don't use closing slash in meta tag, it breaks HTML4.01 transitional -->
<title>Test input text in table</title>
<style type="text/css">
table {border-top: 1px solid #ff0000; border-left: 1px solid #ff0000;}
table td {border-right: 1px solid #00ff00; border-bottom: 1px solid #00ff00;}
input[type="text"] {width: 100%;} /* removing this would make input not to go over cells border, but they would be too short, I want them to fit cells size */
</style>
</head><body>
<table cellpadding="0" cellspacing="0">
<tr>
<td><p>column one hello babe babe babe</p></td>
<td><p>column two hello babe more</p></td>
<td><p>column three hello babe more and more</p></td>
</tr>
<tr>
<td><input type="text" value="test"></td>
<td><input type="text" value="test"></td>
<td><input type="text" value="test"></td>
</tr>
</table>
</body></html>
html
input
html-table
width
Marco Demaio
fonte
fonte
form
com aslabel
s einput
s dentro de umul
ouol
. que é, pelo menos, um pouco mais semântico. Certamente, você deve usar umform
, mesmo que continue com otable
.Respostas:
Você pode usar a
box-sizing
propriedade CSS3 para incluir o preenchimento externo e a borda:fonte
<!--[if lt IE 8]>
einput[type="text"] {width:95%}
O valor da largura não leva em consideração a borda ou o preenchimento:
http://www.htmldog.com/reference/cssproperties/width/
Você obtém 2 px de preenchimento em cada lado, mais 1 px de borda em cada lado.
100% + 2 * (2px + 1px) = 100% + 6px, que é mais do que 100% de conteúdo filho que o td pai tem.
Você tem a opção de:
box-sizing: border-box;
conforme a resposta de @pricco ;fonte
text-indent
para simular o preenchimento à frente da borda do texto eline-height
para o preenchimento vertical (embora manter o preenchimento vertical não afetaria a largura de qualquer maneira).O problema com coisas assim
width:95%;
é que elas não parecem certas em layouts largos e flexíveis (porque 5% podem ter 30 pixels).As soluções a seguir funcionam muito bem para mim (testado no Firefox, IE 9, Safari):
(adicionadas as cores para tornar mais fácil notar o preenchimento correto)
O truque é envolver a entrada com dois divs, o externo tem uma margem de 3px (o que o torna 3px menor que o td), o interno tem um preenchimento de 3px. Isso torna a entrada 6px menor que o td, que é o que você queria para começar.
Não tenho certeza sobre a mecânica disso, mas funciona.
Neste exemplo simples, ele também funciona com apenas um único div com margem direita 6. No entanto, no caso do meu aplicativo da web, apenas a solução acima funciona.
fonte
O problema foi explicado anteriormente, por isso vou apenas reiterar: a largura não leva em conta a borda e o enchimento. Uma resposta possível a isso não discutida, mas que descobri que me ajudou bastante, é embrulhar suas entradas. Aqui está o código e explicarei como isso ajuda em um segundo:
O DIV que envolve o INPUT não tem preenchimento nem borda. Esta é a solução. Um DIV se expandirá para o tamanho de seu contêiner, mas também respeitará a borda e o preenchimento. Agora, o INPUT não terá problemas para expandir para o tamanho de seu contêiner, pois ele é sem borda e sem almofada. Observe também que o DIV tem seu overflow definido como oculto. Parece que, por padrão, os itens podem cair fora de seu contêiner com o estouro padrão de visível. Isso apenas garante que a entrada permaneça dentro de seu contêiner e não tente penetrar.
Eu testei isso no Chrome e no Fire Fox. Ambos parecem respeitar bem esta solução.
ATUALIZAÇÃO : como acabei de receber uma votação negativa aleatória, gostaria de dizer que a melhor maneira de lidar com o estouro é com o atributo box-sizing CSS3, conforme descrito por pricco:
Isso parece ser muito bem suportado pelos principais navegadores e não é "hacky" como o truque de estouro. Existem, no entanto, alguns problemas menores nos navegadores atuais com essa abordagem (consulte http://caniuse.com/#search=box-sizing Problemas conhecidos).
fonte
overflow: hidden;
o conteúdo ainda 'cutucado' para fora da caixa exatamente da mesma maneira, mas é truncado em vez de ser mostrado - então não se sobrepõe a outro conteúdo.Eu sei que esta pergunta tem 3 anos, mas o problema ainda persiste para os navegadores atuais e as pessoas ainda estão vindo aqui. A solução por enquanto é calc () :
É compatível com a maioria dos navegadores modernos.
fonte
O problema é devido ao modelo da caixa do elemento de entrada. Recentemente, encontrei uma boa solução para o problema ao tentar manter minha entrada em 100% para dispositivos móveis.
Envolva sua entrada com outro elemento, um div, por exemplo. Em seguida, aplique o estilo que você deseja para sua entrada a esse div do wrapper. Por exemplo:
Forneça um preenchimento de canto arredondado de .input-wrapper, etc., o que quiser para sua entrada e, em seguida, forneça a largura de entrada 100%. Você tem sua entrada preenchida com uma borda, etc, mas sem o estouro irritante!
fonte
Corrigi esse problema começando com a resposta de @allodom. Todas as minhas entradas estavam contidas em li, então tudo que eu tive que fazer foi definir o estouro de li: oculto para remover esse estouro de entrada em excesso.
fonte
em vez desta luta de margem apenas faça
desta forma a borda da célula fica visível e você pode controlar a cor de fundo da linha
fonte
Retire o "http://www.w3.org/TR/html4/loose.dtd" da declaração DOCTYPE e resolva o seu problema.
Felicidades! :)
fonte
http://www.w3.org/TR/html4/strict.dtd
Strict? ref. w3.org/QA/2002/04/valid-dtd-list.html De qualquer forma, esta não é uma opção, pois alterar o DOCTYPE agora provavelmente afetaria a renderização de muitas outras coisas nas páginas da web.Com algum Javascript, você pode obter a largura exata do TD que o contém e atribuí-la diretamente ao elemento de entrada.
O que se segue é javascript bruto, mas jQuery o tornaria mais limpo ...
Os problemas com esta solução são:
1) Se você tiver suas entradas contidas em outro elemento, como um SPAN, precisará fazer um loop e encontrar o TD, porque elementos como os SPANs envolverão a entrada e mostrarão seu tamanho, em vez de serem limitados ao tamanho do TD.
2) Se você tiver preenchimento ou margens adicionados em níveis diferentes, talvez seja necessário subtrair explicitamente de [pEl.offsetWidth]. Dependendo de sua estrutura HTML, isso pode ser calculado.
3) Se as colunas da tabela forem dimensionadas dinamicamente, alterar o tamanho de um elemento fará com que a tabela reflua em alguns navegadores e você poderá obter um efeito escalonado conforme "corrige" sequencialmente os tamanhos de entrada. A solução é atribuir larguras específicas para a coluna como porcentagens ou pixels OU coletar as novas larguras e defini-las depois. Veja o código abaixo ..
fonte
Resolvi o problema aplicando
box-sizing:border-box
; para as próprias células da tabela, além de fazer o mesmo com a entrada e o wrapper.fonte
Eu resolvi o problema usando este
fonte
Eu geralmente defino a largura de minhas entradas para 99% para corrigir isso:
Você também pode remover os estilos padrão, mas isso tornará menos óbvio que se trata de uma caixa de texto. No entanto, vou mostrar o código para isso de qualquer maneira:
Ad @ m
fonte
O problema reside no
border-width
elemento de entrada. Em breve, tente definir omargin-left
do elemento de entrada como-2px
.fonte