Eu preciso obter a altura de um elemento que está dentro de uma div que está oculta. Agora eu mostro a div, obtenho a altura e oculto a div principal. Isso parece um pouco bobo. Existe uma maneira melhor?
Estou usando o jQuery 1.4.2:
$select.show();
optionHeight = $firstOption.height(); //we can only get height if its visible
$select.hide();
javascript
jquery
html
css
mkoryak
fonte
fonte
Respostas:
Você pode fazer algo assim, embora um pouco hacky, esqueça
position
se já é absoluto:fonte
position:relative
, é claro que você deseja definir isso depois em vez destatic
.Corri para o mesmo problema ao obter a largura do elemento oculto, então escrevi esse plugin chamado jQuery Actual para corrigi-lo. Ao invés de usar
usar
fornecerá o valor certo para o elemento oculto ou o elemento tem um pai oculto.
Documentação completa, consulte aqui . Há também uma demonstração incluída na página.
Espero que esta ajuda :)
fonte
Você está confundindo dois estilos CSS, o estilo de exibição e o estilo de visibilidade .
Se o elemento estiver oculto configurando o estilo css de visibilidade, você poderá obter a altura independentemente de o elemento estar ou não visível ou não, pois o elemento ainda ocupa espaço na página .
Se o elemento estiver oculto alterando o estilo css de exibição para "none", o elemento não ocupará espaço na página e você deverá fornecer um estilo de exibição que fará com que o elemento seja renderizado em algum espaço, em Nesse ponto, você pode obter a altura.
fonte
visibility
parahidden
não resolver o meu problema, mas me deu a ideia de definirposition: fixed; top: 100%
e funciona como um encanto!Na verdade, eu recorri a um pouco de truque para lidar com isso às vezes. Eu desenvolvi um widget de barra de rolagem jQuery, onde encontrei o problema que não sei com antecedência se o conteúdo rolável faz parte de uma parte oculta da marcação ou não. Aqui está o que eu fiz:
Isso funciona na maior parte do tempo, mas há um problema óbvio que pode surgir potencialmente. Se o conteúdo que você está clonando tiver um estilo com CSS que inclua referências à marcação pai em suas regras, o conteúdo clonado não conterá o estilo apropriado e provavelmente terá medidas ligeiramente diferentes. Para contornar isso, verifique se a marcação que você está clonando tem regras CSS aplicadas a ela que não incluem referências à marcação pai.
Além disso, isso não veio para mim com o meu widget de rolagem, mas para obter a altura apropriada do elemento clonado, você precisará definir a largura para a mesma largura do elemento pai. No meu caso, uma largura CSS sempre foi aplicada ao elemento real, então não precisei me preocupar com isso, no entanto, se o elemento não tiver uma largura aplicada, talvez seja necessário fazer algum tipo de recursividade. passagem da ancestralidade DOM do elemento para encontrar a largura do elemento pai apropriado.
fonte
Desenvolvendo ainda mais a resposta do usuário Nick e o plug-in do usuário hitautodestruct no JSBin, criei um plug-in jQuery semelhante que recupera largura e altura e retorna um objeto que contém esses valores.
Pode ser encontrado aqui: http://jsbin.com/ikogez/3/Atualizar
Eu reprojetei completamente esse minúsculo plugin, pois a versão anterior (mencionada acima) não era realmente utilizável em ambientes da vida real, onde muita manipulação de DOM estava acontecendo.
Isso está funcionando perfeitamente:
fonte
sizes = {"width": $wrap.width(), "height": $wrap.height()};
dothis
refere-se ao item original, que não é visível.$wrap
é ok (pelo menos nos meus testes). Eu tentei com othis
e, obviamente, ele não pegaria o tamanho, porquethis
ainda se refere ao elemento oculto.Desenvolvendo ainda mais a resposta de Nick:
Eu achei que é melhor fazer isso:
A configuração de atributos CSS os inserirá em linha, o que substituirá quaisquer outros atributos que você tiver no seu arquivo CSS. Ao remover o atributo style no elemento HTML, tudo volta ao normal e continua oculto, pois estava oculto em primeiro lugar.
fonte
$("#myDiv").css({'position':'absolute','visibility':'hidden', 'display':'block'}); optionHeight = $("#myDiv").height(); $("#myDiv").css({'position':'','visibility':'', 'display':''});
Você também pode posicionar o div oculto na tela com uma margem negativa em vez de usar a tela: nenhuma, muito parecida com a técnica de substituição da imagem de recuo do texto.
por exemplo.
Dessa forma, a altura () ainda está disponível.
fonte
Eu tento encontrar a função de trabalho para o elemento oculto, mas percebo que o CSS é muito complexo do que todos pensam. Existem muitas técnicas de layout novas no CSS3 que podem não funcionar para todas as respostas anteriores, como caixa flexível, grade, coluna ou mesmo elemento dentro de elemento pai complexo.
exemplo flexibox
Penso que a única solução sustentável e simples é a renderização em tempo real . Nesse momento, o navegador deve fornecer o tamanho correto do elemento .
Infelizmente, o JavaScript não fornece nenhum evento direto para notificar quando o elemento é exibido ou oculto. No entanto, eu crio alguma função baseada na API de modificação de atributo do DOM que executará a função de retorno de chamada quando a visibilidade do elemento for alterada.
Para mais informações, visite o meu projeto no GitHub.
https://github.com/Soul-Master/visible.event.js
demo: http://jsbin.com/ETiGIre/7
fonte
style
alterações de atributo (consulte a linha 59 aqui ), enquanto as alterações de visibilidade também podem ser causadas por alterações noclass
atributo.Seguindo a solução de Nick Craver, definir a visibilidade do elemento permite obter dimensões precisas. Eu usei essa solução com muita frequência. No entanto, tendo que redefinir os estilos manualmente, cheguei a achar isso complicado, já que ao modificar o posicionamento / exibição inicial do elemento no meu css durante o desenvolvimento, muitas vezes esqueço de atualizar o código javascript relacionado. O código a seguir não redefine os estilos, por exemplo, mas remove os estilos embutidos adicionados pelo javascript:
A única suposição aqui é que não pode haver outros estilos embutidos ou eles serão removidos também. O benefício aqui, no entanto, é que os estilos do elemento são retornados ao que eram na folha de estilo css. Como conseqüência, você pode escrever isso como uma função na qual um elemento é passado e uma altura ou largura é retornada.
Outro problema que encontrei ao definir os estilos em linha via js é que, ao lidar com transições por meio do css3, você é forçado a adaptar os pesos de suas regras de estilo para serem mais fortes do que um estilo em linha, o que às vezes pode ser frustrante.
fonte
Por definição, um elemento só tem altura se estiver visível.
Apenas curioso: por que você precisa da altura de um elemento oculto?
Uma alternativa é ocultar efetivamente um elemento, colocando-o para trás (usando o z-index) de algum tipo de sobreposição).
fonte
Na minha circunstância, eu também tinha um elemento oculto que me impedia de obter o valor da altura, mas não era o elemento em si, mas um dos pais ... então, verifiquei um dos meus plugins para ver se é oculto, encontre o elemento oculto mais próximo. Aqui está um exemplo:
Na verdade, essa é uma amálgama das respostas de Nick, Gregory e Eyelidlessness para fornecer o uso do método aprimorado de Gregory, mas utiliza os dois métodos, caso haja algo no atributo de estilo que você queira colocar de volta e procure por um elemento pai.
Minha única reclamação com a minha solução é que o laço entre os pais não é totalmente eficiente.
fonte
Uma solução alternativa é criar uma div principal fora do elemento do qual você deseja obter a altura, aplicar uma altura de '0' e ocultar qualquer estouro. Em seguida, pegue a altura do elemento filho e remova a propriedade overflow do pai.
fonte
Aqui está um script que escrevi para lidar com todos os métodos de dimensão do jQuery para elementos ocultos, mesmo descendentes de pais ocultos. Observe que, é claro, há um impacto no desempenho usando isso.
fonte
Se você já exibiu o elemento na página anteriormente, pode simplesmente pegar a altura diretamente do elemento DOM (alcançável no jQuery com .get (0)), pois ele é definido mesmo quando o elemento está oculto:
o mesmo para a largura:
(graças a Skeets O'Reilly pela correção)
fonte
undefined
display='none'
, isso não funcionará.