Home > Web Front-end > JS Tutorial > Example codes for two effects of js image loading

Example codes for two effects of js image loading

零下一度
Release: 2017-05-15 09:47:28
Original
1626 people have browsed it

This article mainly introduces jspicturesLoading effect example code (delayed loading + waterfall flow loading), which is of great practical value. Friends who need it can refer to it

Mainly do two kinds of image loading effects

One is when there are many pictures on the page, a loading prompt with a reading effect (in order to verify the correct loading, 1 second is set The loading interval of the clock)

The other is to preload the image according to the position of the slider, so as to achieve the loading effect of waterfall flow without the user noticing it

One delayed loading

Main idea:

  1. ##HTML

    img tag , store the correct address in the src attribute, set a circling loading image for all images as the background

  2. js, read each img in turn, and replace the address in src Go to src and remove the background

  3. Every time a picture is successfully loaded, the percentage of the progress bar changes accordingly.

  4. If the loading is unsuccessful, it will prompt an image loading error.

The HTML structure is very simple, that is, a p.picList wraps all img, and then adds a simple progress bar p#loadBar

<body>
  <p class="picList">
    <img class="lazy" src="pic/compressed/picList1.jg">
    <img class="lazy" src="pic/compressed/picList2.jpg">
    <img class="lazy" src="pic/compressed/picList3.jpg">
    <img class="lazy" src="pic/compressed/picList4.jpg">
    <img class="lazy" src="pic/compressed/picList5.jpg">
    <img class="lazy" src="pic/compressed/picList6.jpg">
    <img class="lazy" src="pic/compressed/picList7.jpg">
    <img class="lazy" src="pic/compressed/picList8.jpg">
    <img class="lazy" src="pic/compressed/picList9.jpg">
    <img class="lazy" src="pic/compressed/picList10.jpg">
  </p>

  <p id="loadBar">
    <p id="loadBarMask"></p>
  </p>
</body>
Copy after login

css (scss used , various compatible prefixes will be automatically added when compiling)

.picList{
  img{
    width: 100px;
    height: 100px;
    position: relative;

    /*加载失败时显示灰底文字*/
    &:after{
      content: "( ⊙ o ⊙ )加载失败";
      font-size: 6px;
      font-family: FontAwesome;
      color: rgb(100, 100, 100);
      display: flex;
      justify-content: center;
      align-items: center;
      position: absolute;
      top: 0;
      left: 0;
      width: 100px;
      height: 100px;
      background-color: #ddd;
    }
  }
}

.lazy{
  background: url(../pic/loading.gif) center no-repeat;
  border: 1px solid black;
}

#loadBar{
  width: 200px;
  height: 15px;
  background: linear-gradient(90deg,#187103,#81b50b,#187103);
  border: 10px solid white;

  position: absolute;
  top: 150px;
  left: 50%;
  margin-left: -100px;

  #loadBarMask{
    width: 70%;//这个数值显示没有加载成功的图片
    height: 100%;
    background-color: beige;
    position: absolute;
    right: 0;
  }
}
Copy after login

There are two things to pay attention to in css:

  1. One is displayed when the image is loaded incorrectly The gray background text is placed in the after

    pseudo-class of img. When the image loading fails and the background gif image is removed, the content and style of this part will be displayed.

  2. One is the style of the progress bar. The writing is very simple, mainly a layer of green with gradient and a layer of white stacked together. Green means loaded, white means not loaded. When displaying, just control the width of the white layer directly.

js part (just execute loadPicPerSecond() directly)

var lazyPic = $(&#39;img.lazy&#39;);
var loadBarMask = $(&#39;#loadBarMask&#39;);
var picList = $(&#39;.picList&#39;);

var activePic = 0;
var totalPic = lazyPic.length;

/*每秒加载一张图片*/

function loadPicPerSecond(){

  lazyPic.each(function(index){

    var self = $(this);

    //console.log(self[0].complete);
    /*img标签已经事先写在html中,所以此时的complete状态全部都是true*/

    setTimeout(function(){

      src[index] = self.attr(&#39;src&#39;);
      self.attr(&#39;src&#39;,src[index]);
      self.removeClass(&#39;lazy&#39;);

      //图片获得正确src地址之后,可以执行下面的onload操作
      self[0].onload = function(){

        //加载读条loadBar动画
        countPic();
      }

      //图片获得的src地址不正确时,执行下面的onerror操作
      self[0].onerror = function(){
        /*this.style.background = &#39;url(pic/compressed/picList18.jpg) center no-repeat&#39;;*/
        countPic();
      }

    },1000*index);

  })

}

/*根据onload的执行情况来计算当前的图片加载进度.每onload一次,activePic就增加1*/

function countPic(){

  activePic++;

  var leftPic = totalPic - activePic;
  var percentPic = Math.ceil(leftPic/totalPic*100);//没有加载的图片百分比,和loadBarMask的宽度占比配合

  console.log("已加载"+(100-percentPic)+"%");

  loadBarMask.css("width",percentPic+"%");

  if(percentPic==0){
    $(&#39;#loadBar&#39;).hide();
  }
}
Copy after login

Second waterfall flow loading

Main idea:

  1. Monitor the window scrolling situation, and when the last picture that has been loaded is about to enter the window, start loading the following pictures.

  2. Assume that all image addresses already exist in a

    json data, read 10 image addresses each time, load them, and insert them into the existing waterfall flow end.

  3. Repeat until all images are loaded.

HTML is the same as the previous part, just write src as a normal address. The css is exactly the same.

js part

var lazyPic = $(&#39;img.lazy&#39;);
var loadBarMask = $(&#39;#loadBarMask&#39;);
var picList = $(&#39;.picList&#39;);

var scrollTop,
  clientHeight,
  scrollHeight;

var threshold = 200; //最后一张图片距离窗口200px的时候开始加载图片

var src = [];

var activePic = 0;
var totalPic = lazyPic.length;

//待加载的图片数据
var dirtSrc = "pic/compressed/picList";
var picData = {imgSrc:[
  dirtSrc + "20.jpg",
  dirtSrc + "21.jpg",
  dirtSrc + "22.jpg",
  dirtSrc + "23.jpg",
  dirtSrc + "24.jpg",
  dirtSrc + "25.jpg",
  dirtSrc + "26.jpg",
  dirtSrc + "27.jpg",
  dirtSrc + "28.jpg",
  dirtSrc + "29.jpg",
  dirtSrc + "30.jpg",
  dirtSrc + "31.jpg",
  dirtSrc + "32.jpg",
  dirtSrc + "33.jpg",
  dirtSrc + "34.jpg",
  dirtSrc + "35.jpg",
  dirtSrc + "36.jpg",
  dirtSrc + "37.jpg",
  dirtSrc + "38.jpg",
  dirtSrc + "39.jpg",
  dirtSrc + "40.jpg",
  dirtSrc + "41.jpg",
  dirtSrc + "42.jpg",
  dirtSrc + "43.jpg",
  dirtSrc + "44.jpg",
  dirtSrc + "45.jpg",
  dirtSrc + "46.jpg",
  dirtSrc + "47.jpg",
  dirtSrc + "48.jpg",
  dirtSrc + "49.jpg",
]};

//加载次数计数器
var scrollIndex = 0;

$(function(){

  /*监听窗口滚动情况*/
  $(window).on(&#39;scroll&#39;,function(){

    scrollTop = $(window).scrollTop();//$(window).scrollTop()==document.body.scrollTop
    clientHeight = $(window).height();
    scrollHeight = picList.last().height();//picList.last()[0].clientHeight

    /*目标与窗口的距离达到阈值时开始加载*/
    if(scrollHeight-clientHeight-scrollTop < threshold){
      scrollPic(10);
    }
  })
})

/*根据滚动程度加载图片,每次加载perAmount张*/

function scrollPic(perAmount = 10){

  var totalAmount = perAmount * (scrollIndex+1);

   //考虑到最后一次加载的时候,剩余的图片数量有可能达不到限定的每次加载的数量,这时候需要更改totalAmount的值
  if(totalAmount>picData.imgSrc.length){
    totalAmount = picData.imgSrc.length;
  }
  for(scrollIndex;scrollIndex<totalAmount;scrollIndex++){
    var oimg = new Image();
    oimg.src = picData.imgSrc[scrollIndex];
    picList.append(oimg);
  }

}
Copy after login

What is more urgent is the values ​​​​of scrollTop and height.

Object, I always can’t remember clearly, so follow js and jquery is all written down and can be used directly in the future. After figuring out the numerical relationship, the loading can be triggered as long as the conditions are met.

【Related Recommendations】


1.

Special Recommendation:"php Programmer Toolbox" V0.1 version Download

2.

Free js online video tutorial#3.

php.cn Dugu Jiujian (3) - JavaScript video tutorial

The above is the detailed content of Example codes for two effects of js image loading. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template