【问题标题】:preload large gallery/slider images in HTML在 HTML 中预加载大型画廊/滑块图像
【发布时间】:2012-09-21 14:33:54
【问题描述】:

我的作品集页面中有大而宽的图片。图像以“渐进式”保存,并且加载良好。

我想知道是否有一种方法可以预加载这些图像以使它们看起来更快、更流畅。或者也许有一种方法可以将所有其他页面和图像预加载到缓存中,以便至少在第一个页面之后的所有后续页面都显得流畅和快速?任何有助于使页面加载更快、更流畅的方法。

有什么建议吗?

每张图片由多种图片组成,所有图片都包含在一张宽幅图片中(以 PSD 格式制作),访问者可以左右移动以调用相应的图片出现在中心。 不幸的是,牺牲图像质量或使它们更小不是这里的选择。

我知道这里有关于预加载图片广告的帖子,但我找不到任何适用于 HTML 代码中嵌入的图片的帖子。

请多多关照,我是 CSS 和 Javascript 新手,所以越简单我就越有可能理解它。我担心在单个实例中分解图像(使其成为一排图像而不是整个图像),将它们放在浮动 div 中并更改相应的 Javascript 代码对我来说可能太具有挑战性了,对吧...?我还能怎么做?

赞赏!

这就是我所拥有的(我想在这里发布我所有的 HTML、Javascript 和 CSS 有点过头了,我会发布一些)。大图像放置在 HTML 页面中并通过 Javascript 调用。

see here

<div class="ShiftGroup">
        <div class="ShiftGroupC">
        <div class="ShiftGroupI"><div id="ShiftGalleryFive"><img src="images/gallery_anzic1.png" width="3348" height="372" alt="imagegallery1" /></div></div>
        <div class="ShiftGroupP" style="margin-left: -990px;"><div id="ShiftLeft" class="ShiftGroupD"><span class="pointer"><img src="images/arrowleft.png" width="78" height="50" alt="arrowsleft" /></span></div></div>
        <div class="ShiftGroupP" style="margin-left: 341px;"><div id="ShiftRight" class="ShiftGroupD"><span class="pointer"><img src="images/arrowright.png" width="78" height="50" alt="arrowright" /></span></div></div>

gallery = document.getElementById('ShiftGalleryFour').style;

【问题讨论】:

    标签: html image slider gallery preload


    【解决方案1】:

    这是我们在其中一个项目中预加载图像的方式:

    preloadImages = function(imageIndex) {
    
      // Finds div element containing index (1..n) and url of image 
      // (both stored as data attributes)
      var image = $(".data .image[data-index=" + imageIndex + "]");
    
      // Creates an image (just virtually) that is not embedded to HTML.
      // Its source is the url of the image that is to be preloaded
      var preloadedImage = $(new Image()).attr("src", image.attr("data-full-url"));
    
      // Bind an event to the "virtual" image to start preloading next image when 
      // this one is done
      preloadedImage.load(function() {
    
        // Start preloading the next one
        preloadImages(imageIndex + 1);
      });
    }
    
    // Start preloading the first image
    preloadImages(1)
    

    在您的情况下,这只解决了问题的一部分 - 预加载。

    我看到您将 html 中的所有图像都包含为 img 标记。如果您想获得更好的性能,请不要在图库的 html 中放置任何img 标签。只需 div 标签,它们将成为您图像的未来容器。这些 div 可能具有索引并包含带有图像 url 的数据属性(如我的示例所示)。当您的页面被加载时,开始预加载过程。当加载“虚拟图像”时。在其容器内创建新的图像标记并开始预加载下一个图像。

    这肯定会切断你页面的下载时间。

    我的示例使用了jQuery,它简化了脚本。纯 javascript 会更复杂。

    更新:

    这就是预加载示例的工作方式。

    HTML

    假设您有 4 张图片,并且它们都有自己的容器 - 一个放置单个图片的 div。

    <div class="images">
      <div class="image" data-index="1" data-src="image_1_source_path"></div>
      <div class="image" data-index="2" data-src="image_2_source_path"></div>
      <div class="image" data-index="3" data-src="image_3_source_path"></div>
      <div class="image" data-index="4" data-src="image_4_source_path"></div>
    </div>
    

    JavaScript

    加载文档后,可能会开始预加载过程。首先预加载第一个图像。加载此图像后,将其附加到其容器并触发下一个图像的预加载。如果加载了所有图像并且没有找到容器,也会调用return

    preloadImages = function(imageIndex) {
      var imageContainer = $(".images .image[data-index=" + imageIndex + "]");
      return if imageContainer.length === 0
      var preloadedImage = $(new Image()).attr("src", image.attr("data-full-url"));
      preloadedImage.load(function() {
        imageContainer.append(preloadedImage);
        preloadImages(imageIndex + 1);
      });
    }
    
    $(document).ready(function(){
      preloadImages(1);
    });
    

    希望你能明白。

    【讨论】:

    • 正如指出我是新手。我希望在 CSS(背景)或 Javascript 中定义图像,而不是在 HTML 标签中定义它们,但我不知道如何在不对每个图像使用不同的 CSS 规则的情况下实现这一点,这将是矫枉过正。如果我能得到帮助,我相信我能找到很多预加载解决方案。
    • 您可以将图像定义为 CSS 背景,但您仍然可以使用我的代码预加载它们。浏览器仅从加载页面时出现在页面上的 CSS 加载图像。然后在 javascript 代码中创建 Image 类并将图像的 URL 分配为其源将强制浏览器下载图像(预加载它)。在您的视图中,您只能更改 div 的类以显示预加载的图像。
    • ...在这种情况下,我最终会在 CSS 中得到大量的类(每个页面一个),不是吗?如果您转到“概览”,您会看到每个品牌拇指链接到不同的页面(下面有不同的图像和不同的描述)。
    • 如果您想优化您的页面,请将您的图库图像(例如gallery_bmw1.png)切割成碎片,然后使用预加载脚本来预加载这些碎片。还要在照片上使用 JPEG 而不是 PNG。目前,您的MM_preloadImages 会在每个页面加载中预加载所有大画廊图像,这是完全没有必要的,因为只显示一个。仅预加载那些出现在下载页面上的图像。您可以根据需要将图像嵌入页面。 CSS 背景,图片标签——这取决于你。如果图像是内容的一部分,我会将图像嵌入到图像标签中的页面。否则我使用 CSS 背景。
    • 包括左右透明层后面的,每页显示五张图片,而不是一张。每个页面都有不同的图像。问题是如何在不为每个图像定义 id/class 的情况下使用 CSS 背景?为了实现这一点,我可能必须使用我不熟悉的 CSM 或数据索引。我了解您的建议,但是查看您的代码,我不知道从那里去哪里,如何使用带编号的图像等引用图像 div 标签。我真的只是一个初学者。你能给我举个例子吗?欣赏!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    相关资源
    最近更新 更多