De vez em quando, o Chrome processa HTML / CSS perfeitamente válidos incorretamente ou nada. Muitas vezes, pesquisar no inspetor DOM é suficiente para que ele perceba o erro de suas formas e redesenha-o corretamente; portanto, é provável que a marcação seja boa. Isso acontece com frequência (e previsivelmente) o suficiente em um projeto no qual estou trabalhando, e coloquei o código para forçar um redesenho em determinadas circunstâncias.
Isso funciona na maioria das combinações de navegadores / sistemas operacionais:
el.style.cssText += ';-webkit-transform:rotateZ(0deg)'
el.offsetHeight
el.style.cssText += ';-webkit-transform:none'
Como em, ajuste algumas propriedades CSS não utilizadas, solicite algumas informações que forçam um redesenho e, em seguida, desative a propriedade. Infelizmente, a brilhante equipe por trás do Chrome para Mac parece ter encontrado uma maneira de obter esse deslocamento de altura sem redesenhar. Assim, matando um hack útil.
Até agora, o melhor que consegui para obter o mesmo efeito no Chrome / Mac é essa parte feia:
$(el).css("border", "solid 1px transparent");
setTimeout(function()
{
$(el).css("border", "solid 0px transparent");
}, 1000);
Na verdade, force o elemento a pular um pouco, depois relaxe um segundo e pule de volta. Para piorar, se você diminuir o tempo limite abaixo de 500ms (para onde seria menos perceptível), geralmente não terá o efeito desejado, pois o navegador não será redesenhado antes de voltar ao seu estado original.
Alguém gostaria de oferecer uma versão melhor desse hack de redesenho / atualização (de preferência com base no primeiro exemplo acima) que funciona no Chrome / Mac?
fonte
Respostas:
Não sei exatamente o que você está tentando alcançar, mas este é um método que usei no passado com sucesso para forçar o navegador a redesenhar, talvez ele funcione para você.
Se esse redesenho simples não funcionar, tente este. Ele insere um nó de texto vazio no elemento que garante um redesenho.
EDIT: Em resposta ao Šime Vidas, o que estamos alcançando aqui seria um refluxo forçado. Você pode descobrir mais com o próprio mestre http://paulirish.com/2011/dom-html5-css3-performance/
fonte
.hide().show(0)
em qualquer elemento (eu escolhi o rodapé da página) deve atualizar a página.Nenhuma das respostas acima funcionou para mim. Notei que redimensionar minha janela causou um redesenho. Então, isso fez isso por mim:
fonte
$(window).trigger('resize')
não, ele apenas lança o evento 'redimensionar' que aciona o manipulador relacionado se ele estiver atribuído.Recentemente, descobrimos isso e descobrimos que a promoção do elemento afetado para uma camada composta com o translateZ corrigia o problema sem a necessidade de javascript extra.
Como esses problemas de pintura aparecem principalmente no Webkit / Blink, e essa correção visa principalmente o Webkit / Blink, é preferível em alguns casos. Especialmente porque muitas soluções JavaScript causam reflow e repintam , não apenas repintam.
fonte
neon-animated-pages
. Obrigado: +1:Esta solução sem timeouts! Força real redesenhada! Para Android e iOS.
fonte
Isso funciona para mim. Parabéns aqui .
fonte
$().hide().show(0)
show()
diferente,show(0)
ao especificar uma duração no último, é acionado pelos métodos de animação jQuery em um tempo limite, e não imediatamente, o que dá tempo para renderizar da mesma maneira quehide(0, function() { $(this).show(); })
faz .Ocultar um elemento e mostrá-lo novamente dentro de um setTimeout de 0 forçará um redesenho.
fonte
myElement.getBoundingClientRect()
, que estavam sendo armazenados em cache, provavelmente para fins de otimização / desempenho. Simplesmente adicionei um tempo limite de zero milissegundo para a função que adiciona o novo elemento ao DOM e obtém os novos valores depois que o elemento antigo com os valores anteriores (em cache) foi removido do DOM.Isso parece fazer o truque para mim. Além disso, ele realmente não aparece.
fonte
ligar
window.getComputedStyle()
deve forçar um reflowfonte
offsetHeight
propriedade que não é css.Encontrei esse desafio hoje no OSX El Capitan com o Chrome v51. A página em questão funcionou bem no Safari. Tentei quase todas as sugestões desta página - nenhuma funcionou corretamente - todas tiveram efeitos colaterais ... Acabei implementando o código abaixo - super simples - sem efeitos colaterais (ainda funciona como antes no Safari).
Solução: alterne uma classe no elemento problemático, conforme necessário. Cada alternância forçará um redesenho. (Eu usei o jQuery por conveniência, mas o baunilha JavaScript não deve ser problema ...)
Alternar classe jQuery
Classe CSS
E é isso...
NOTA: Você precisa executar o snippet abaixo de "Página completa" para ver o efeito.
fonte
chame essa função após 500 milissegundos.
fonte
Se você deseja preservar os estilos declarados em suas folhas de estilo, é melhor usar algo como:
NB: com o webkit / piscamento mais recente, armazenando o valor de
offsetHeight
é obrigatório para ativar a repintagem; caso contrário, a VM (para fins de otimização) provavelmente ignorará essa instrução.Atualização: adicionada a segunda
offsetHeight
leitura, é necessário impedir que o navegador enfileire / armazene em cache uma alteração de propriedade / classe CSS a seguir com a restauração dodisplay
valor (dessa maneira, uma transição CSS que possa ser seguida deve ser renderizada)fonte
// <== má ideia$('article.child').redraw();
fonte
.fadeIn(1)
vez de.show(300)
para mim - não empurrando o elemento. Então eu acho, é o desencadeamento dedisplay:none
e volta parablock
Uma abordagem que funcionou para mim no IE (não consegui usar a técnica de exibição porque havia uma entrada que não deve perder o foco)
Funciona se você tiver margem 0 (alterar o preenchimento também funciona)
fonte
Apenas CSS. Isso funciona para situações em que um elemento filho é removido ou adicionado. Nessas situações, bordas e cantos arredondados podem deixar artefatos.
fonte
Minha correção para o IE10 + IE11. Basicamente, o que acontece é que você adiciona um DIV dentro de um elemento de quebra automática que precisa ser recalculado. Em seguida, basta removê-lo e pronto; Funciona como um encanto :)
fonte
A maioria das respostas requer o uso de um tempo limite assíncrono, o que causa um piscar de olhos irritante.
Mas eu vim com este aqui, que funciona sem problemas porque é sincrônico:
fonte
Esta é a minha solução que funcionou para desaparecer o conteúdo ...
fonte
Corri para um problema semelhante e esta linha simples de JS ajudou a corrigi-lo:
No meu caso, foi um bug com uma extensão do Chrome que não redesenhava a página depois de alterar seu CSS de dentro da extensão.
fonte
Eu queria retornar todos os estados ao estado anterior (sem recarregar), incluindo os elementos adicionados pelo jquery. A implementação acima não funciona. e fiz o seguinte.
fonte
Eu tinha uma lista de componentes de reação que, quando rolada, abriu outra página e, ao retornar, a lista não era renderizada no Safari iOS até a página ser rolada. Então essa é a correção.
fonte
Abaixo o css funciona para mim no IE 11 e no Edge, nenhum JS é necessário.
scaleY(1)
faz o truque aqui. Parece a solução mais simples.fonte
Me ajudou
fonte
2020: Mais leve e mais forte
As soluções anteriores não funcionam mais para mim.
Eu acho que os navegadores otimizam o processo de desenho detectando mais e mais alterações "inúteis".
Essa solução faz com que o navegador desenhe um clone para substituir o elemento original. Funciona e é provavelmente mais sustentável:
testado no Chrome 80 / Edge 80 / Firefox 75
fonte