Todo tutorial de desenvolvimento de site responsivo recomenda o uso da display:none
propriedade CSS para ocultar o carregamento do conteúdo nos navegadores móveis, para que o site seja carregado mais rapidamente. É verdade? Não display:none
carrega as imagens ou ainda carrega o conteúdo no navegador móvel? Existe alguma maneira de impedir o carregamento de conteúdo desnecessário em navegadores móveis?
css
responsive-design
desagradável
fonte
fonte
Respostas:
Os navegadores estão ficando mais inteligentes. Hoje, seu navegador (dependendo da versão) pode pular o carregamento da imagem, se puder determinar que não é útil.
A imagem tem um
display:none
estilo, mas seu tamanho pode ser lido pelo script. O Chrome v68.0 não carrega imagens se o pai estiver oculto.Você pode vê-lo lá: http://jsfiddle.net/tnk3j08s/
Você também pode ter verificado isso na guia "rede" das ferramentas de desenvolvedor do seu navegador.
Observe que, se o navegador estiver em um pequeno computador com CPU, não precisar renderizar a imagem (e fazer o layout da página) agilizará toda a operação de renderização, mas duvido que isso seja algo que realmente faça sentido hoje.
Se você deseja impedir que a imagem seja carregada, você simplesmente não pode adicionar o elemento IMG ao seu documento (ou definir o
src
atributo IMG como"data:"
ou"about:blank"
).fonte
Se você tornar a imagem uma imagem de plano de fundo de uma div em CSS, quando essa div estiver definida como "display: none", a imagem não será carregada. Quando o CSS está desativado, ele ainda não será carregado, porque, bem, o CSS está desativado.
fonte
<div hidden style="display:none;width:0;height:0;visibility:hidden;background:url('test.jpg')"></div>
. Resultados: o Firefox 29 e o Opera 12 não são carregados. IE 11 e Chrome 34 de carga.background-image
paranone
para casos em que você não quer que a imagem de carga. Não foi encontrada nenhuma alternativa melhor para este caso de uso que não usa JS.display: none;
. Teste de rede com janela abaixo dessa largura: Chrome 35, IE11 e Edge não carregaram as imagensA resposta não é tão fácil quanto um simples sim ou não. Confira os resultados de um teste que fiz recentemente:
Então, depois de pesquisar mais, descobri isso , o que explica como cada navegador lida com o carregamento de ativos de img com base na exibição de css: none;
Trecho da postagem do blog:
fonte
A
<picture>
tag HTML5 ajudará você a resolver a fonte de imagem correta, dependendo da largura da telaAparentemente, o comportamento dos navegadores não mudou muito nos últimos 5 anos e muitos ainda baixariam as imagens ocultas, mesmo que houvesse uma
display: none
propriedade definida nelas.Mesmo que haja uma solução alternativa para consultas de mídia , ela só poderia ser útil quando a imagem foi definida como plano de fundo no CSS.
Enquanto eu pensava que havia apenas uma solução JS para o problema ( carregamento lento , preenchimento de fotos etc.), parecia que havia uma boa solução HTML pura que sai da caixa com o HTML5.
E essa é a
<picture>
etiqueta.Veja como o MDN o descreve:
E aqui está como usá-lo:
A lógica por trás
O navegador carregaria a fonte da
img
tag, apenas se nenhuma regra de mídia se aplicar. Quando o<picture>
elemento não é suportado pelo navegador, ele volta a mostrar aimg
tag.Normalmente, você colocaria a menor imagem como fonte
<img>
e, portanto, não carregaria as imagens pesadas para telas maiores. Vice-versa, se uma regra de mídia se aplicar, a fonte do<img>
não será baixada; em vez disso, fará o download do conteúdo do URL da<source>
tag correspondente .A única armadilha aqui é que, se o elemento não for suportado pelo navegador, ele carregará apenas a imagem pequena. Por outro lado, em 2017, devemos pensar e codificar na primeira abordagem móvel .
E antes que alguém saísse muito, aqui está o suporte atual do navegador para
<picture>
:Navegadores de desktop
Navegadores para celular
Mais sobre o suporte ao navegador, você pode encontrar em Posso usar .
O bom é que a frase do html5please é usá-lo com um fallback . E eu pessoalmente pretendo seguir o conselho deles.
Mais sobre a tag que você pode encontrar na especificação do W3C . Existe um aviso, que eu acho importante mencionar:
Então, o que diz é que ele apenas ajuda a melhorar o desempenho ao carregar uma imagem, fornecendo algum contexto para ela.
E você ainda pode usar um pouco de magia CSS para ocultar a imagem em pequenos dispositivos:
Portanto, o navegador não exibirá a imagem real e fará o download apenas da
1x1
imagem em pixel (que pode ser armazenada em cache se você a usar mais de uma vez). No entanto, esteja ciente de que, se a<picture>
tag não for suportada pelo navegador, mesmo nas telas do descktop, a imagem real não será exibida (portanto, você definitivamente precisará de um backup de polyfill).fonte
Sim, ele renderizará mais rápido, levemente, apenas porque não precisa renderizar a imagem e é um elemento a menos para classificar na tela.
Se você não deseja que ele seja carregado, deixe um DIV vazio, onde poderá carregar o html nele posteriormente, contendo uma
<img>
tag.Tente usar o firebug ou o wireshark, como mencionei antes, e você verá que os arquivos são transferidos, mesmo que
display:none
estejam presentes.O Opera é o único navegador que não carrega a imagem se a tela estiver definida como nenhuma.Agora, o Opera mudou-se para o webkit e renderizará todas as imagens, mesmo que sua exibição esteja definida como nenhuma.Aqui está uma página de teste que provará isso:
http://www.quirksmode.org/css/displayimg.html
fonte
** 2019 Resposta **
Em uma situação normal
display:none
, não impede que a imagem seja baixadaMas se um elemento ancestral tiver
display:none
, as imagens do descendente não serão baixadasOutras situações que impedem o download da imagem:
1- O elemento alvo não existe
2- Duas classes iguais carregando imagens diferentes
Você pode assistir por si mesmo aqui: https://codepen.io/juanmamenendez15/pen/dLQPmX
fonte
Modo Quirks: imagens e exibição: nenhum
fonte
A imagem de fundo de um elemento div será carregada se a div estiver definida como 'display: none'.
De qualquer forma, se a mesma div tiver um pai e esse pai estiver definido como 'display: none', a imagem de plano de fundo do elemento filho não será carregada . :)
Exemplo usando bootstrap:
fonte
usar
<img src="" srcset="">
http://www.webdesignerdepot.com/2015/08/the-state-of-responsive-images/
https://caniuse.com/#feat=srcset
fonte
Se você tornar a imagem uma imagem de plano de fundo de uma div em CSS, quando essa div estiver definida como 'display: none', a imagem não será carregada.
Apenas expandindo a solução do Brent.
Você pode fazer o seguinte para uma solução CSS pura, mas também faz com que a caixa img se comporte como uma caixa img em uma configuração de design responsivo (é para isso que serve o png transparente), o que é especialmente útil se o seu design usa dinamicamente responsivo- redimensionando imagens.
A imagem será carregada apenas quando a consulta de mídia vinculada ao visible-lg-block for acionada e display: none for alterado para display: block. O png transparente é usado para permitir que o navegador defina proporções apropriadas de altura: largura para o seu bloco <img> (e, portanto, a imagem de fundo) em um design fluido (altura: automático; largura: 100%).
Então, você acaba com algo como o seguinte, para três viewports diferentes:
E apenas as imagens padrão do tamanho da janela de visualização de mídia são carregadas durante o carregamento inicial e, posteriormente, dependendo da sua janela de visualização, as imagens são carregadas dinamicamente.
E sem javascript!
fonte
Para impedir a busca de recursos, use o
<template>
elemento Web Components .fonte
Oi pessoal Eu estava lutando com o mesmo problema, como não carregar uma imagem no celular.
Mas descobri uma boa solução. Primeiro, crie uma tag img e, em seguida, carregue um svg em branco no atributo src. Agora você pode definir seu URL para a imagem como um estilo embutido com conteúdo: url ('link para sua imagem') ;. Agora envolva sua tag img em um invólucro de sua escolha.
Defina o wrapper para não exibir nenhum no ponto de interrupção em que você não deseja carregar a imagem. O CSS embutido da tag img agora é ignorado, já que o estilo de um elemento envolvido em um wrapper com exibição nenhum será ignorado; portanto, a imagem não será carregada até que você atinja um ponto de interrupção no qual o wrapper possui bloco de exibição.
Lá vai você, maneira muito fácil de não carregar um img no ponto de interrupção móvel :)
Confira este código, para um exemplo de trabalho: http://codepen.io/fennefoss/pen/jmXjvo
fonte
content
propriedade -para alterar a imagem mostrada. Você pode dar algumas estatísticas sobre compatibilidade com isso?Não. A imagem será carregada como de costume e ainda usará a largura de banda do usuário se você estiver pensando em economizar a largura de banda do usuário de celular. O que você pode fazer é usar a consulta de mídia e filtrar os dispositivos nos quais você deseja que sua imagem seja carregada. A imagem deve ser definida como imagem de plano de fundo de uma div, etc, e NÃO como uma marca, pois a imagem carregará a imagem, independentemente do tamanho da tela e da consulta de mídia definida.
fonte
Outra possibilidade é usar uma
<noscript>
etiqueta e colocar a imagem dentro<noscript>
dela. Em seguida, use o javascript para remover onoscript
tag conforme a imagem. Dessa forma, você pode carregar imagens sob demanda usando aprimoramento progressivo.Use este polyfill que escrevi para ler o conteúdo das
<noscript>
tags no IE8https://github.com/jameswestgate/noscript-textcontent
fonte
Use o CSS @media query, basicamente lançamos um projeto em que tínhamos uma imagem enorme de uma árvore na área de trabalho ao lado, mas não aparecendo nas telas de tabela / móvel. Portanto, evite que a imagem carregue, é muito fácil
Aqui está um pequeno trecho:
Você pode usar o mesmo CSS para mostrar e ocultar com exibição / visibilidade / opacidade, mas a imagem ainda estava carregando, esse foi o código mais seguro que criamos.
fonte
estamos falando de imagens que não carregam no celular, certo? e daí se você acabou de criar uma @media (largura mínima: 400 px) {background-image: thing.jpg}
não procuraria apenas a imagem acima de uma certa largura de tela?
fonte
O truque para usar a tela: nenhum com imagens é atribuir um ID a eles. Isso ocorreu, não há muito código necessário para fazê-lo funcionar. Aqui está um exemplo usando consultas de mídia e três folhas de estilo. Um para telefone, um para tablet e outro para desktop. Tenho 3 imagens, imagem de telefone, tablet e área de trabalho. Na tela do telefone, apenas uma imagem do telefone será exibida, um tablet exibirá apenas a imagem do tablet, uma área de trabalho será exibida na imagem do computador. Aqui está um exemplo de código para fazê-lo funcionar:
Código fonte:
O CSS do telefone que não precisa de uma consulta de mídia. É o img # phone que faz funcionar:
O tablet css:
E o CSS da área de trabalho:
Boa sorte e deixe-me saber como isso funciona para você.
fonte
display: none
uma imagem. É: "display: none" impede que uma imagem seja carregada?