Atualmente, estou desenvolvendo um site responsivo usando o Twitter Bootstrap.
O site tem uma imagem de plano de fundo em tela cheia no celular / tablet / computador. Essas imagens giram e desbotam através de cada uma, usando duas divs.
É quase perfeito, exceto um problema. Usando o iOS Safari, o Navegador Android ou o Chrome no Android, o fundo salta levemente quando um usuário rola a página e faz com que a barra de endereços oculte.
O site está aqui: http://lt2.daveclarke.me/
Visite-o em um dispositivo móvel e role para baixo e você verá a imagem redimensionada / movida.
O código que estou usando para o DIV em segundo plano é o seguinte:
#bg1 {
background-color: #3d3d3f;
background-repeat:no-repeat;
background-attachment:fixed;
background-position:center center;
-webkit-background-size: cover;
-moz-background-size: cover;
-o-background-size: cover;
background-size: cover; position:fixed;
width:100%;
height:100%;
left:0px;
top:0px;
z-index:-1;
display:none;
}
Todas as sugestões são bem-vindas - isso está me deixando louco por um tempo!
position: fixed
.Respostas:
Esse problema é causado pelas barras de URL encolhendo / deslizando para fora do caminho e alterando o tamanho das divs # bg1 e # bg2, pois elas têm 100% de altura e são "fixas". Como a imagem de fundo está definida como "capa", ela ajusta o tamanho / posição da imagem, pois a área que contém é maior.
Com base na natureza responsiva do site, o plano de fundo deve ser escalado. Tenho duas soluções possíveis:
1) Defina a altura # bg1, # bg2 como 100vh. Em teoria, esta é uma solução elegante. No entanto, o iOS possui um bug vh ( http://thatemil.com/blog/2013/06/13/viewport-relative-unit-strangeness-in-ios-6/ ). Tentei usar uma altura máxima para evitar o problema, mas ele permaneceu.
2) O tamanho da janela de visualização, quando determinado pelo Javascript, não é afetado pela barra de URL. Portanto, o Javascript pode ser usado para definir uma altura estática no # bg1 e # bg2 com base no tamanho da viewport. Esta não é a melhor solução, pois não é CSS puro e há um ligeiro salto de imagem no carregamento da página. No entanto, é a única solução viável que considero considerar os erros "vh" do iOS (que não parecem estar corrigidos no iOS 7).
Em uma nota lateral, vi muitos problemas com essas barras de URL de redimensionamento no iOS e Android. Entendo o objetivo, mas eles realmente precisam pensar nas estranhas funcionalidades e estragos que causam nos sites. A última alteração é que você não pode mais "ocultar" a barra de URL no carregamento da página no iOS ou Chrome usando truques de rolagem.
EDIT: Embora o script acima funcione perfeitamente para impedir o redimensionamento do plano de fundo, ele causa uma lacuna perceptível quando os usuários rolam para baixo. Isso ocorre porque ele mantém o plano de fundo dimensionado para 100% da altura da tela menos a barra de URL. Se adicionarmos 60px à altura, como sugere swiss, esse problema desaparecerá. Isso significa que não conseguimos ver os 60px inferiores da imagem de plano de fundo quando a barra de URL está presente, mas impede que os usuários vejam uma lacuna.
fonte
bg.height(jQuery(window).height() + 60);
que funciona perfeitamente em todos os meus dispositivos! Obrigado :)vh
unidades e, claro,100vh
é maior quando a barra de endereços está oculta. É estúpido que esse salto ocorra após a rolagem parar. Parece apenas com bugs. Acabei usando a transição na altura para parecer intencional.body
para um invólucro,<div>
envolvendo o conteúdo da página inteira. Sem fundos de salto no iOS ou Android!Eu descobri que a resposta de Jason não estava funcionando muito bem para mim e eu ainda estava dando um pulo. O Javascript garantiu que não houvesse lacunas na parte superior da página, mas o plano de fundo continuava saltando sempre que a barra de endereço desaparecia / reaparecia. Assim como a correção de Javascript, apliquei
transition: height 999999s
a div. Isso cria uma transição com uma duração tão longa que praticamente congela o elemento.fonte
vw
ouvh
definir o tamanho da fonte dentro desse contêiner pai.Eu tenho um problema semelhante no cabeçalho do nosso site.
Isso resultará em uma experiência de rolagem irregular no Android Chrome, porque o contêiner .header será redimensionado após a barra de url ocultar e o dedo ser removido da tela.
Solução CSS:
A adição das duas linhas a seguir impedirá que a barra de URL oculte e a rolagem vertical ainda seja possível:
fonte
O problema pode ser resolvido com uma consulta de mídia e um pouco de matemática. Aqui está uma solução para uma orientação portait:
Como vh mudará quando a barra de URL desaparecer, é necessário determinar a altura de outra maneira. Felizmente, a largura da janela de visualização é constante e os dispositivos móveis têm apenas algumas proporções diferentes; se você pode determinar a largura e a proporção, um pouco de matemática fornecerá a altura da janela de visualização exatamente como vh deve funcionar. Aqui está o processo
1) Crie uma série de consultas de mídia para as proporções que você deseja atingir.
use a proporção de aspecto do dispositivo em vez da proporção, pois o último será redimensionado quando a barra de URL desaparecer
Adicionei 'max' à proporção de aspecto do dispositivo para segmentar as proporções que se seguem entre as mais populares. Eles não serão tão precisos, mas serão apenas para uma minoria de usuários e ainda estarão bem próximos do vh adequado.
lembre-se da consulta de mídia usando horizontal / vertical, portanto, para portait, você precisará inverter os números
2) para cada consulta de mídia, multiplique qualquer porcentagem da altura vertical que você deseja que o elemento esteja em vw pelo inverso da proporção.
3) Você precisa determinar a altura da barra de URL e menos a partir da altura. Não encontrei medidas exatas, mas uso 9% para dispositivos móveis em paisagem e isso parece funcionar bastante bem.
Esta não é uma solução muito elegante, mas as outras opções também não são muito boas, considerando que são:
Tendo seu site parecido com o usuário,
com elementos de tamanho inadequado, ou
Usando javascript para obter alguns estilos básicos ,
A desvantagem é que alguns dispositivos podem ter alturas ou proporções de barra de URL diferentes das mais populares. No entanto, usar esse método se apenas um pequeno número de dispositivos sofrer a adição / subtração de alguns pixels, isso me parece muito melhor do que todos os que têm um site redimensionado ao passar o dedo.
Para facilitar, também criei um mixin SASS:
fonte
@mixin vh-fix($vh: 100)
=>height: calc(100vw * (1.333 * $vh / 100) - 9%)
height: calc(100vw * (1.333 * #{$vh} / 100) - 9%)
-9%
.Todas as respostas aqui estão usando a
window
altura, que é afetada pela barra de URL. Todo mundo se esqueceu dascreen
altura?Aqui está a minha solução jQuery:
A adição da
.css()
peça está alterando o elemento posicionado absoluto inevitavelmente alinhado na parte superior para alinhado na parte inferior, para que não haja nenhum salto. Embora, suponha que não há razão para não adicionar isso diretamente ao CSS normal.Precisamos do farejador do agente do usuário, pois a altura da tela nos desktops não seria útil.
Além disso, tudo isso é assumido
#background
como um elemento de posição fixa que preenche a janela.Para os puristas do JavaScript (aviso - não testado):
EDIT: Desculpe, isso não responde diretamente ao seu problema específico com mais de um plano de fundo. Mas este é um dos primeiros resultados ao procurar esse problema de fundos fixos saltando no celular.
fonte
Também deparei com esse problema quando estava tentando criar uma tela de entrada que abarcasse toda a janela de exibição. Infelizmente, a resposta aceita não funciona mais.
1) Elementos com a altura definida para
100vh
ser redimensionado toda vez que o tamanho da janela de visualização mudar, incluindo aqueles casos em que é causado por (des) barra de URL que aparece.2)
$(window).height()
retorna valores também afetados pelo tamanho da barra de URL.Uma solução é "congelar" o elemento,
transition: height 999999s
conforme sugerido na resposta de AlexKempton . A desvantagem é que isso desativa efetivamente a adaptação a todas as alterações no tamanho da janela de exibição, incluindo aquelas causadas pela rotação da tela.Portanto, minha solução é gerenciar as alterações na viewport manualmente usando JavaScript. Isso me permite ignorar as pequenas alterações que provavelmente são causadas pela barra de URL e reagir apenas às grandes.
Edição: Eu realmente uso essa técnica junto com
height: 100vh
. A página é renderizada corretamente desde o início e, em seguida, o javascript entra em ação e começa a gerenciar a altura manualmente. Dessa forma, não há oscilações durante o carregamento da página (ou mesmo depois).fonte
height: 100vh
no CSS inicial, definomin-height:100vh
e, em seguida, redimensiono a janela, calculo o valormin-height
e defino-o na altura da porta de exibição. Isso é útil quando o site é visualizado em telas minúsculas e o conteúdo é muito grande para caber na janela de visualização. A debounce / acelerador setTimeout no redimensionamento evento ajuda a melhorar o desempenho em alguns navegadores (redimensionamento tende a fogo muito frequentemente)min-height
mas depois me deparei com um problema quando precisava centralizar verticalmente o conteúdo interno. De alguma forma, a centralização vertical pode ficar complicada quando o elemento externo estiverheight
definido comoauto
. Então, criei uma altura mínima fixa que deveria ser suficiente para conter qualquer tipo de conteúdo possível e defini-lo no CSS inicial. Comomin-height
tem uma prioridade mais alta do queheight
, funciona muito bem.display: table
e configurando o contêiner interno paradisplay: table-cell
withvertical-align: middle
. Funcionou como um encanto.A solução que eu estou usando atualmente é verificar o
userAgent
sobre$(document).ready
para ver se ele é um dos navegadores ofender. Se for, siga estes passos:$(window).resize
atualize apenas os valores de altura relevantes se a nova dimensão da viewport horizontal for diferente do valor inicialOpcionalmente, você também pode testar permitindo redimensionamentos verticais somente quando estiverem além da altura da (s) barra (s) de endereço.
Ah, e a barra de endereço afeta
$(window).height
. Consulte: A barra de endereço do navegador Mobile Webkit (chrome) altera $ (window) .height (); tornando o tamanho do plano de fundo: a capa é redimensionada toda vez que JS "Window" largura-altura vs "tela" largura-altura?fonte
Encontrei uma solução muito fácil sem o uso de Javascript:
Tudo o que isso faz é atrasar o movimento, para que seja incrivelmente lento e não seja perceptível.
fonte
100%
,100vh
. O IE8 é o único navegador principal que não suporta transições.Minha solução envolveu um pouco de javascript. Mantenha 100% ou 100vh na div (isso evitará que a div não apareça no carregamento da página inicial). Depois, quando a página carregar, agarre a altura da janela e aplique-a ao elemento em questão. Evita o salto, porque agora você tem uma altura estática no seu div.
fonte
Criei uma solução javascript de baunilha para usar unidades VH. O uso do VH em praticamente qualquer lugar é efetuado pelas barras de endereço, minimizando a rolagem. Para corrigir o jank que mostra quando a página é redesenhada, eu tenho esses js aqui que capturam todos os seus elementos usando unidades VH (se você der a classe
.vh-fix
) e oferecem alturas de pixel embutidas. Congelando-os essencialmente na altura que queremos. Você pode fazer isso na rotação ou na alteração do tamanho da janela de exibição para permanecer responsivo.Isso resolveu todos os meus casos de uso, espero que ajude.
fonte
esta é a minha solução para resolver esse problema, adicionei comentários diretamente no código. Eu testei esta solução e funciona bem. Espero que estejamos úteis para que todos tenham o mesmo problema.
fonte
Esta é a melhor solução (mais simples) acima de tudo que tentei.
... E isso não mantém a experiência nativa da barra de endereços !
Você pode definir a altura com CSS como 100%, por exemplo, e depois definir a altura como 0,9 * da altura da janela em px com javascript, quando o documento for carregado.
Por exemplo, com jQuery:
$("#element").css("height", 0.9*$(window).height());
)
Infelizmente, não há nada que funcione com CSS: P puro, mas também que seja minucioso
vh
e com problemasvw
nos iPhones - use porcentagens.fonte
Defino meu elemento de largura, com javascript. Depois de definir o de vh.
html
css
javascript
Isso funciona para mim. Eu não uso o jquery ect. porque eu quero que ele carregue o mais rápido possível.
fonte
Demorou algumas horas para entender todos os detalhes desse problema e descobrir a melhor implementação. Acontece que, a partir de abril de 2016, apenas o iOS Chrome tem esse problema. Eu tentei no Android Chrome e no iOS Safari - ambos estavam bem sem essa correção. Portanto, a correção para o iOS Chrome que estou usando é:
fonte
Resposta simples, se o seu plano de fundo permitir, por que não definir o tamanho do plano de fundo: para algo que cubra a largura do dispositivo com consultas de mídia e use ao lado da posição: depois: fixa; hackear aqui .
IE: tamanho do plano de fundo: 901px; para qualquer tela <900px? Não é perfeito ou responsivo, mas funcionou um charme para mim em dispositivos móveis <480px, pois estou usando um BG abstrato.
fonte
Estou usando esta solução alternativa: Corrija a altura do bg1 no carregamento da página:
Em seguida, anexe um ouvinte de evento de redimensionamento à janela que faça isso: se a diferença de altura após o redimensionamento for menor que 60px (qualquer coisa além da altura da barra de URL), não faça nada e se for maior que 60px, defina novamente a altura do bg1 para a altura do pai! código completo:
PS: Este bug é tão irritante!
fonte
Semelhante à resposta @AlexKempton. (não foi possível comentar, desculpe)
Eu tenho usado longos atrasos de transição para impedir o redimensionamento do elemento.
por exemplo:
A desvantagem disso é que ele evita o redimensionamento do elemento, inclusive na rotação do dispositivo; no entanto, você pode usar algumas JS para detectar
orientationchange
e redefinir a altura, se houver algum problema.fonte
Para aqueles que desejam ouvir a altura interna real e a rolagem vertical da janela enquanto o navegador móvel Chrome faz a transição da barra de URLs de mostrada para oculta e vice-versa, a única solução que encontrei é definir uma função de intervalo e medir a discrepância de
window.innerHeight
com seu valor anterior.Isso introduz este código:
Espero que isso seja útil. Alguém conhece uma solução melhor?
fonte
A solução que tive quando tive um problema semelhante foi definir a altura do elemento para
window.innerHeight
cada vez que otouchmove
evento era acionado.Isso faz com que o elemento abranja exatamente 100% da tela disponível o tempo todo, nem mais nem menos. Mesmo durante a barra de endereços, ocultando ou mostrando.
No entanto, é uma pena que tenhamos que criar esse tipo de patch, onde o simples
position: fixed
deve funcionar.fonte
Com o suporte de propriedades customizadas de CSS (variáveis) no iOS, é possível configurá-las com JS e usá-las apenas no iOS.
fonte
Minha resposta é para todos que vêm aqui (como eu) para encontrar uma resposta para um bug causado pelo endereço oculto / interface do navegador.
A barra de endereço oculta faz com que o evento de redimensionamento seja acionado. Mas diferente de outros eventos de redimensionamento, como alternar para o modo paisagem, isso não altera a largura da janela. Portanto, minha solução é conectar-se ao evento resize e verificar se a largura é a mesma.
fonte