【问题标题】:Loading an image using data-src and not just src使用 data-src 而不仅仅是 src 加载图像
【发布时间】:2017-05-22 20:31:14
【问题描述】:

我正在尝试使用img data-src 标签而不是img src 来加载图像。我创建了两个简单的 JSFiddle,尽管只有一个带有 img src 的作品。这些都在这里:

img data-src example 这不起作用,我想要它

img src example 这个确实有效。

有人可以填写一下为什么 img data-src 不起作用吗?我对此感到困惑,并一直在寻找答案几个小时。

【问题讨论】:

  • 为什么它应该起作用??
  • 它只是一个属性,不做任何 OOTB。
  • OOTB = 开箱即用。
  • 谢谢。您能否填补空白以解释它的工作需要什么?

标签: javascript html


【解决方案1】:

您正在使用HTML5 data attributes,它不会替换 HTML 元素的普通 HTML 属性,例如 src。所以你的图片需要有src attribute,不管有没有data-src,都是相互独立的。

data-* 属性允许我们存储关于标准、语义 HTML 元素的额外信息 (...)


  • 当图像出现在屏幕上时加载它:

延迟加载图像的一种常见方法是将 src 设置为一个非常小的图像,有时是1x1px gif,一旦用户滚动并且图像在屏幕上,将 src 替换为真实图像。像这样的:

<img src="fake_small_image.gif" data-src="real_image.jpg">

data-src 可以称为data-whatever_you_want。这个想法是使用 JavaScript 跟踪页面的scrollTop 位置。一旦图像将出现,您将src 值"fake_small_image.gif" 替换为data-src 值"real_image.jpg"。您在此答案的 cmets 中发布的示例忽略了无效的初始 src 的分配。

var $window = $(window),
  window_height = $window.height() - 150, // I'm using 150 (a random number) so the image appears 150px after it enters the screen, so the effect can be appreciated
  $img = $('img.some_img'),
  img_loaded = false,
  img_top = $img.offset().top;

$window.on('scroll', function() {

  if (($window.scrollTop() + window_height) > img_top && img_loaded == false) {

    $img.attr('src', $img.attr('data-src_of_original_img'));

  }

});
#container {
  width: 100%;
  height: 200vh;
  background-color: grey;
}
.some_img {
  position: absolute;
  top: 100vh;
  width: 100%;
}
body {
  margin: 0;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="container">
  <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-src_of_original_img="https://i.imgur.com/Lcsolww.jpg" alt="" class="some_img">
</div>

  • 加载后立即显示图片:

类似的方法是使用 JavaScript 虚拟加载图像,一旦加载,将 src 分配给图像。这样做是为了防止图像在完全加载之前显示出来。

var $img = $('img.some_img'),
  $img_created_with_js = $('<img src="' + $img.attr('data-src_of_original_img') + '">');

$img_created_with_js
  .on('load', function() {

    $img.attr('src', $img.attr('data-src_of_original_img'));

  });
.some_img {
  width: 100%;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
  <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-src_of_original_img="https://i.imgur.com/Lcsolww.jpg" alt="" class="some_img">

这两种方法都可以应用于图像。例如:您可以等到用户滚动图像所在的位置然后开始加载它,但直到它完全加载后才显示。


资源:

【讨论】:

  • 数据属性并不是 CSS 特有的,所以称它们为“CSS 数据属性”只会让人感到困惑。它们可以与 CSS 选择器匹配,但它们主要用于向元素添加额外信息以供脚本使用。
  • @Karl-JohanSjögren 你完全正确,我的意思是 HTML。
  • 谢谢。这更清楚一点。原因是这里的代码加载了一个只有一个 img data-src 标签的图像:codepen.io/tevko/pen/BopQPL。我也看到其他网站也在这样做......
  • 非常感谢!这有帮助。虽然我仍然有一个我无法解决的问题。我正在尝试复制此网页的标题:syrup.design/ux-ui-redesigns-1。用于显示此图像的代码是 img data-src 和 data-img 。这是我真正想要实现的目标,但仍然无法理解在这种情况下它是如何完成的?到目前为止感谢
  • @HenryBrown 尽管原因不同,但该页面中的方法是相同的,让我在答案中添加其他情况:)
【解决方案2】:

没有定义“src”属性的图像是错误的 HTML。您会这​​样做的唯一实例是,如果您想延迟图像加载并将其与一些脚本(或在页面上使用一个图像标签动态加载差异图像)排队。

这是一个使用数据属性和 jQuery 来加载图像的示例,而无需调用 HTML 中的src 属性。

$('img').each(function() {
	var imageDataSource = $(this).data('src').toString();
  var setImageSource = $(this).attr('src', imageDataSource);
});
 img {
  width: 250px;
  height: auto;
  }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<img data-src="https://pmcdeadline2.files.wordpress.com/2013/07/chrisw__130723232812.jpg"/>

https://jsfiddle.net/z5t1gpeo/2/

【讨论】:

  • 谢谢,虽然这在我的实际网页中不起作用?
  • @HenryBrown 也许您缺少 jQuery 库?也许我们需要将图像函数包装在一个条件为if the image has a data attribute then fire。
猜你喜欢
  • 2016-04-21
  • 2016-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-29
  • 1970-01-01
  • 1970-01-01
  • 2016-06-23
相关资源
最近更新 更多