js实现一个长页面中的图片懒加载即滚动到其位置才加载

原理

1.给页面绑定滚动事件;

2.加载页面的时候把真正的图片地址放在某属性中;

3.然后再滚动过程中判断元素是否进入当前浏览器窗口内;

4.最后加载图片

难点

浏览器兼容是造成难点的原因所在,DOM标准和IE标准,每天前端的工作都在和它们打交道。思考下面的几段代码

1.window.pageYOffset ? window.pageYOffset : window.document.documentElement.scrollTop
目的:获得当前页面相对于窗口显示区左上角的 Y 位置.
DOM标准:window.pageYOffset;
IE标准:window.document.documentElement.scrollTop

2.window.innerHeight ? window.innerHeight : document.documentElement.clientHeight
目的:声明了窗口的文档显示区的高度和宽度,以像素计.
DOM标准:innerheight 和 innerwidth;
IE标准:document.documentElement 或 ducument.body (与 DTD 相关)的 clientWidth 和 clientHeight 属性作为替代

3.obj.getBoundingClientRect().top + window.document.documentElement.scrollTop + window.document.body.scrollTop
目的:获取页面元素的位置.
当浏览器为 非webkit内核 时,document.body.scrollTop值恒定为0,使用 document.documentElement.scrollTop才能取到正确值 ;
当浏览器为 webkit内核 时,document.documentElement.scrollTop值恒定为0,使用 document.body;

实现

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        img {
            display: block;
            margin-bottom: 50px;
            width: 400px;
            height: 400px;
        }
    </style>
</head>
<body>
    <img src="" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
    <img src="" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
    <img src="" data-src="http://ww1.sinaimg.cn/large/006y8mN6gw1fa7kaed2hpj30sg0l9q54.jpg" alt="">
    <img src="" data-src="http://ww1.sinaimg.cn/large/006y8mN6gw1fa7kaed2hpj30sg0l9q54.jpg" alt="">
    <img src="" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
    <img src="" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
    <img src="" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
    <img src="" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
    <img src="" data-src="http://ww1.sinaimg.cn/large/006y8mN6gw1fa7kaed2hpj30sg0l9q54.jpg" alt="">
    <img src="" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
    <img src="" data-src="http://ww4.sinaimg.cn/large/006y8mN6gw1fa5obmqrmvj305k05k3yh.jpg" alt="">
</body>
 
<script>
    var num = document.getElementsByTagName('img').length;
    var img = document.getElementsByTagName("img");
    var n = 0; //存储图片加载到的位置,避免每次都从第一张图片开始遍历
    lazyload(); //页面载入完毕加载可是区域内的图片
    //window.onscroll = lazyload;
    function lazyload() { //监听页面滚动事件
        var seeHeight = document.documentElement.clientHeight; //可见区域高度
        var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; //滚动条距离顶部高度
        for (var i = n; i < num; i++) {
            if (img[i].offsetTop < seeHeight + scrollTop) {
                if (img[i].getAttribute("src") == "") {
                    img[i].src = img[i].getAttribute("data-src");
                }
                n = i + 1;
            }
        }
    }
	
	
	
// 简单的节流函数
//fun 要执行的函数
//delay 延迟
//time  在time时间内必须执行一次
function throttle(fun, delay, time) {
    var timeout,
        startTime = new Date();
    return function() {
        var context = this,
            args = arguments,
            curTime = new Date();
        clearTimeout(timeout);
        // 如果达到了规定的触发时间间隔,触发 handler
        if (curTime - startTime >= time) {
            fun.apply(context, args);
            startTime = curTime;
            // 没达到触发间隔,重新设定定时器
        } else {
            timeout = setTimeout(function(){
	            fun.apply(context, args);
            }, delay);
        }
    };
};
// 实际想绑定在 scroll 事件上的 handler
//function lazyload(event) {}
// 采用了节流函数
window.addEventListener('scroll',throttle(lazyload,500,1000));
 
</script>
</html>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是一个简单的 JavaScript 实现瀑布流的代码示例: ```javascript const images = document.querySelectorAll('img[data-src]'); const config = { rootMargin: '50px 0px', threshold: 0.01 }; let observer = new IntersectionObserver(onIntersection, config); images.forEach(image => { observer.observe(image); }); function onIntersection(entries) { entries.forEach(entry => { if (entry.intersectionRatio > 0) { observer.unobserve(entry.target); preloadImage(entry.target); } }); } function preloadImage(img) { const src = img.getAttribute('data-src'); if (!src) return; img.src = src; } ``` 以上代码使用了 IntersectionObserver API 来观察图像是否进入视口。如果图像已进入视口,它将图像并停止观察该图像。图像是通过将图像的 `src` 属性设置为图像的实际 URL 实现的。 ### 回答2: 前端瀑布流大量图片进行是一种优化页面速度的方法。在页面时,只首屏可见部分的图片,当用户滚动到其它图片位置时再进行,这样可以避免一次性大量图片导致页面缓慢。以下是一个简单的实现代码示例: 1. 在HTML,为每个要图片一个自定义属性(例如data-src)来存储实际图片的URL,同时为这些图片设置一个占位符(例如使用一个透明的1x1像素的图片)。 ```html <img class="lazyload" data-src="实际图片的URL" src="占位符图片的URL"> ``` 2. 在CSS,将占位符图片的样式设置成需要的大小,并设置合适的高度,以便在图片前占据正确的空间。 ```css .lazyload { width: 100px; height: 150px; } ``` 3. 在JavaScript,监听页面滚动事件,在满足一定条件时图片。例如,在用户滚动图片可见时,将占位符图片的src替换为data-src的值。 ```javascript // 获取所有要图片元素 const lazyloadImages = document.querySelectorAll('.lazyload'); // 计算并设置可见区域的上下边界 const viewportTop = window.pageYOffset; const viewportBottom = viewportTop + window.innerHeight; // 遍历每个图片 lazyloadImages.forEach(image => { // 获取图片位置信息 const imageTop = image.offsetTop; const imageBottom = imageTop + image.offsetHeight; // 当图片位置在可见区域内时,实际图片 if (imageTop < viewportBottom && imageBottom > viewportTop) { image.src = image.getAttribute('data-src'); } }); ``` 通过上述代码,当用户滚动图片位置时,会动态对应的实际图片,从而实现了瀑布流大量图片进行的功能。 ### 回答3: 实现前端瀑布流大量图片进行的方法如下: 1. 首先,我们需要确定每个图片位置以及用户滚动到的位置。可以通过获取每个图片元素的位置信息和滚动位置信息来实现。可以使用JavaScript的`getBoundingClientRect()`函数获取元素的位置信息,`window.pageYOffset`获取滚动条垂直方向的位置。 2. 在页面完成后,先一部分图片。可以将这些图片的URL保存在一个数组,并设置一个计数变量,用于控制页面图片数量。 3. 监听页面滚动事件,当用户滚动时,判断当前滚动位置和每个图片位置的关系。如果用户滚动到了某个图片位置,就图片。这里可以使用`window.addEventListener('scroll', function(){...})`来监听滚动事件。 4. 当触发滚动事件时,遍历每个图片元素,对比滚动位置图片位置的关系。如果满足条件,则图片图片可以使用`<img>`元素的`src`属性,将图片URL设置为`src`属性的值即可。 5. 图片后,将计数变量一,继续下一个图片。 6. 重复以上步骤,直到完所有图片或用户关闭页面。 以下是一个简单的实现代码: ```javascript var images = ['image1.jpg', 'image2.jpg', 'image3.jpg', ...]; // 图片的URL数组 var count = 0; // 图片计数 // 第一批图片 loadImages(); // 监听滚动事件 window.addEventListener('scroll', function() { // 遍历每个图片元素 for (var i = 0; i < images.length; i++) { var img = document.getElementById('image' + i); var rect = img.getBoundingClientRect(); // 判断滚动位置图片位置关系 if (rect.bottom <= window.innerHeight) { // 图片 img.src = images[i]; count++; } } // 继续下一批图片 loadImages(); }); function loadImages() { // 图片的数量 var loadNum = 10; // 根据计数变量图片 for (var i = count; i < count + loadNum; i++) { var img = document.createElement('img'); img.id = 'image' + i; img.alt = 'Image ' + i; img.style.width = '100%'; img.dataset.src = images[i]; // 保存图片URL document.body.appendChild(img); } } ``` 以上代码是一个简单的实现示例,可以根据具体需求进行优化和修改。注意,这里使用了`dataset.src`保存图片URL,推荐使用这种方式来保存自定义属性,以便于后续使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值