Suponha que eu tenho um <div>
que eu desejo centralizar na tela do navegador (janela de visualização). Para fazer isso, preciso calcular a largura e a altura do <div>
elemento.
O que devo usar? Inclua informações sobre a compatibilidade do navegador.
javascript
html
xhtml
dhtml
snortasprocket
fonte
fonte
Respostas:
Você deve usar as propriedades
.offsetWidth
e.offsetHeight
. Observe que eles pertencem ao elemento, não.style
.var width = document.getElementById('foo').offsetWidth;
A função
.getBoundingClientRect()
retorna as dimensões e a localização do elemento como números de ponto flutuante após a realização de transformações CSS.fonte
.offsetWidth
e.offsetHeight
: developer.mozilla.org/en/Determining_the_dimensions_of_elementsoffsetWidth
será 0 se o elemento fordisplay:none
, enquanto o calculadowidth
ainda pode ter um valor positivo nessa instância.visibility:hidden
não afeta ooffsetWidth
.offsetWidth
retorna a caixa "inteira", incluindo conteúdo, preenchimento e bordas; whileclientWidth
retorna o tamanho da caixa de conteúdo sozinha (portanto, ele terá um valor menor sempre que o elemento tiver preenchimento e / ou borda diferente de zero). (mod editado para maior clareza)Dê uma olhada
Element.getBoundingClientRect()
.Este método irá devolver um objecto que contenha
width
,height
e alguns outros valores úteis:Por exemplo:
Eu acredito que isso não tem os problemas que eles fazem
.offsetWidth
e.offsetHeight
onde eles retornam às vezes0
(como discutido nos comentários aqui )Outra diferença é que
getBoundingClientRect()
pode retornar pixels fracionários, onde.offsetWidth
e.offsetHeight
arredondará para o número inteiro mais próximo.IE8 Nota :
getBoundingClientRect
não retorna altura e largura no IE8 e abaixo. *Se você deve oferecer suporte ao IE8, use
.offsetWidth
e.offsetHeight
:Vale a pena notar que o objeto retornado por esse método não é realmente um objeto normal . Suas propriedades não são enumeráveis (por exemplo,
Object.keys
não funcionam imediatamente).Mais informações aqui: Qual a melhor forma de converter um ClientRect / DomRect em um objeto simples
Referência:
.offsetHeight
: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetHeight.offsetWidth
: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetWidth.getBoundingClientRect()
: https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRectfonte
offsetHeight
eoffsetWidth
não será.NOTA : esta resposta foi escrita em 2008. Na época, a melhor solução entre navegadores para a maioria das pessoas era realmente usar o jQuery. Estou deixando a resposta aqui para a posteridade e, se você estiver usando jQuery, esta é uma boa maneira de fazê-lo. Se você estiver usando alguma outra estrutura ou JavaScript puro, a resposta aceita provavelmente é o caminho a percorrer.
A partir do jQuery 1.2.6 você pode usar uma das principais funções do CSS ,
height
ewidth
(ououterHeight
eouterWidth
, conforme o caso).fonte
Apenas para o caso de ser útil a alguém, coloquei uma caixa de texto, botão e div todos com o mesmo css:
Eu tentei em chrome, firefox e ie-edge, tentei com jquery e sem e tentei com e sem
box-sizing:border-box
. Sempre com<!DOCTYPE html>
Os resultados:
fonte
De acordo com o MDN: Determinando as Dimensões dos Elementos
offsetWidth
eoffsetHeight
retorne a "quantidade total de espaço que um elemento ocupa, incluindo a largura do conteúdo visível, barras de rolagem (se houver), preenchimento e borda"clientWidth
eclientHeight
retornar "quanto espaço o conteúdo real exibido ocupa, incluindo preenchimento, mas sem incluir a borda, as margens ou as barras de rolagem"scrollWidth
escrollHeight
retorne o "tamanho real do conteúdo, independentemente da quantidade visível no momento"Portanto, depende se o conteúdo medido deve estar fora da área visível atual.
fonte
Você só precisa calculá-lo para o IE7 e versões anteriores (e apenas se o conteúdo não tiver tamanho fixo). Sugiro o uso de comentários condicionais em HTML para limitar o hack a IEs antigos que não suportam CSS2. Para todos os outros navegadores, use este:
Esta é a solução perfeita. Centra-se
<div>
em qualquer tamanho e encolhe-o de acordo com o tamanho de seu conteúdo.fonte
É fácil modificar os estilos dos elementos, mas meio complicado de ler o valor.
O JavaScript não pode ler nenhuma propriedade de estilo de elemento (elem.style) proveniente de css (interno / externo), a menos que você use a chamada de método incorporada getComputedStyle em javascript.
Elemento: o elemento para o qual ler o valor.
pseudo: um pseudoelemento, se necessário, por exemplo: :: before. Uma cadeia vazia ou nenhum argumento significa o próprio elemento.
O resultado é um objeto com propriedades de estilo, como elem.style, mas agora com relação a todas as classes css.
Por exemplo, aqui o estilo não vê a margem:
Então, modifique seu código javaScript para incluir o getComputedStyle do elemento que você deseja obter, largura / altura ou outro atributo
Valores computados e resolvidos
Existem dois conceitos no CSS:
Há muito tempo, o getComputedStyle foi criado para obter valores computados, mas os valores resolvidos são muito mais convenientes e o padrão foi alterado.
Hoje em dia, getComputedStyle realmente retorna o valor resolvido da propriedade.
Observe:
getComputedStyle requer o nome completo da propriedade
Existem outras inconsistências. Como exemplo, alguns navegadores (Chrome) mostram 10px no documento abaixo, e alguns deles (Firefox) - não:
para mais informações https://javascript.info/styles-and-classes
fonte
element.offsetWidth e element.offsetHeight devem funcionar, conforme sugerido na postagem anterior.
No entanto, se você quiser apenas centralizar o conteúdo, existe uma maneira melhor de fazê-lo. Supondo que você use xhtml strict DOCTYPE. defina a margem: 0, propriedade automática e largura necessária em px para a tag body. O conteúdo fica alinhado ao centro com a página.
fonte
... parece CSS ajudar a colocar div no centro ...
fonte
Também você pode usar este código:
fonte
se você precisar centralizá-lo na porta de exibição do navegador; você pode conseguir isso apenas com CSS
fonte
Aqui está o código para o WKWebView que determina a altura do elemento Dom específico (não funciona corretamente para toda a página)
fonte
swift
código do iOS , certo? Não é JavaScript. Estou retendo um voto negativo (b / c isso pode realmente ser bastante útil), mas observe que isso não responde à pergunta e provavelmente seria mais apropriado em outra pergunta específica do iOS. Se já não existe, considere pedir uma e responder automaticamente.Se offsetWidth retornar 0, você poderá obter a propriedade width do estilo do elemento e procurar um número. "100 px" -> 100
/\d*/.exec(MyElement.style.width)
fonte