Does “display:none” prevent an image from loading?

前端 未结 17 1909
再見小時候
再見小時候 2020-11-22 05:13

Every responsive website development tutorial recommends using the display:none CSS property to hide content from loading on mobile browsers so the website load

相关标签:
17条回答
  • 2020-11-22 05:45

    The background-image of a div element will load if the div is set do 'display:none'.

    Anyway, if that same div has a parent and that parent is set to 'display:none', the background-image of the child element will not load. :)

    Example using bootstrap:

    <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>

    0 讨论(0)
  • 2020-11-22 05:48

    The answer is not as easy as a simple yes or no. Check out the results of a test I recently did:

    • In Chrome: All 8 screenshot-* images loaded (img 1)
    • In Firefox: Only the 1 screenshot-* image loaded that is currently being displayed (img 2)

    So after digging further I found this, which explains how each browser handles loading img assets based on css display: none;

    Excerpt from the blog post:

    • Chrome and Safari (WebKit):
      WebKit downloads the file every time except when a background is applied through a non-matching media-query.
    • Firefox:
      Firefox won't download the image called with background image if the styles are hidden but they will still download assets from img tags.
    • Opera:
      Like Firefox does, Opera won't load useless background-images.
    • Internet Explorer:
      IE, like WebKit will download background-images even if they have display: none; Something odd appears with IE6 : Elements with a background-image and display: none set inline won't be downloaded... But they will be if those styles aren't applied inline.

    Chrome- All 8 screenshot-* images loaded

    Firefox- Only the 1 screenshot-* image loaded that is currently being displayed

    0 讨论(0)
  • 2020-11-22 05:49

    If you make the image a background-image of a div in CSS, when that div is set to 'display: none', the image will not load.

    Just expanding on Brent's solution.

    You can do the following for a pure CSS solution, it also makes the img box actually behave like an img box in a responsive design setting (that's what the transparent png is for), which is especially useful if your design uses responsive-dynamically-resizing images.

    <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">
    

    The image will only be loaded when the media query tied to visible-lg-block is triggered and display:none is changed to display:block. The transparent png is used to allow the browser to set appropriate height:width ratios for your <img> block (and thus the background-image) in a fluid design (height: auto; width: 100%).

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

    So you end up with something like the following, for 3 different viewports:

    <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">
    

    And only your default media viewport size images load during the initial load, then afterwards, depending on your viewport, images will dynamically load.

    And no javascript!

    0 讨论(0)
  • 2020-11-22 05:50

    If so is there a way to not load the unnecessary content on mobile browsers?

    use <img src="" srcset="">

    http://www.webdesignerdepot.com/2015/08/the-state-of-responsive-images/

    https://caniuse.com/#feat=srcset

    0 讨论(0)
  • 2020-11-22 05:53

    If you make the image a background-image of a div in CSS, when that div is set to "display: none", the image will not load. When CSS is disabled, it still will not load, because, well, CSS is disabled.

    0 讨论(0)
提交回复
热议问题