Por que o scrollWidth inclui apenas o preenchimento esquerdo?
Então eu tenho um DIV#Wrapper
que tem uma largura fixa. Dentro desse DIV, eu tenho outro DIV#Panel
que também tem uma largura fixa:
<code><div id="Wrapper"> <p>...</p> <div id="Panel">Panel</div> <p>...</p> </div> </code>
Às vezes, a largura do Painel é maior do que a do Wrapper, e nesses casos eu gostaria de ampliar o Wrapper via JavaScript, para que ele envolva o Painel perfeitamente.
Demonstração ao vivo: http://jsfiddle.net/H6rML/
Eu pretendia usar.scrollWidth
no Wrapper para determinar a largura do painel. No entanto, o problema é que o Wrapper tem preenchimento horizontal, e o.scrollWidth
por algum motivo, inclui apenas o preenchimento esquerdo do invólucro. Assim:
<code>Wrapper.scrollWidth === Wrapper.LeftPadding + Panel.Width </code>
Então, dado:
<code>#Wrapper { width: 200px; padding: 10px; } #Panel { width: 300px; } </code>
Wrapper.scrollWidth
devolve310px
, o que não é muito útil. E se.scrollWidth
não incluiu nenhum preenchimento e apenas retornou a largura do painel, eu poderia trabalhar com isso (eu adicionaria o preenchimento manualmente a esse valor). Se ambos os paddings fossem incluídos, eu também poderia trabalhar com isso. Mas por que apenas o preenchimento esquerdo está incluído? (Btw este comportamento parece ser cross-browser.)
Algumas notas adicionais:
Não consigo definir a largura no Wrapper diretamente. No meu código real, defino a largura em um elemento ancestral que é vários níveis acima do Wrapper e uso uma API personalizada para definir a largura. É por isso que preciso recuperar o320px
valor.
Eu gostaria de uma solução que não depende do conteúdo do Wrapper. Na minha demonstração, é um painel, mas em outros cenários pode haver um elemento diferente que transborda ou até vários elementos. É por isso que eu fui com.scrollWidth
no invólucro.
Existe uma maneira de obter o valor320px
sem ter que adicionar manualmente o preenchimento certo para o.scrollWidth
valor?
Btw, de acordo com o padrão, o preenchimento direito deve ser incluído:
O atributo scrollWidth deve retornar o resultado da execução destas etapas:
Se o elemento não tiver nenhuma caixa de layout CSS associada, retorne zero e termine essas etapas.
Se o elemento for o elemento raiz e o Documento não estiver no modo quirks, retorne max (largura do conteúdo do documento, valor de innerWidth).
Se o elemento for o elemento de corpo HTML e o Documento estiver no modo quirks, retorne max (largura do conteúdo do documento, valor de innerWidth).
Retorna o valor computado da propriedade 'padding-left', mais o valor computado de 'padding-right', mais a largura do conteúdo do elemento.
Fonte:http://www.w3.org/TR/cssom-view/
Por que os navegadores não se comportam de acordo?
Para melhorar ainda mais a clareza do meu post, deixe-me resumir as duas principais questões:
(1) Se a norma afirmar que o preenchimento correto deve ser incluído no.scrollWidth
valor, então por que os navegadores não se comportam de acordo?
(2) É possível recuperar o valor correto (320px
no meu caso), sem ter que adicionar manualmente o preenchimento correto?
A resposta a esta pergunta está localizada aqui:Quando um elemento filho estourar horizontalmente, por que o preenchimento correto do pai é ignorado?