如何在 JQuery lightSlider 中延迟加载图像?
How do I lazy load images in JQuery lightSlider?
我目前有一个滑块 (JQuery lightSlider),其中包含很多图像并且一次显示一个。这显着增加了我的页面加载时间。我需要对图像应用延迟加载,以便只加载可见图像和任一侧。
我试过 this Github issue 中提供的示例,但是,它们似乎都只处理一次显示一张图像。
示例(箭头可见性为红色背景):
$("#lightSlider").lightSlider({
item: 4,
autoWidth: false,
slideMargin: 1,
mode: "slide",
useCSS: true,
cssEasing: 'ease',
easing: 'linear',
auto: true,
loop: true,
slideEndAnimation: true,
pause: 4000,
pauseOnHover: true,
pager: false,
enableDrag: false
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/lightslider/1.1.6/css/lightslider.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/lightslider/1.1.6/js/lightslider.min.js"></script>
<ul id="lightSlider" style="background: red;">
<li><img src="https://picsum.photos/100?random=1"></li>
<li><img src="https://picsum.photos/100?random=2"></li>
<li><img src="https://picsum.photos/100?random=3"></li>
<li><img src="https://picsum.photos/100?random=4"></li>
<li><img src="https://picsum.photos/100?random=5"></li>
<li><img src="https://picsum.photos/100?random=6"></li>
<li><img src="https://picsum.photos/100?random=7"></li>
<li><img src="https://picsum.photos/100?random=8"></li>
</ul>
我利用了window.IntersectionObserver。
我使用 rootMargin
来扩展 root
元素的边界框。这允许向左或向右加载一张图像。
一旦幻灯片中的图像进入扩展边界框,它的 data-src
属性用于设置 src
并加载图像。它将加载所有可见图像和一张附加图像在每一侧(以防止显示丢失的图像)。
onSliderLoad: function (el) {
var showActiveSlides = function (entries) {
entries.forEach(function (entry) {
if (entry.isIntersecting) {
entry.target.src = entry.target.dataset.src;
observer.unobserve(entry.target);
}
});
};
var imageWidth = el.find("li").outerWidth() + "px";
var observer = new window.IntersectionObserver(showActiveSlides, {
root: el.parent()[0],
rootMargin: "0px "+ imageWidth + " 0px " + imageWidth
});
el.find("li img").each(function () {
observer.observe(this);
});
}
$("#lightSlider").lightSlider({
item: 4,
autoWidth: false,
slideMargin: 1,
mode: "slide",
useCSS: true,
cssEasing: 'ease',
easing: 'linear',
auto: true,
loop: true,
slideEndAnimation: true,
pause: 4000,
pauseOnHover: true,
pager: false,
enableDrag: false,
onSliderLoad: function(el) {
var showActiveSlides = function(entries) {
entries.forEach(function(entry) {
if (entry.isIntersecting) {
entry.target.src = entry.target.dataset.src;
observer.unobserve(entry.target);
}
});
};
var imageWidth = el.find("li").outerWidth() + "px";
var observer = new window.IntersectionObserver(showActiveSlides, {
root: el.parent()[0],
rootMargin: "0px " + imageWidth + " 0px " + imageWidth
});
el.find("li img").each(function() {
observer.observe(this);
});
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/lightslider/1.1.6/css/lightslider.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/lightslider/1.1.6/js/lightslider.min.js"></script>
<ul id="lightSlider" style="background: red;">
<li><img data-src="https://picsum.photos/100?random=1"></li>
<li><img data-src="https://picsum.photos/100?random=2"></li>
<li><img data-src="https://picsum.photos/100?random=3"></li>
<li><img data-src="https://picsum.photos/100?random=4"></li>
<li><img data-src="https://picsum.photos/100?random=5"></li>
<li><img data-src="https://picsum.photos/100?random=6"></li>
<li><img data-src="https://picsum.photos/100?random=7"></li>
<li><img data-src="https://picsum.photos/100?random=8"></li>
</ul>
我目前有一个滑块 (JQuery lightSlider),其中包含很多图像并且一次显示一个。这显着增加了我的页面加载时间。我需要对图像应用延迟加载,以便只加载可见图像和任一侧。
我试过 this Github issue 中提供的示例,但是,它们似乎都只处理一次显示一张图像。
示例(箭头可见性为红色背景):
$("#lightSlider").lightSlider({
item: 4,
autoWidth: false,
slideMargin: 1,
mode: "slide",
useCSS: true,
cssEasing: 'ease',
easing: 'linear',
auto: true,
loop: true,
slideEndAnimation: true,
pause: 4000,
pauseOnHover: true,
pager: false,
enableDrag: false
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/lightslider/1.1.6/css/lightslider.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/lightslider/1.1.6/js/lightslider.min.js"></script>
<ul id="lightSlider" style="background: red;">
<li><img src="https://picsum.photos/100?random=1"></li>
<li><img src="https://picsum.photos/100?random=2"></li>
<li><img src="https://picsum.photos/100?random=3"></li>
<li><img src="https://picsum.photos/100?random=4"></li>
<li><img src="https://picsum.photos/100?random=5"></li>
<li><img src="https://picsum.photos/100?random=6"></li>
<li><img src="https://picsum.photos/100?random=7"></li>
<li><img src="https://picsum.photos/100?random=8"></li>
</ul>
我利用了window.IntersectionObserver。
我使用 rootMargin
来扩展 root
元素的边界框。这允许向左或向右加载一张图像。
一旦幻灯片中的图像进入扩展边界框,它的 data-src
属性用于设置 src
并加载图像。它将加载所有可见图像和一张附加图像在每一侧(以防止显示丢失的图像)。
onSliderLoad: function (el) {
var showActiveSlides = function (entries) {
entries.forEach(function (entry) {
if (entry.isIntersecting) {
entry.target.src = entry.target.dataset.src;
observer.unobserve(entry.target);
}
});
};
var imageWidth = el.find("li").outerWidth() + "px";
var observer = new window.IntersectionObserver(showActiveSlides, {
root: el.parent()[0],
rootMargin: "0px "+ imageWidth + " 0px " + imageWidth
});
el.find("li img").each(function () {
observer.observe(this);
});
}
$("#lightSlider").lightSlider({
item: 4,
autoWidth: false,
slideMargin: 1,
mode: "slide",
useCSS: true,
cssEasing: 'ease',
easing: 'linear',
auto: true,
loop: true,
slideEndAnimation: true,
pause: 4000,
pauseOnHover: true,
pager: false,
enableDrag: false,
onSliderLoad: function(el) {
var showActiveSlides = function(entries) {
entries.forEach(function(entry) {
if (entry.isIntersecting) {
entry.target.src = entry.target.dataset.src;
observer.unobserve(entry.target);
}
});
};
var imageWidth = el.find("li").outerWidth() + "px";
var observer = new window.IntersectionObserver(showActiveSlides, {
root: el.parent()[0],
rootMargin: "0px " + imageWidth + " 0px " + imageWidth
});
el.find("li img").each(function() {
observer.observe(this);
});
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/lightslider/1.1.6/css/lightslider.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/lightslider/1.1.6/js/lightslider.min.js"></script>
<ul id="lightSlider" style="background: red;">
<li><img data-src="https://picsum.photos/100?random=1"></li>
<li><img data-src="https://picsum.photos/100?random=2"></li>
<li><img data-src="https://picsum.photos/100?random=3"></li>
<li><img data-src="https://picsum.photos/100?random=4"></li>
<li><img data-src="https://picsum.photos/100?random=5"></li>
<li><img data-src="https://picsum.photos/100?random=6"></li>
<li><img data-src="https://picsum.photos/100?random=7"></li>
<li><img data-src="https://picsum.photos/100?random=8"></li>
</ul>