使用高斯模糊的效果逐步加载图片(仿Medium)

用过 Medium 的用户不会不记得它的图片加载方式——纯色-高斯模糊-加载完成并显示。

成都创新互联公司专注于渭南企业网站建设,响应式网站建设,成都商城网站开发。渭南网站建设公司,为渭南等地区提供建站服务。全流程按需策划,专业设计,全程项目跟踪,成都创新互联公司专业和态度为您提供的服务

这是一种很优雅的图片预加载的方式(因为 Medium 的图片质量都很高,如果全部一下加载的话,需要的时间难以想象,所以,这是一种很棒的做法)。从***次打开 Medium 这个网站开始,我就被这种技术给吸引住了——好吧,直到今天才去研究它。

在 Medium 网站,打开任何一篇文章,然后,我们来 inspect 一下:

 
 
  1.         id="512a"  
  2.         class="graf--figure graf--layoutCroppedHeightPreview graf-after--h3" 
  3.      
  4.         
  5.              style="padding-bottom: 30%;" 
  6.         >
 
  •         
  •              data-image-id="1*dZnfeZiXxf2BgN3VSQuOlA.jpeg"  
  •              data-width="3600"  
  •              data-height="3600"  
  •              data-scroll="native" 
  •         > 
  •             
  •                  crossorigin="anonymous"  
  •                  class="progressiveMedia-thumbnail js-progressiveMedia-thumbnail" 
  •             > 
  •             
  •                     width="75"  
  •                     height="22" 
  •             > 
  •             
  •                  data-src="https://cdn-images-1.medium.com/fit/t/1600/480/1*dZnfeZiXxf2BgN3VSQuOlA.jpeg"  
  •                  src="https://cdn-images-1.medium.com/fit/t/1600/480/1*dZnfeZiXxf2BgN3VSQuOlA.jpeg" 
  •             > 
  •              
  •                 <img class="progressiveMedia-noscript js-progressiveMedia-inner" src="https://cdn-images-1.medium.com/fit/t/1600/480/1*dZnfeZiXxf2BgN3VSQuOlA.jpeg"> 
  •              
  •         
  •  
  •     
  •  
  •   
  • 可以看到,Medium 为每一张图片都设置了这么长的一段 HTML。这样做的目的就是为了让这个图片的逐步加载过程能够平滑如一,同时还能在一定程度上提升用户体验。就算图片没有加载出来,显示给用户的是一个高斯模糊的图片,其实也不失美感。

    那么,这个图片的逐步加载过程具体是什么样的呢?

    1. 渲染一个 div 容器,这个容器就是用来显示最终展示给用户的图片的。通过对容器设置一个百分比的 padding-bottom 来让其比例和大小与最终图片的比例和大小相同,这样,就能避免图片加载出来的时候导致的页面的重排;
    2. 使用 img 标签来加载一张原图质量的 10% ~ 20% 左右的图片,这张图片的质量很低,而且很小,所以可以马上加载出来;
    3. 一旦小图加载完成,就开始使用 canvas 来进行绘制,添加模糊效果,同时,开始请求最终要加载的大图;
    4. 当最终的大图也加载完成之后,显示大图,隐藏掉 canvas。

    以上就是 Medium 的做法。

    我们可以自己来实现这个效果,实现过程如下:

    1. 渲染一个容器,保持与原图的比例和尺寸相同,填充一个较浅的背景色;
    2. 先加载小图,同时使用模糊效果;
    3. 小图加载完成,开始请求大图;
    4. 大图加载完成,显示大图,隐藏小图。

    所以,综合来看,其实并不复杂。

    首先,我们可以把大图和小图的 URL 和尺寸都存起来,通过标签的 data 属性去动态获取。所以,我们的 HTML 可以像下面这样写:

     
     
    1.         class="blur-img-container" 
    2.         data-real-width="1174" 
    3.         data-real-height="670" 
    4.         data-src="images/sm2.jpeg" 
    5.         src="https://cdn-images-1.medium.com/max/2000/1*0WwtDkE1q6HGZwD6Kn9SuQ.jpeg" 
    6. >  

    其中各个参数代表的含义是:

    同时,我们需要定义一些 CSS 的 class 来对大图和小图进行处理:

     
     
    1. .blur-img-container { 
    2.     position: relative; 
    3.     background: #eeeeee; 
    4.     background-size: cover; 
    5.     overflow: hidden; 
    6.  
    7. .blur-img-container img { 
    8.     position: absolute; 
    9.     top: 0; 
    10.     left: 0; 
    11.     width: 100%; 
    12.     height: 100%; 
    13.     opacity: 0; 
    14.     transition: all 0.4s ease-in-out; 
    15.  
    16. .blur-img-container .thumb-loaded { 
    17.     opacity: 1; 
    18.     filter: blur(10px); 
    19.     transform: scale(1); 
    20.  
    21. .blur-img-container .large-loaded { 
    22.     opacity: 1; 
    23.  
    24. .blur-img-container .thumb-hidden { 
    25.     opacity: 0; 
    26. }  

    然后,我们的重点在于 JavaScript 的处理。

    ***点,动态设置我们的容器的 padding-bottom。可以通过计算宽高比然后换算成百分比:

     
     
    1. elem.style.paddingBottom = `${(realHeight / realWidth) * 100}%`; 

    第二点,使用图像的 onload 事件来控制加载的进度:

     
     
    1. let thumb = new Image(); 
    2. thumb.src = thumbSrc; 
    3. thumb.onload = () => { 
    4.     // 小图加载完成,显示小图,设置样式 
    5.     setStyle(thumb, 'thumb-loaded'); 
    6. }; 
    7. elem.appendChild(thumb); 
    8.  
    9. let realImg = new Image(); 
    10. realImg.src = lgSrc; 
    11. realImg.onload = () => { 
    12.     // 大图加载完成,显示大图,隐藏小图 
    13.     setStyle(realImg, 'large-loaded'); 
    14.     setStyle(thumb, 'thumb-hidden'); 
    15. }; 
    16.  
    17. // 将大图添加到页面中 
    18. elem.appendChild(realImg);  

    其实,只要把上面两点主要的功能做好了,我们的这个效果基本上就实现了。

    可以通过我的 GitHub Repo 来查看完整的源代码和例子 blur-image。

    同时,我将这个小功能封装成了一个 package,需要的朋友可以通过 npm install blur-image 或者 bower install blur-image 进行安装和使用。具体的安装和使用方法可以查看文档。

    标题名称:使用高斯模糊的效果逐步加载图片(仿Medium)
    网页地址:http://www.shufengxianlan.com/qtweb/news29/231879.html

    网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

    广告

    声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

    猜你还喜欢下面的内容

    解决方案知识

    分类信息网