一个有趣的图片加载效果

简介: 一个有趣的图片加载效果

我正在参加「掘金·启航计划」

日常在业务中会经常使用到图片,而涉及到一些大图的加载等待的时间较长,一般为了用户更好的体验,会使用一些不同的图片加载效果,比如以下几种情况:

  1. 骨架屏:在页面上用占位框架代替图片,展示出图片的大致结构和区域,给用户一种“正在加载”的视觉体验。
  2. 进度条:用进度条的形式展示图片的加载进度,让用户能够了解图片的加载情况。
  3. 旋转动画:使用旋转的图标或者动画展示图片正在加载的状态,给用户一个视觉上的反馈。
  4. 模糊淡入:先展示一个高斯模糊的小图或者低分辨率的图片,等大图加载完成后再替换成高清的图片。

当然每种情况都有对应的利与弊,所适用的场景也有所不同,今天看到一个很有创意的图片加载效果,针对一些特定的场景和图片内容效果感觉很不错。以下是加载的效果图:

c80166a2a2b7b6856bd3d5b0e423c45.png

注意:以下本文讨论的加载效果不太适用于图片的第一次加载,只是一种交互效果供参考

整体的加载效果就是图片被横向拉伸了一样,随着加载的过程图片内容逐渐显示出来,这对于一些图片背景中包含纯色的情况下的效果更好,因为纯色部分不管怎么拉伸也是纯色,只有其他颜色在拉伸的过程中会交织在一起,随着加载的过程逐渐看到庐山真面目,不得不说这是一个不错的交互的效果。

image-rendering: pixelated

这就是今天的主角,image-rendering: pixelated 是一种 CSS 属性,用于控制图像在缩放或拉伸时的显示方式。设置为 pixelated 后,浏览器会以最接近原始图像的方式呈现缩放后的图像,使得图像看起来像是由像素点组成的。这种方式与传统的平滑缩放方式不同,可以更好地展现像素风格的图像,例如像素艺术作品、游戏素材等。简单来说这个 pixelated 可以让图片变成像素风,也就是马赛克的效果

image-rendering 属性可以控制图像在缩放或拉伸时的显示方式,常见的属性值有以下几种:

  1. auto: 默认值,浏览器会根据具体情况自动选择合适的显示方式进行呈现。
  2. crisp-edges: 将图像呈现为锐利的边缘,效果类似于将图像强行放大或缩小到整数像素的尺寸。
  3. pixelated: 以原始图像最接近的方式呈现缩放后的图像,使得图像看起来像是由像素点组成的。

今天主要介绍的是 pixelated,简单实用比如给一下图片设置 pixelated 后的效果和原图对比就可以清晰的看到马赛克像素化的效果。

.pixelated {
  image-rendering: pixelated;
}

tips: 要达到马赛克效果前需要将图片放大至模糊的效果才会生效,如果本质是清晰的图片是无法生效的,这里是将正常的图片缩小再设置更大的宽高后进行设置 pixelated

ff85ada631fc434543ef2e33da8acfa.png

观察这个效果和本文一开始的飞机加载效果之间似乎并没有什么明显的联系。这里使用了一个巧妙的实现方式,我们使用的图片内容主要都是横向排列的,从左到右逐渐加载。仔细观察可以发现,加载过渡区域的内容是基于当前纵向切面的像素点颜色值计算的。当我们不断向右移动时,对应像素点的颜色值也会不断变化,从而导致加载横条的颜色内容不断变化。下面这张示例图表现了这种效果更加明显:

81ace635399fe6a1a98277b2c21e820.png

这里其实是用到了scale进行放大,但是只放大了X轴,所有效果就是被横向拉的很长。

transform: scale(6000, 1);

那么这段代码怎么应用生效呢?

这里需要再引入一个知识点,以下引用来源于 mozilla

CSS 属性 image-rendering 用于设置图像缩放算法。它适用于元素本身,适用于元素其他属性中的图像,也应用于子元素。

重点是也应用于子元素。所以我们基于当前的图片元素扩展一个伪元素,在伪元素进行 pixelated 属性设置,核心代码如下:

.thing::after {
  left: 300px;
  transform-origin: 0 0;
  transform: scale(6000, 1);
  image-rendering: pixelated;
  transition: all 2s cubic-bezier(.5,0,0,1) ;
}
.thing:hover::after{
  left: 720px;
}

伪元素默认设置了 300px 的偏移量,鼠标悬停时设置为 720px,再配合 transition 即可产生动起来的效果,但这时候伪元素的色值是基于图片最左侧的色值不会有变化,如下所示:

c188060ef2e83bcbf13448823a65d0f.png

所以这个时候还需要增加另一个属性 background-position 上场,要让伪元素运动时对应上图片上的纵向色值,所以增加 background-positionleft 的数值一样,这里需要注意的是我们是要将伪元素的背景向左移动,所以是设置负数,代码如下:

.thing:after {  
  background-position: -300px 0;
}
.thing:hover:after{
  background-position: -720px 0;
}

最后来看一下不同的图片遇上后的新奇效果,当下面这种图片遇上从左往右逐渐显示的效果后会产生另一种不错的感觉。

b32c943456e56d4df9f8acdf0cac067.png

使用 pixelated 后的效果,本来界面上的曲线变成了直线逐渐延伸显示。

6e937bee430ffcbd4f993f9787c53b8.png

这个蜥蜴使用了纯色背景,所以在加载过程中拉伸是后也是纯色的,那么就剩下主体内容在发生变化,这也是一种不错的体验效果。

66b02ada6a3daacfa0e3a9370b8c303.png

码上掘金在线源码体验:

image.png

参考:codepen.io/andyfitz/pe…

最后

本文介绍了一个有趣的图片加载效果,主要使用了 image-rendering: pixelated 配合 background-position 产生的过渡加载效果。 加载效果不太适用于图片的第一次加载,只是一种交互效果供参考,针对不同的图片会产生别样的加载风格,比如上面的直线内容加载变为曲线,纯色背景的内容的加载只会有主体内容发生变化,有兴趣的可以尝试其他内容的图片也许你会发现新大陆。

看完本文如果觉得有用,记得点个赞支持,收藏起来说不定哪天就用上啦~



目录
相关文章
|
网络协议 网络架构
内网IP 外网IP 网卡 路由器通信过程(全)
       这几天上了计算机网络的课,对于老师讲的内容也是懵懵懂懂,一个慌神就没跟上,啥ip 啥NAT一脸蒙蔽。课后oogle补了点东西算是大致有了点了解,不过网上的总结都是零零散散而且点到即止。
5310 0
|
JavaScript 数据可视化
Vue引入Echarts词云图实现数据可视化(实现源码+案例)
本文主要讲Vue如何引入Echarts词云图实现数据可视化
2185 0
Vue引入Echarts词云图实现数据可视化(实现源码+案例)
|
C# Windows
wpf怎么使用WindowsFormsHost(即winform控件)
原文:wpf怎么使用WindowsFormsHost(即winform控件) 使用方法:   1、首先,我们需要向项目中的引用(reference)中添加两个动态库dll,一个是.
5893 0
|
9月前
|
前端开发 UED 开发者
精通 CSS 阴影效果:从基础到高级应用
本文详细介绍了CSS阴影效果的使用方法,包括`box-shadow`和`text-shadow`的基本语法、参数解释及进阶应用。通过多个示例展示了如何实现外阴影、内阴影、渐变阴影以及多重阴影效果,并结合实际场景如浮动按钮和卡片式设计,说明了阴影与背景的综合应用。此外,还提供了性能优化建议,帮助开发者在确保视觉效果的同时提升页面性能。最后,总结了CSS阴影的重要性及其对网页美观度和用户体验的提升作用。
909 6
|
10月前
|
人工智能 自然语言处理 测试技术
DeepSeek V3:DeepSeek 开源的最新多模态 AI 模型,编程能力超越Claude,生成速度提升至 60 TPS
DeepSeek V3 是深度求索公司开源的最新 AI 模型,采用混合专家架构,具备强大的编程和多语言处理能力,性能超越多个竞争对手。
1631 5
DeepSeek V3:DeepSeek 开源的最新多模态 AI 模型,编程能力超越Claude,生成速度提升至 60 TPS
|
NoSQL 程序员 Linux
轻踩一下就崩溃吗——踩内存案例分析
踩内存问题分析成本较高,尤其是低概率问题困难更大。本文详细分析并还原了两个由于动态库全局符号介入机制(it's a feature, not a bug)触发的踩内存案例。
|
Java 编译器 数据安全/隐私保护
Java 重写(Override)与重载(Overload)详解
在 Java 中,重写(Override)和重载(Overload)是两个容易混淆但功能和实现方式明显不同的重要概念。重写是在子类中重新定义父类已有的方法,实现多态;重载是在同一类中定义多个同名但参数不同的方法,提供多种调用方式。重写要求方法签名相同且返回类型一致或为父类子类关系,而重载则关注方法参数的差异。理解两者的区别有助于更好地设计类和方法。
1029 3
|
Cloud Native 安全 物联网
【阿里云云原生专栏】云边端一体化:阿里云如何利用云原生技术赋能物联网
【5月更文挑战第22天】阿里云借助云原生技术赋能物联网,实现云边端一体化,提升系统弹性与敏捷性。通过容器化部署,保证高可用性与可靠性。在智能交通等领域,阿里云提供高效解决方案,实现实时数据分析与决策。代码示例展示如何使用阿里云服务处理物联网数据。同时,阿里云重视数据安全,采用加密和访问控制保障数据隐私。丰富的工具和服务支持开发者构建物联网应用,推动技术广泛应用与发展。
586 1
青龙脚本集合
青龙脚本集合
2197 0