Como evitar um "Flash de conteúdo não estilizado" usando células de largura fixa em tabelas CSS?
O layout da minha GUI da web é parcialmente orientado por tabelas CSS. Isto é principalmente porqueEu quero que as "células" tenham a mesma altura em todas as situações sem dores de cabeça maciças em torno do alinhamento. No geral, essa abordagem tem sido muito bem-sucedida.
No entanto, tenho um problema pelo qual a célula direita da tabela às vezes pode demorar um pouco para ser renderizada, fazendo com que a célula esquerda tenha brevemente 100% da largura da página. Isso causa um efeito perceptível de "tremulação" que, embora menor, é meio irritante. E eu decidi consertar isso.
Aqui está uma representação vaga de como minha página funciona:
#tbl { display: table; width: 200px; border: 1px solid black; }
#tbl-row { display: table-row; }
#tbl-col1,
#tbl-col2 { display: table-cell; }
#tbl-col1 { width: 50px; background-color: red; }
#tbl-col2 { background-color: blue; }
<div id="tbl">
<div id="tbl-row">
<div id="tbl-col1">LHS</div>
<div id="tbl-col2">RHS</div>
</div>
</div>
Tudo está bem até você usar suas ferramentas de desenvolvedor para fornecer#tbl-col2
a display: none
diretiva, [espero com precisão], simulando o estado do mecanismo de renderização do navegador nos momentos entre#tbl-col1
tendo sido prestado, e#tbl-col2
sendo renderizado.
Notar que#tbl-col1
ocupa imediatamente 100% da largura da tabela, apesar da largura que eu dei. Eu meio que entendo por que isso está acontecendo: afinal, eu tenhoPerguntou o navegador para fazer odiv
s se comportam como mesas. Ainda assim, é indesejável aqui.
Tentei consertar isso inserindo um "espaçador", esperando que sem umwidth
expandiria para preencher todo o espaço do lado direito até o momento em que o lado direito fosse renderizado:
#tbl { display: table; width: 200px; border: 1px solid black; }
#tbl-row { display: table-row; }
#tbl-col1,
#tbl-spc,
#tbl-col2 { display: table-cell; }
#tbl-col1 { width: 50px; background-color: red; }
#tbl-col2 { width: 150px; background-color: blue; }
<div id="tbl">
<div id="tbl-row">
<div id="tbl-col1">LHS</div>
<div id="tbl-spc"></div>
<div id="tbl-col2">RHS</div>
</div>
</div>
Como você pode ver, ocultando novamente#tbl-col2
, não fez uma diferença cega:#tbl-col1
ainda ocupava toda a largura da tabela, em vez dos 50px permitidos.
Supondo que prefiro corrigir isso do que abandonar completamente o layout das tabelas CSS, o que posso fazer?
Ou vou ter que substituir o layout ou, pior ainda, adotar uma abordagem JavaScript para resolver o FoUC?