“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-image에 none당신이 부하 이미지를 원하지 않는 경우에. 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요소는 유사한 보이는 다소 다르다 video및 audio요소. 모든 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.