大图片加载从模糊到清晰:

https://www.cnblogs.com/wangmeijian/p/6822674.html?utm_source=tuicool&utm_medium=referral

解决办法是等图片完全加载好了再显示出来,具体点来说:

创建image对象,将要加载的图片URL赋值给image对象的src,监听image对象的onload事件,在事件回调函数内修改img元素的src,也可以设置图片元素的position将元素偏移非可视区直接加载,图片加载完后丢回可视区

<!DOCTYPE html>
<html>
<head><title>大图片加载从模糊到清晰</title><style type="text/css">.content{position: relative;}.thumbnails{width: 300px;position: absolute;left: 0;top: 0;z-index: 1;filter: blur(4px);transition: all 0.7s;}.complete{filter: blur(0);}</style>
</head>
<body><h3>大图片加载从模糊到清晰</h3><div class="content"><img class="thumbnails" src="https://img-blog.csdnimg.cn/base64/2022010610074794575.jpg"></div><script type="text/javascript">var ele = document.querySelector('.thumbnails');// 为了看到效果加个延时setTimeout(function(){// 若图片URL失效请自行替换var imgUrl = 'http://img8.zol.com.cn/bbs/upload/10569/10568721.jpg';var imgObject = new Image();imgObject.src = imgUrl;imgObject.onload = function(){ele.src = imgUrl;ele.setAttribute('class', 'thumbnails complete');}}, 1000)</script>
</body>
</html>

缩略图比较难看,为了有更好的用户体验,可以给缩略图加个高斯模糊filter: blur(4px),图片加载完毕修改img src属性后,再将高斯模糊渐渐过渡到filter: blur(0),图片就清晰了

demo中,缩略图用base64编码表示,这是节省带宽的一种方式,如果有多个缩略图,可用一个http请求以字符串按某个分隔符的形式返回,前端解析后使用,减少了http请求,图片加载优化还有更多方式,包括用css绘制简单的样式替代图片(根据需求选择更合适的图片格式,jpg适合色彩较多的场景,gif用于较复杂的动画,png适用于半透明场景),设置合理的缓存,图片懒加载(非可视区不加载)等等

懒加载

下面介绍懒加载,参考:https://segmentfault.com/a/1190000009755157

首先在渲染时,图片引用默认图片,然后把真实地址放在data-*属性上面
<image src='./../assets/default.png' :data-src='item.allPics' class='lazyloadimg'>
 然后是监听滚动,直接用window.onscroll就可以了,但是要注意一点的是类似于window的scroll和resize,还有mousemove这类触发很频繁的事件,最好用节流(throttle)或防抖函数(debounce)来控制一下触发频率。underscore和lodash里面都有封装这两个方法,这里先不多做介绍了。

接着要判断图片是否出现在了视窗里面,主要是三个高度:1,当前body从顶部滚动了多少距离。2,视窗的高度。3,当前图片距离顶部的距离。

<image src='./../assets/default.png' :data-src='item.allPics' class='lazyloadimg'>
<image src='./../assets/default.png' :data-src='item.allPics' class='lazyloadimg'>
<image src='./../assets/default.png' :data-src='item.allPics' class='lazyloadimg'>window.onscroll =_.throttle(this.watchscroll, 200);
watchscroll () {var bodyScrollHeight =  document.body.scrollTop;// body滚动高度var windowHeight = window.innerHeight;// 视窗高度var imgs = document.getElementsByClassName('lazyloadimg');for (var i =0; i < imgs.length; i++) {var imgHeight = imgs[i].offsetTop;// 图片距离顶部高度  if (imgHeight  < windowHeight  + bodyScrollHeight) {imgs[i].src = imgs[i].getAttribute('data-src');img[i].className = img[i].className.replace('lazyloadimg','')}}
}

其他常见判断:

1.页面滚动离开首屏(这时可显示回到顶部的按钮):document.body.scrollTop > window.innerHeight
2.页面滚动到底部了(这时可去调接口获取更多内容):

window.scrollY + window.innerHeight > document.body.offsetHeight

总结一下下:

 网页被卷起来的高度/宽度(即浏览器滚动条滚动后隐藏的页面内容高度)

(javascript)        document.documentElement.scrollTop //firefox

(javascript)        document.documentElement.scrollLeft //firefox

(javascript)        document.body.scrollTop //IE

(javascript)        document.body.scrollLeft //IE

(jqurey)             $(window).scrollTop()

(jqurey)             $(window).scrollLeft()

 网页工作区域的高度和宽度  

(javascript)       document.documentElement.clientHeight// IE firefox

(jqurey)             $(window).height()

 元素距离文档顶端和左边的偏移值  

(javascript)        DOM元素对象.offsetTop //IE firefox

(javascript)        DOM元素对象.offsetLeft //IE firefox

(jqurey)             jq对象.offset().top

(jqurey)             jq对象.offset().left

页面元素距离浏览器工作区顶端的距离  =  元素距离文档顶端偏移值  -   网页被卷起来的高度  ,即:

 页面元素距离浏览器工作区顶端的距离 =  DOM元素对象.offsetTop  -  document.documentElement.scrollTop

下面是另一篇文章,详细一点

大部分转载自:http://www.cnblogs.com/flyromance/p/5042187.html

示例(懒加载和回到顶部)http://blog.csdn.net/weixin_35955795/article/details/54411516

一、什么是图片滚动加载?

  通俗的讲就是:当访问一个页面的时候,先把img元素或是其他元素的背景图片路径替换成一张大小为1*1px图片的路径(这样就只需请求一次),只有当图片出现在浏览器的可视区域内时,才设置图片正真的路径,让图片显示出来。这就是图片懒加载。

二、为什要使用这个技术?

  比如一个页面中有很多图片,如淘宝、京东首页等等,如果一上来就发送这么多请求,页面加载就会很漫长,如果js文件都放在了文档的底部,恰巧页面的头部又依赖这个js文件,那就不好办了。更为要命的是:一上来就发送百八十个请求,服务器可能就吃不消了(又不是只有一两个人在访问这个页面)。

  因此优点就很明显了:不仅可以减轻服务器的压力,而且可以让加载好的页面更快地呈现在用户面前(用户体验好)。

三、怎么实现?

  关键点如下:

1、页面中的img元素,如果没有src属性,浏览器就不会发出请求去下载图片(也就没有请求咯,也就提高性能咯),一旦通过javascript设置了图片路径,浏览器才会送请求。有点按需分配的意思,你不想看,就不给你看,你想看了就给你看~

  2、如何获取正真的路径,这个简单,现在正真的路径存在元素的“data-url”(这个名字起个自己认识好记的就行)属性里,要用的时候就取出来,再设置;

  3、开始比较之前,先了解一些基本的知识,比如说如何获取某个元素的尺寸大小、滚动条滚动距离偏移位置距离(主要是比较这两项,浏览器距文档距离、元素距文档距离,两者相比较,就能判断元素位置,scroll、client、offset);

  1)屏幕可视窗口大小:对应于图中1、2位置处

    原生方法:window.innerHeight 标准浏览器及IE9+ || document.documentElement.clientHeight 标准浏览器及低版本IE标准模式 ||

        document.body.clientHeight 低版本混杂模式

  jQuery方法: $(window).height()

  2)浏览器窗口顶部与文档顶部之间的距离,也就是滚动条滚动的距离:也就是图中3、4处对应的位置;

    原生方法:window.pagYoffset——IE9+及标准浏览器 || document.documentElement.scrollTop 兼容ie低版本的标准模式 ||

         document.body.scrollTop 兼容混杂模式;

   jQuery方法:$(document).scrollTop();

  3)获取元素的尺寸:对应于图中5、6位置处;左边jquery方法,右边原生方法

    $(o).width() = o.style.width;

    $(o).innerWidth() = o.style.width+o.style.padding;

    $(o).outerWidth() = o.offsetWidth = o.style.width+o.style.padding+o.style.border;

    $(o).outerWidth(true) = o.style.width+o.style.padding+o.style.border+o.style.margin;

    注意:要使用原生的style.xxx方法获取属性,这个元素必须已经有内嵌的样式,如<div style="...."></div>;

    如果原先是通过外部或内部样式表定义css样式,必须使用o.currentStyle[xxx] || document.defaultView.getComputedStyle(0)[xxx]来获取样式值

  4)获取元素的位置信息:对应与图中7、8位置处

    1)返回元素相对于文档document顶部、左边的距离;

    jQuery:$(o).offset().top元素距离文档顶的距离,$(o).offset().left元素距离文档左边缘的距离

    原生:getoffsetTop(),高程上有具体说明,这边就忽略了;

      顺便提一下返回元素相对于第一个以定位的父元素的偏移距离,注意与上面偏移距的区别;

    jQuery:position()返回一个对象,$(o).position().left = style.left,$(o).position().top = style.top;

  4、知道如何获取元素尺寸、偏移距离后,接下来一个问题就是:如何判断某个元素进入或者即将进入可视窗口区域?下面也通过一张图来说明问题。

    1)外面最大的框为实际页面的大小,中间浅蓝色的框代表父元素的大小,对象1~8代表元素位于页面上的实际位置;以水平方向来做如下说明!

    2)对象8左边界相对于页面左边界的偏移距离(offsetLeft)大于父元素右边界相对于页面左边界的距离,此时可判读元素位于父元素之外;

    3)对象7左边界跨过了父元素右边界,此时:对象7左边界相对于页面左边界的偏移距离(offsetLeft)小于 父元素右边界相对于

      页面左边界的距离,因此对象7就进入了父元素可视区;

    4)在对象6的位置处,对象5的右边界与页面左边界的距离 大于 父元素左边界与页面左边界的距离;

    5)在对象5位置处时,对象5的右边界与页面左边界的距离 小于 父元素左边界与页面左边界的距离;此时,可判断元素处于父元素可视区外;

    6)因此水平方向必须买足两个条件,才能说明元素位于父元素的可视区内;同理垂直方向也必须满足两个条件;

大图片加载、懒加载实现原理(滚动加载图片)相关推荐

  1. Vue组件滚动加载、懒加载功能的实现,无限滚动加载组件实例演示

    效果图如下: 可以看到随着不断的滚动,页面组件的数量不断的加载. 其实加载的是后端返回的数据,因为涉及隐私,没有给显示出来. 利用懒加载,可以防止大量渲染造成卡顿降低用户体验. 页面的动态加载这块可以 ...

  2. 基于 Vue.js 的移动端组件库mint-ui实现无限滚动加载更多

    通过多次爬坑,发现了这些监听滚动来加载更多的组件的共同点, 因为这些加载更多的方法是绑定在需要加载更多的内容的元素上的, 所以是进入页面则直接触发一次,当监听到滚动事件之后,继续加载更多, 所以对于无 ...

  3. 用js实现滚动加载动画效果

    目录 一.效果图 二.代码部分 1.html结构 2.css样式部分 3.js部分 三.代码总结 一.效果图 可以看出,在悠方滚动条滚动的时候,当高度打到一定高度的时候就会出现一个div盒子,就好像刚 ...

  4. 什么是懒加载,如何实现图片或列表懒加载?

    文章目录 什么是懒加载 实现图片懒加载 列表懒加载 列表滚动加载 什么是懒加载 只在数据或内容即将进入视口或即将需要的时候才加载. 实现懒加载的好处有: 提高页面加载速度和响应速度.只加载当前用户需要 ...

  5. 关于图片加载的问题-如加载失败显示占位图,预加载,懒加载

    一.图片加载失败时,如图所示 <img v-if="src" :src="src" :onerror="errorImg">le ...

  6. JavaScript中的懒加载——概念,作用,原理,实现步骤,以及3种原生js实现方式

    1.什么是懒加载? 懒加载也就是延迟加载. 当访问一个页面的时候,先把img元素或是其他元素的背景图片路径替换成一张大小为1*1px图片的路径(这样就只需请求一次,俗称占位图), 只有当图片出现在浏览 ...

  7. cbitmap 从内存中加载jpg_[转载]windows照片查看器无法显示图片内存不足

    问题描述 最近在使用Windows照片查看器打开一个jpg文件的时候异常 Windows照片查看器无法显示此图片,因为计算机上的可用内存可能不足.请关闭一些目前没有使用的程序或者释放部分硬盘空间(如果 ...

  8. c语言运行不显示图片,为何加载烟花就换了一句,将图片加载进资源,结果运行中烟花不显示...

    为何加载烟花就换了一句,将图片加载进资源,结果运行中烟花不显示 为何将图片装载在资源中编译没任何错误,程序也可基本运行,资源中的图片不工作 #include     //标准的输入输出头文件 #inc ...

  9. Vue7 异步加载 懒加载

    vue开发过程中,我们会做出特别多特别多的组件,包括login,header,footer,main等等.这样使整个网站看起来就十分的庞大,当我们在打开网页的时候,突然一下子把这些所有的组件加载上来, ...

最新文章

  1. 以安全之名:俄罗斯强制所有消息应用留后门
  2. python接口测试面试题及答案_100道接口测试面试题收好了!【建议收藏】
  3. JQuery 常用积累(六)ZTree
  4. MySQL5.7新特性——在线收缩undo表空间 (转载)
  5. 随机数尽可能做到不重复
  6. springboot中如何创建定时任务,以及corn表达式规则
  7. 为您的Android,iOS等应用加入声波传输功能
  8. 一个好的函数(gcd)求最小公约数
  9. 毕设题目:Matlab图像配准
  10. 遥感大辞典_学遥感必读的十本书
  11. 学c++要不要先学C语言?
  12. 服务器显示504,帮您解决win7系统访问nginx服务器提示504 Gateway Time-out错误的修复技巧...
  13. h5支付不能打开支付宝 ios_iOS 手机网站支付转Native支付(H5支付页面调起支付宝客户端(app))...
  14. 怎么获取url_Requests库(十二)实战获取今日头条24小时热文
  15. V4L2 驱动框架概览
  16. 移动端300ms延迟的由来及解决方案
  17. Linux下 ifconfig、ifup、ifdown使用说明
  18. 服务器正在维护中王者荣耀,王者荣耀7月服务器正在维护中_王者荣耀7月3日服务器正在维护中解决方法_游戏吧...
  19. Matlab中的元胞数组(cell)
  20. 【SDOI2008】山贼集团

热门文章

  1. SpriteKit游戏开发点滴[4] 适配屏幕的技巧
  2. mysql创建销售表_MySQL创建数据表(CREATE TABLE语句)
  3. 售后服务也是crm客户管理系统的一大重点
  4. java将古诗竖排_写一个java程序 将一首古诗竖着排序从右往左读
  5. 论证是一门学问 如何让你的观点有说服力-12 类比论证 Arguments by Analogy
  6. Android中so文件的生成和调用
  7. 【CutMix】《CutMix:Regularization Strategy to Train Strong Classifiers with Localizable Features》
  8. 基于ElasticSearch实现平台化内容分发
  9. 网络爬虫Crawler~~~~python 爬虫~~~省市区~~抓~~快递公司~多线程
  10. linux 压力测试工具之ab