Eu tenho um problema muito estranho ... em todos os navegadores e versões móveis, encontrei esse comportamento:
- todos os navegadores têm um menu superior quando você carrega a página (mostrando a barra de endereço, por exemplo), que desliza para cima quando você começa a rolar a página.
- Às vezes, 100vh é calculado apenas na parte visível de uma janela de visualização; portanto, quando a barra do navegador desliza para cima, 100vh aumenta (em termos de pixels)
- todo o layout repintar e reajustar, pois as dimensões foram alteradas
- um efeito ruim para a experiência do usuário
Como evitar esse problema? Quando ouvi pela primeira vez sobre o viewport-height, fiquei empolgado e pensei em usá-lo para blocos de altura fixa em vez de usar javascript, mas agora acho que a única maneira de fazer isso é de fato o javascript com algum evento de redimensionamento ...
você pode ver o problema em: site de amostra
Alguém pode me ajudar com / sugerir uma solução CSS?
código de teste simples:
html
css
viewport-units
Nereo Costacurta
fonte
fonte
transition: 0.5s
ou mais, para tornar a alteração menos abrupta?Respostas:
Infelizmente isso é intencional…
Esse é um problema bem conhecido (pelo menos no safari mobile), que é intencional, pois evita outros problemas. Benjamin Poulain respondeu a um bug do webkit :
Nicolas Hoizey pesquisou bastante isso: https://nicolas-hoizey.com/2015/02/viewport-height-is-taller-than-the-visible-part-of-the-document-in-some-mobile -browsers.html
Nenhuma correção planejada
Nesse ponto, não há muito o que fazer, exceto evitar o uso da altura da janela de exibição em dispositivos móveis. O Chrome também mudou para isso em 2016:
fonte
$(window).height()
não é afetado por esse bug, então vou por esse caminho. obrigado!position:fixed
. Isso é semelhante à implementação no Safari. Leia mais: developers.google.com/web/updates/2016/12/url-bar-resizingvh
ou<html> 100%
altura após o carregamento inicial. Na verdade, isso é ótimo - como o layout debulhando / refluindo quando as ocultas da barra de URL podem parecer terríveis.Firefox
eEdge
Mobile
ainda atualizar dinamicamentevh
e<html>
altura, causando muita lacrimejamento e redimensionamento de todos os componentes durante a rolagem, especialmente ruim se estiver usando SVGs de imagens de fundoVocê pode tentar
min-height: -webkit-fill-available;
em seu css em vez de100vh
. Deve ser resolvidofonte
min-height: 100vh;
como um substituto onde-webkit-fill-available
não é suportado.min-height: 100vh;
-se lá, pois, caso contrário , ele trava em navegadores como o Firefox (pelo menos na área de trabalho, o iOS usa o webkit, independentemente do navegador).no meu aplicativo, eu faço da seguinte maneira (postscript datilografado e aninhado, altere o código adequadamente):
no seu css:
funciona pelo menos no chrome mobile e ipad. O que não funciona é quando você adiciona seu aplicativo à tela inicial no iOS e altera a orientação algumas vezes - de alguma forma, os níveis de zoom interferem com o valor innerHeight, posso postar uma atualização se encontrar uma solução para ele.
Demo
fonte
Para muitos dos sites que eu construo, o cliente solicita um banner de 100vh e, exatamente como você encontrou, resulta em uma experiência "irregular" no celular quando você começa a rolar. É assim que resolvo o problema para uma experiência consistente e uniforme em todos os dispositivos:
Primeiro, defino meu elemento CSS do banner como
height:100vh
Então eu uso o jQuery para obter a altura em pixels do meu elemento banner e aplicar um estilo embutido usando essa altura.
Isso resolve o problema em dispositivos móveis, como quando a página é carregada, o elemento banner é definido como 100vh usando CSS e o jQuery substitui isso colocando CSS embutido no elemento banner, o que impede o redimensionamento quando um usuário começa a rolar.
No entanto, na área de trabalho, se um usuário redimensionar sua janela do navegador, meu elemento banner não será redimensionado porque agora possui uma altura fixa definida em pixels devido ao jQuery acima. Para resolver isso, uso o Mobile Detect para adicionar uma classe 'mobile' ao corpo do meu documento. E então envolvo o jQuery acima em uma instrução if:
Como resultado, se um usuário estiver em um dispositivo móvel, a classe 'mobile' estará presente no corpo da minha página e o jQuery acima será executado. Portanto, meu elemento banner só obterá o CSS embutido aplicado em dispositivos móveis enquanto isso, no desktop, a regra original de 100vh CSS permanece em vigor.
fonte
$('.banner').css({ height: window.innerHeight });
, que é a altura "real" da janela de exibição. Exemplo de como o innerHeight funcionadocument.querySelector('.banner').style.height = window.innerHeight;
para pessoas que escrevem JavaScript real.Veja esta resposta: https://css-tricks.com/the-trick-to-viewport-units-on-mobile/
fonte
Eu vim com um componente React - verifique se você usa o React ou procure o código-fonte se não o fizer, para que você possa adaptá-lo ao seu ambiente.
Ele define a altura do div em tela cheia
window.innerHeight
e atualiza-o no redimensionamento da janela.fonte
Como eu estava procurando uma solução em alguns dias, aqui está a minha para todos que usam o VueJS com Vuetify (minha solução usa v-app-bar, v-navigation-drawer e v-footer): Criei App.scss (usado no App. vue) com o seguinte conteúdo:
fonte
Para mim, esse truque fez um trabalho:
fonte
@nils explicou claramente.
O que vem a seguir então?
Acabei de voltar a usar relativo 'clássico'
%
(porcentagem) em CSS.Muitas vezes, é mais difícil implementar algo do que seria usado
vh
, mas pelo menos, você tem uma solução bastante estável que funciona em diferentes dispositivos e navegadores sem falhas estranhas na interface do usuário.fonte
Acabei de encontrar um aplicativo Web que eu projetei com esse problema nos iPhones e iPads e encontrei um artigo sugerindo resolvê-lo usando consultas de mídia direcionadas a dispositivos Apple específicos.
Não sei se posso compartilhar o código desse artigo aqui, mas o endereço é este: http://webdesignerwall.com/tutorials/css-fix-for-ios-vh-unit-bug
Citando o artigo: "apenas combine a altura do elemento com a altura do dispositivo usando consultas de mídia direcionadas às versões mais antigas da resolução do iPhone e iPad".
Eles adicionaram apenas 6 consultas de mídia para adaptar elementos de altura total e devem funcionar como totalmente implementados em CSS.
Editar pendente: não posso testá-lo no momento, mas voltarei e relatarei meus resultados.
fonte
Como sou novo, não posso comentar sobre outras respostas.
Se alguém está procurando uma resposta para fazer isso funcionar (e pode usar javascript - como parece ser necessário para fazer isso funcionar no momento), essa abordagem funcionou muito bem para mim e é responsável também pela alteração da orientação móvel. Eu uso o Jquery para o código de exemplo, mas deve ser possível com o vanillaJS.
-Primeiro, eu uso um script para detectar se o dispositivo está tocando ou passa o mouse. Exemplo básico:
Isso adiciona classe ao elemento body de acordo com o tipo de dispositivo (foco ou toque) que pode ser usado posteriormente para o script de altura.
-Em seguida, use este código para definir a altura do dispositivo na carga e na mudança de orientação:
-Tempo limite é definido para que o dispositivo calcule a nova altura corretamente na mudança de orientação. Se não houver tempo limite, na minha experiência, a altura não estará correta. 500ms pode ser um exagero, mas funcionou para mim.
-100vh em dispositivos suspensos é um substituto se o navegador substituir o CSS 100vh.
fonte
O código a seguir resolveu o problema (com jQuery).
E os outros elementos usam
%
como uma unidade para substituirvh
.fonte
Aqui está uma solução que eu usei para o meu aplicativo React.
iPhone 11 Pro e iPhone Pro Max - 120px
iPhone 8 - 80px
É uma solução comprometida, mas relativamente simples
fonte
O seguinte funcionou para mim:
O
body
levará a altura janela visível e#your-app-container
comheight: 100%
vai fazer esse recipiente tomar a altura janela visível.fonte
Felizmente, essa será uma variável de ambiente CSS definida pela UA, conforme sugerido aqui: https://github.com/w3c/csswg-drafts/issues/2630#issuecomment-397536046
fonte
Porque ele não será corrigido, você pode fazer algo como:
Para mim, era a solução mais rápida e pura do que brincar com o JavaScript, que não funcionava em muitos dispositivos e navegadores.
Basta usar o valor adequado
vh
que atenda às suas necessidades.fonte
O uso de vh em dispositivos móveis não funcionará com 100vh, devido às opções de design que utilizam toda a altura do dispositivo, sem incluir barras de endereço etc.
Se você está procurando um layout que inclua alturas de div proporcionais à verdadeira altura da vista, eu uso a seguinte solução css pura:
Você tem duas opções para definir a altura da janela de visualização, defina manualmente --devHeight como uma altura que funcione (mas será necessário inserir esse valor para cada tipo de dispositivo que você está codificando)
ou
Use javascript para obter a altura da janela e, em seguida, atualize --devheight ao carregar e atualizar a viewport (no entanto, isso requer o uso de javascript e não é uma solução css pura)
Depois de obter a altura correta da vista, você pode criar várias divs em uma porcentagem exata da altura total da janela de visualização, simplesmente alterando o multiplicador em cada div à qual você atribui a altura.
0,10 = 10% da altura da vista 0,57 = 57% da altura da vista
Espero que isso possa ajudar alguém;)
fonte
Você pode fazer isso adicionando o seguinte script e estilo
Estilo
fonte
Tente
html, body { height: 100% }
algo com o efeito de 100vh em dispositivos móveis.fonte
Você pode tentar atribuir
position: fixed; top: 0; bottom: 0;
propriedades ao seu contêiner.fonte