“display : none”으로 이미지가로드되지 않습니까?


336

모든 반응 형 웹 사이트 개발 자습서에서는 display:noneCSS 속성을 사용하여 콘텐츠를 모바일 브라우저에서로드하지 못하도록 숨겨 웹 사이트를 더 빠르게로드 할 것을 권장 합니다. 사실인가요? 않는 display:none이미지를로드하지 않거나 여전히 모바일 브라우저에서 내용을로드합니까? 모바일 브라우저에서 불필요한 컨텐츠를로드하지 못하게하는 방법이 있습니까?


6
디스플레이로 다운로드를 막는 방법이 몇 가지있는 것 같습니다 : 바닐라 방식이 아닌 아무도 : timkadlec.com/2012/04/media-query-asset-downloading-results
mrwweb

1
W3C는 적극적으로 테스트하고 있습니다 : w3.org/2009/03/image-display-none/test.php
Pino

답변:


191

브라우저가 더 똑똑해지고 있습니다. 오늘날 브라우저가 버전에 따라 유용하지 않다고 판단되면 이미지 로딩을 건너 뛸 수 있습니다.

이미지에는 display:none스타일이 있지만 스크립트에서 크기를 읽을 수 있습니다. 부모가 숨겨져 있으면 Chrome v68.0에서 이미지를로드하지 않습니다.

거기에서 확인할 수 있습니다 : http://jsfiddle.net/tnk3j08s/

브라우저 개발자 도구의 "네트워크"탭을 확인하여 확인할 수도 있습니다.

브라우저가 소형 CPU 컴퓨터에있는 경우 이미지를 렌더링하거나 페이지를 레이아웃하지 않아도 전체 렌더링 작업이 더 빨라지지만 오늘날에는 이것이 의미가없는 것 같습니다.

이미지가로드되지 않게하려면 IMG 요소를 문서에 추가하지 않거나 IMG src속성을 "data:"또는로 설정하면 안됩니다 "about:blank".


50
빈 이미지 src는 위험합니다. 서버에 추가 요청을 보냅니다. 이 주제에 대해 잘 읽어보십시오 nczonline.net/blog/2009/11/30/…
Srinivas

2
@SrinivasYedhuri 네, 맞습니다. 더 나은 솔루션으로 편집했습니다.
Denys Séguret

8
이 답변은 부분적으로 만 정확합니다. 방금 Chrome (v35)에서 이것을 테스트했으며 디스플레이가 none으로 설정된 이미지가 다운로드되지 않았 음을 확인할 수 있습니다. 이는 아마도 개발자의 반응 형 디자인을보다 쉽게하기위한 것입니다.
Shawn Whinnery

15
이 답변은 더 이상 정확하지 않습니다. 최신 버전의 FF를 포함한 다양한 브라우저가이 상황을 다르게 처리하는 방법에 대한 업데이트 된 결과는 아래를 참조하십시오.
DMTintner

2
오늘날 (2017 년 10 월)에도 가장 일반적인 브라우저 인 Chrome은 숨겨져 있어도 모든 'img'요소 소스를 다운로드합니다. 숨겨진 배경 이미지는 다운로드하지 않습니다.
TKoL

130

CSS에서 이미지를 div의 배경 이미지로 만들면 해당 div가 "display : none"으로 설정되면 이미지가로드되지 않습니다. CSS가 비활성화 되어도 CSS는 비활성화되어 있기 때문에 여전히로드되지 않습니다.


17
이것은 실제로 제 생각에는 반응 형 디자인에 매우 유용한 팁입니다.
ryandlf

3
이것은 FF, Chrome, Safari, Opera, Maxthon에서 작동합니다. IE를 시도하지 않았습니다.
Brent

13
정면에서 새로운 속보! <div hidden style="display:none;width:0;height:0;visibility:hidden;background:url('test.jpg')"></div>. 결과 : Firefox 29 및 Opera 12가로드되지 않습니다. IE 11 및 Chrome 34가로드되었습니다.
CoolCmd

3
당신이 할 수 귀하의 CSS 미디어 쿼리 세트에이 여전히 실행 가능한 옵션입니다 반응 설계 @CoolCmd background-imagenone당신이 부하 이미지를 원하지 않는 경우에. JS를 사용하지 않는이 사용 사례에 대한 더 나은 대안을 찾지 못했습니다.
Qtax

1
최소 너비 미디어 쿼리가있는 이미지 슬라이더 (배경 이미지 사용)를 테스트했습니다. 이 너비 아래에서 상위 div에는 CSS가 display: none;있습니다. 그 폭 아래 창 테스트 네트워크 : 크롬 35, IE11 및 Edge는 이미지를로드하지 않았다
binaryfunt

57

대답은 단순한 예 또는 아니오만큼 쉽지 않습니다. 최근에 수행 한 테스트 결과를 확인하십시오.

  • Chrome에서 : 8 개의 스크린 샷 * 이미지가 모두로드 됨 (img 1)
  • Firefox : 현재 표시되고있는 1 개의 스크린 샷 * 이미지 만로드 됨 (img 2)

그래서 더 파고 난 후에 이것을 발견 했습니다 . 이것은 각 브라우저가 CSS 표시에 따라 img 자산로드를 처리하는 방법을 설명합니다 : none;

블로그 게시물에서 발췌 :

  • Chrome 및 Safari (WebKit) :
    WebKit은 일치하지 않는 미디어 쿼리를 통해 배경이 적용되는 경우를 제외하고 매번 파일을 다운로드합니다.
  • Firefox :
    스타일이 숨겨져 있으면 Firefox는 배경 이미지와 함께 호출 된 이미지를 다운로드하지 않지만 여전히 img 태그에서 자산을 다운로드합니다.
  • Opera :
    Firefox와 마찬가지로 Opera는 쓸모없는 배경 이미지를로드하지 않습니다.
  • Internet Explorer :
    WebKit과 같은 IE는 배경 이미지가 표시되어 있어도 배경 이미지를 다운로드합니다. none; IE6의 경우 이상한 점이 나타납니다. 배경 이미지 및 표시가있는 요소 : 설정된 인라인이 다운로드되지 않습니다 ... 그러나 해당 스타일이 인라인으로 적용되지 않으면 나타납니다.

Chrome- 모든 8 스크린 샷-* 이미지로드

Firefox- 현재 표시된 1 개의 스크린 샷 * 이미지 만로드


1
이러한 결과가 표준의 일부가 아닌 한 무의미합니다. 크롬은 렌더링 엔진을 변경하고 오페라도 변경하며 IE는 다른 것으로 바뀝니다. 이와 같은 프린지 기능의 구현은 시간이 지남에 따라 안정적으로 유지 될 수 없습니다. 해결책은 자산을 전혀 느리게로드해야 할 때 브라우저에 힌트를주는 방법입니다.
Mark Kaplun

5
@MarkKaplun 나는이 테스트 결과가 항상 모든 브라우저에서 항상 일어날 것으로 예상되는 것을 보여줄 것을 제안하지는 않았습니다. 나는 그 대답이 "예 또는 아니오만큼 간단하지 않다"는 것을 보여 주려고했다. 각 브라우저는 현재이 방식을 다르게 구현하고 있으며 아마도이 방식은 한동안 계속 될 것입니다.
DMTintner

@DMTintner 정확히 맞습니다. 오늘 막으로 나는 '디스플레이 : 없음'인 div의 iOS 사파리로드 배경 이미지를 확인할 수 있습니다. 가장 좋은 방법은 아무 것도 가정하지 않고 이미지를로드하지 않으려면 html 태그로 참조하지 마십시오
bhu Boue vidya

34

HTML5 <picture>태그는 화면 너비에 따라 올바른 이미지 소스를 해결하는 데 도움이됩니다.

분명히 브라우저 동작은 지난 5 년 동안 크게 변하지 않았으며 많은 display: none속성이 설정되어 있어도 숨겨진 이미지를 다운로드 할 것입니다.

미디어 쿼리 해결 방법 이 있지만 이미지가 CSS에서 배경으로 설정된 경우에만 유용 할 수 있습니다.

문제에 대한 JS 솔루션 ( 지연로드 , 그림 채우기 등) 이 있다고 생각하는 동안 HTML5와 함께 제공되는 멋진 순수한 HTML 솔루션이있는 것으로 나타났습니다.

그리고 이것이 <picture>태그입니다.

MDN이이를 설명 하는 방법은 다음과 같습니다 .

HTML의 <picture>요소는 복수 지정하기 위해 사용되는 컨테이너 <source>의 특정 요소 <img>안에 포함한다. 브라우저는 페이지의 현재 레이아웃 (이미지가 표시되는 상자의 제약 조건) 및 표시 될 장치 (예 : 일반 또는 hiDPI 장치)에 따라 가장 적합한 소스를 선택합니다.

사용 방법은 다음과 같습니다.

<picture>
 <source srcset="mdn-logo-wide.png" media="(min-width: 600px)">
 <img src="mdn-logo-narrow.png" alt="MDN">
</picture>

뒤에 논리

img미디어 규칙이 적용되지 않는 경우에만 브라우저가 태그 소스를로드합니다 . <picture>브라우저 에서 요소를 지원하지 않으면 img태그 를 다시 표시합니다 .

일반적으로 가장 작은 이미지를 소스로 사용하여 <img>더 큰 화면에 무거운 이미지를로드하지 않습니다. 반대로 미디어 규칙이 적용되는 경우 소스 <img>가 다운로드되지 않고 대신 해당 <source>태그 의 URL 내용을 다운로드합니다 .

여기서 함정은 브라우저에서 요소를 지원하지 않으면 작은 이미지 만로드한다는 것입니다. 한편 2017 년에는 모바일 우선 접근 방식 으로 사고하고 코딩해야합니다 .

그리고 누군가 너무 빠져 나오기 전에 다음에 대한 현재 브라우저 지원이 있습니다 <picture>.

데스크탑 브라우저

데스크탑 브라우저 지원

모바일 브라우저

모바일 브라우저 지원

더 많은 브라우저에 대해 당신이에서 찾을 수있는 지원 할 수 있습니까 사용 .

좋은 점은 html5please 의 문장이 폴 백과 함께 사용한다는 것입니다 . 저는 개인적으로 조언을 구하려고합니다.

태그에 대한 자세한 내용은 W3C 사양을 참조하십시오 . 거기에 면책 조항이 있습니다.

picture요소는 유사한 보이는 다소 다르다 videoaudio요소. 모든 source요소에 요소가 포함되어 있지만 src요소가 요소 내에 중첩되어 있고 picture자원 선택 알고리즘이 다른 경우 소스 요소의 속성은 의미가 없습니다 . 또한 picture요소 자체에는 아무것도 표시되지 않습니다. 포함 된 img요소에 대한 컨텍스트 만 제공하여 여러 URL 중에서 선택할 수 있습니다.

따라서 이미지에 컨텍스트를 제공하여 이미지를로드 할 때 성능을 향상시키는 데 도움이됩니다.

작은 장치에서 이미지를 숨기려면 CSS 매직을 계속 사용할 수 있습니다.

<style>
  picture { display: none; }

  @media (min-width: 600px) {
    picture {
      display: block;
    }
  }
</style>

<picture>
 <source srcset="the-real-image-source" media="(min-width: 600px)">
 <img src="a-1x1-pixel-image-that-will-be-hidden-in-the-css" alt="MDN">
</picture>

따라서 브라우저는 실제 이미지를 표시하지 않고1x1 픽셀 이미지 만 다운로드합니다 (이 이미지는 두 번 이상 사용하면 캐시 될 수 있음). 그러나 <picture>브라우저 에서 태그를 지원하지 않는 경우 데스크톱 화면에서도 실제 이미지 표시 되지 않으므로 폴리 필 백업이 반드시 필요합니다.


4
나는 당신과 비슷한 길을 택했지만 대신 data-img를 사용합니다 :) 여기에 쓴 게시물은 swimburger.net/blog/web/…
Swimburger

10

예. 이미지를 렌더링 할 필요가없고 화면에서 정렬하는 요소가 적기 때문에 약간 더 빠르게 렌더링됩니다.

로드하지 않으려면 나중에 <img>태그를 포함하는 HTML을로드 할 수있는 DIV를 비워 두십시오 .

앞에서 언급했듯이 firebug 또는 wireshark를 사용해보십시오. 파일 display:none이 존재 하더라도 DO가 전송되는 것을 볼 수 있습니다 .

Opera는 디스플레이가 none으로 설정된 경우 이미지를로드하지 않는 유일한 브라우저입니다. Opera는 이제 웹킷으로 이동했으며 디스플레이가 none으로 설정되어 있어도 모든 이미지를 렌더링합니다.

이를 증명할 테스트 페이지는 다음과 같습니다.

http://www.quirksmode.org/css/displayimg.html


9

** 2019 답변 **

정상적인 상황 display:none에서는 이미지를 다운로드 할 수 없습니다.

/*will be downloaded*/

#element1 {
    display: none;
    background-image: url('https://picsum.photos/id/237/100');
}

그러나 조상 요소가 있으면 display:none자손의 이미지가 다운로드되지 않습니다


/* Markup */

<div id="father">
    <div id="son"></div>
</div>


/* Styles */

#father {
    display: none;
}

/* #son will not be downloaded because the #father div has display:none; */

#son {
    background-image: url('https://picsum.photos/id/234/500');
}

이미지 다운로드를 방해하는 다른 상황 :

1- 대상 요소가 존재하지 않습니다

/* never will be downloaded because the target element doesn't exist */

#element-dont-exist {
    background-image: url('https://picsum.photos/id/240/400');
}

다른 이미지를로드하는 2 개의 동일한 클래스

/* The first image of #element2 will never be downloaded because the other #element2 class */

#element2 {
    background-image: url('https://picsum.photos/id/238/200');
}

/* The second image of #element2 will be downloaded */

#element2 {
    background-image: url('https://picsum.photos/id/239/300');
}

당신은 여기에서 자신을 볼 수 있습니다 : https://codepen.io/juanmamenendez15/pen/dLQPmX


8

쿼크 모드 : 이미지 및 디스플레이 : 없음

이미지에가 display: none있는 요소 안에 또는이있는 display:none경우 브라우저는가 display 다른 값으로 설정 될 때까지 이미지를 다운로드하지 않도록 선택할 수 있습니다 .

만 오페라는 당신이 스위치 이미지 다운로드 display에를 block. 다른 모든 브라우저는 즉시 다운로드합니다.


8

div가 설정된 경우 div 요소의 배경 이미지 는 'display : none'으로 로드 됩니다.

어쨌든 동일한 div에 부모가 있고 해당 부모가 'display : none'으로 설정된 경우 자식 요소의 배경 이미지는 로드되지 않습니다 . :)

부트 스트랩 사용 예 :

<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">


<div class="col-xs-12 visible-lg">
	<div style="background-image: url('http://via.placeholder.com/300x300'); background-repeat:no-repeat; height: 300px;">lg</div>
</div>
<div class="col-xs-12 visible-md">
	<div style="background-image: url('http://via.placeholder.com/200x200'); background-repeat:no-repeat; height: 200px;">md</div>
</div>
<div class="col-xs-12 visible-sm">
	<div style="background-image: url('http://via.placeholder.com/100x100'); background-repeat:no-repeat; height: 100px">sm</div>
</div>
<div class="col-xs-12 visible-xs">
	<div style="background-image: url('http://via.placeholder.com/50x50'); background-repeat:no-repeat; height: 50px">xs</div>
</div>



4

CSS에서 이미지를 div의 배경 이미지로 만들면 해당 div가 'display : none'으로 설정되면 이미지가로드되지 않습니다.

브렌트 솔루션을 확장하기 만하면됩니다.

순수한 CSS 솔루션을 위해 다음을 수행 할 수 있습니다 .img 상자는 실제로 반응 형 디자인 설정 (투명한 png의 용도)에서 img 상자처럼 작동하게합니다. 이미지 크기 조정.

<img style="display: none; height: auto; width:100%; background-image: 
url('img/1078x501_1.jpg'); background-size: cover;" class="center-block 
visible-lg-block" src="img/400x186_trans.png" alt="pic 1 mofo">

visible-lg-block에 연결된 미디어 쿼리가 트리거되고 display : none이 display : block으로 변경 될 때만 이미지가로드됩니다. 투명한 png는 브라우저가 유동적 인 디자인 (높이 : 자동; 너비 : 100 %)에서 <img> 블록 (및 배경 이미지)에 적절한 높이 : 너비 비율을 설정하는 데 사용됩니다.

1078/501 = ~2.15  (large screen)
400/186  = ~2.15  (small screen)

따라서 3 가지 뷰포트에 대해 다음과 같은 결과가 나타납니다.

<img style="display: none; height: auto; width:100%; background-image: url('img/1078x501_1.jpg'); background-size: cover;" class="center-block visible-lg-block" src="img/400x186_trans.png" alt="pic 1">
<img style="display: none; height: auto; width:100%; background-image: url('img/517x240_1.jpg'); background-size: cover;" class="center-block visible-md-block" src="img/400x186_trans.png" alt="pic 1">
<img style="display: none; height: auto; width:100%; background-image: url('img/400x186_1.jpg'); background-size: cover;" class="center-block visible-sm-block" src="img/400x186_trans.png" alt="pic 1">

초기로드 중에 기본 미디어 뷰포트 크기 이미지 만로드 된 다음 뷰포트에 따라 이미지가 동적으로로드됩니다.

그리고 자바 스크립트가 없습니다!



2

안녕하세요, 같은 문제로 어려움을 겪고있는 사람들, 이미지를 모바일에로드하지 않는 방법.

그러나 좋은 해결책을 찾았습니다. 먼저 img 태그를 만든 다음 src 속성에 빈 svg를로드하십시오. 이제 url ( 'link to your image'); 컨텐츠를 사용하여 URL을 이미지의 인라인 스타일로 설정할 수 있습니다. 이제 img 태그를 원하는 래퍼로 포장하십시오.

<div class="test">
  <img src="data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/‌​svg%22/%3E" style="content:url('https://blog.prepscholar.com/hubfs/body_testinprogress.gif?t=1495225010554')">
</div>

  @media only screen and (max-width: 800px) {
      .test{
       display: none;
      }
    }

이미지를로드하지 않으려는 중단 점에 랩퍼가 표시되지 않도록 설정하십시오. 래퍼에 래핑 된 요소의 스타일이 표시되지 않으므로 img 태그의 인라인 CSS는 이제 무시되므로 래퍼에 표시 블록이있는 중단 점에 도달 할 때까지 이미지가로드되지 않습니다.

모바일 중단 점에 img를로드하지 않는 정말 쉬운 방법입니다. :)

실제 코드 예를 보려면이 코드 펜을 확인하십시오. http://codepen.io/fennefoss/pen/jmXjvo


나는 웹을 계속 진화시키는 방법을 좋아하지만, 이전 에이 트릭을 보지 못했고, content-property를 사용 하여 표시된 이미지를 변경합니다. 호환성에 대한 통계를 줄 수 있습니까?
Windgazer

Edge : /에 대해 나쁜 점은 적어도 최신 버전의 Firefox, Chome 및 Safari에서 작동합니다.
Mikkel Fennefoss 12

2

휴대 전화 사용자 대역폭 절약을 고려할 경우 이미지는 평상시처럼로드되고 여전히 사용자의 대역폭을 사용합니다. 미디어 쿼리를 사용하고 이미지를로드 할 장치를 필터링하는 것이 가능한 방법입니다. 이미지 크기는 화면 크기와 미디어 쿼리 세트에 관계없이 이미지를로드하므로 이미지는 div 등의 배경 이미지로 설정되어야하며 태그는 아닙니다.


1

또 다른 가능성은 <noscript>태그를 사용 하고 이미지를 <noscript>태그 안에 배치하는 것 입니다. 그런 다음 noscript이미지가 필요할 때 자바 스크립트를 사용하여 태그 를 제거하십시오 . 이러한 방식으로 점진적 향상을 사용하여 필요에 따라 이미지를로드 할 수 있습니다.

내가 작성한 polyfill을 사용 <noscript>하여 IE8 의 태그 내용을 읽습니다.

https://github.com/jameswestgate/noscript-textcontent


1

@media query CSS를 사용하십시오. 기본적으로 우리는 측면에 데스크탑에 거대한 나무 이미지가 있지만 테이블 / 모바일 화면에는 표시되지 않는 프로젝트를 출시했습니다. 따라서 이미지가 아주 쉽게로드되지 않도록하십시오.

다음은 작은 스 니펫입니다.

.tree {
    background: none top left no-repeat; 
}

@media only screen and (min-width: 1200px) {
    .tree {
        background: url(enormous-tree.png) top left no-repeat;
    }
}

동일한 CSS를 사용하여 표시 / 가시성 / 불투명도로 표시하고 숨길 수 있지만 이미지가 여전히로드 중입니다. 이것은 우리가 생각해 낸 가장 안전한 코드입니다.


0

우리는 모바일에 이미지가로드되지 않는 것에 대해 이야기하고 있습니다. @media (최소 너비 : 400px) {background-image : thing.jpg}를 수행 한 경우 어떻게해야합니까?

그런 다음 특정 화면 너비 이상에서 이미지 만 찾지 않습니까?


-2

이미지와 함께 display : none을 사용하는 방법은 이미지에 ID를 할당하는 것입니다. 이것은 작동시키는 데 필요한 코드가 많지 않았습니다. 다음은 미디어 쿼리와 3 개의 스타일 시트를 사용하는 예입니다. 하나는 전화, 하나는 태블릿, 하나는 데스크탑입니다. 3 개의 이미지, 휴대 전화 이미지, 태블릿 및 데스크톱이 있습니다. 전화기 화면에는 전화기 이미지 만 표시되고 태블릿에는 타블렛 이미지 만 표시되고 데스크탑은 데스크탑 컴퓨터 이미지에 표시됩니다. 작동시키는 코드 예제는 다음과 같습니다.

소스 코드:

<div id="content">
<img id="phone" src="images/phone.png" />
<img id="tablet" src="images/tablet.png" />
<img id="desktop" src="images/desktop.png" />
</div>

미디어 쿼리가 필요없는 전화 CSS. 작동하는 img # phone입니다.

img#phone {
    display: block;
    margin: 6em auto 0 auto;
    width: 70%;
    }

img#tablet {display: none;}
img#desktop {display: none;}

태블릿 CSS :

@media only screen and (min-width: 641px) {
img#phone {display: none;}

img#tablet {
    display: block;
    margin: 6em auto 0 auto;
    width: 70%;
    }
}

그리고 데스크톱 CSS :

@media only screen and (min-width: 1141px) {
img#tablet {display: none;}

img#desktop {
    display: block;
    margin: 6em auto 0 auto;
    width: 80%;
    }
}

행운을 빌어 요 그리고 그것이 당신을 위해 어떻게 작동하는지 알려주세요.


4
문제는 display: none이미지 를 설정하는 방법이 아닙니다 . 그것은이다 : 합니까 "디스플레이 : 없음"로드에서 이미지를 방지하지?
Evgenia Manolova
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.