时间:2021-07-01 10:21:17 帮助过:5人阅读
本文实例为大家分享了js实现多张图片延迟加载效果的具体代码,供大家参考,具体内容如下
具体代码如下:
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <!--做移动端响应式必须加的样式-->
- <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport">
- <title>Document</title>
- <style>
- *{
- margin:0;
- padding:0;
- font-size:14px;
- }
- ul,li{
- list-style:none;
- }
- img{
- display:block;
- border:none;
- }
- /*
- 最外层容器不设定宽高的
- */
- .news{
- padding:10px;
- }
- .news li{
- height:60px;
- padding:10px 0;
- border-bottom:1px solid #dedede;
- position:relative;
- }
- .news li > div:nth-child(1){
- position:absolute;
- top:10px;
- left:0;
- width:75px;
- height:60px;
- background:url('img/default.png') no-repeat center center;
- background-size:100% 100%;/*设置背景图片大小*/
- }
- .news li > div:nth-child(1) img{
- width:100%;
- height:100%;
- display:none;
- opacity:0;
- }
- .news li > div:nth-child(2){
- height:60px;
- margin-left:80px;
- }
- .news li > div:nth-child(2) h2{
- height:20px;
- line-height:20px;
- /*实现文字超出隐藏*/
- overflow:hidden;
- text-overflow:ellipsis;
- white-space: nowrap;
- }
- .news li > div:nth-child(2) p{
- line-height:20px;
- font-size:12px;
- color:#ccc;
- }
- </style>
- </head>
- <body>
- <ul id='news' class='news'>
- <li>
- <div>
- <img src="" alt="">
- </div>
- <div>
- <h2>我是一个标题</h2>
- <p>我是内容</p>
- </div>
- </li>
- </ul>
- <script>
- var news = document.getElementById('news')
- var imgList = news.getElementsByTagName('img')
- //1、获取需要绑定的数据(Ajax)
- var jsonData = null;
- ~function(){
- var xhr = new XMLHttpRequest();
- //URL地址后面加的随机数是在清除每一次请求数据时候(GET请求)产生的缓存
- xhr.open('GET','data.json?_='+Math.random(),false)
- xhr.onreadystatechange = function(){
- if(xhr.readystate ===4 && /^2\d{2}$/.test(xhr.status)){
- var val = xhr.responseText;
- jsonData = utils.formatJSON(val)
- }
- }
- xhr.send(null)
- }()
- //2、数据绑定->把jsonData存储的数据绑定到页面中(字符串拼接)
- ~function(){
- var str = '';
- if(jsonData){
- for(var i = 0,len = jsonData.length;i<len;i++){
- var curData = jsonData[i]
- str+='<li>';
- str+='<div><img src="" trueImg="'+curData['img']+'"></div>';
- str+='<div>';
- str+='<h2>'+curData['title']+'</h2>';
- str+='<p>'+curData['desc']+'</p>';
- str+='</div>';
- str+='</li>';
- }
- }
- news.innerHTML = str;
- }()
- //3、图片延迟加载
- //我先编写一个方法实现单张图片的延迟加载
- function lazyImg(curImg){
- var oImg = new Image;
- oImg.src = curImg.getAttribute('trueImg');
- oImg.onload = function(){
- curImg.src = this.src;
- curImg.style.display = "block";
- fadeIn(curImg)
- oImg = null
- };
- curImg.isLoad = true;
- }
- function fadeIn(curImg){
- var duration = 500,interval = 10,target = 1;
- var step = (target/duration)*interval;
- var timer = window.setInterval(function(){
- var curOP = utils.getCss(curImg,'opacity');
- if(curOP>1){
- curImg.style.opacity = 1;
- window.clearInterval(timer)
- return
- }
- curOP+=step;
- curImg.style.opacity = curOP;
- },interval)
- }
- function handleAllImage(){
- for(var i = 0,len = imgList.length;i<len;i++){
- var curImg = imgList[i];
- //当前的图片处理过了就不需要在重新的进行处理了
- if(curImg.isLoad = true){
- continue;
- }
- //只有A小于B的时候才进行处理,当前图片是隐藏的,我们其实计算的是它父节点的A
- var curImgPar = curImg.parentNode;
- var A = utils.offset(curImgPar).top + curImgPar.offsetHeight;
- var B = utils.win('clientHeight')+utils.win('scrollTop');
- if(A<B){
- lazyImg(curImg);
- }
- }
- }
- //4、开始的时候一秒加载第一屏的图片,当滚动条滚动的时候,再加载剩余的图片
- window.setTimeout(handleAllImage,1000);
- window.onscroll = handleAllImage;
- </script>
- </body>
- </html>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。