热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

css蒙版_我如何使用CSS蒙版构建情绪变化动画

css蒙版byAnkitKarnany通过AnkitKarnany我如何使用CSS蒙版构建情绪变化动画(HowIbuiltamoodchanginganimationusingCS

css 蒙版

by Ankit Karnany

通过Ankit Karnany

我如何使用CSS蒙版构建情绪变化动画 (How I built a mood changing animation using CSS masks)

Remember the cartoons we used to watch during our childhood? At that time they were the epitome of animations. Nowadays, animations aren’t just limited to cartoons — we come across them almost everyday when we check our phone or look at any device which has a screen.

还记得我们小时候看过的动画片吗? 当时它们是动画的缩影。 如今,动画不仅限于卡通,当我们检查手机或查看具有屏幕的任何设备时,几乎每天都会遇到动画。

Today, animation is used not only to attract attention but to enhance the user experience and guide user flow. In any good design, animations are added in such a way that they blend with the common flow, thus creating a seamless user experience.

如今,动画不仅用于吸引注意力,而且还可以增强用户体验并引导用户流程。 在任何好的设计中,动画的添加方式均应使其与常见流程融合在一起,从而创造出无缝的用户体验。

So, in this article we will build a simple animation of a face with different expressions, and we’ll learn a little bit of CSS in that process.

因此,在本文中,我们将构建具有不同表情的人脸的简单动画,并在此过程中学习一些CSS。

入门 (Getting started)

We will use a CSS technique which is somewhat rare among web developers, but that designers use quite often. It is called masking.

我们将使用CSS技术,这种技术在Web开发人员中很少见,但设计人员经常使用。 这称为遮罩

So what comes to your mind when you hear “mask?”

那么,当您听到“面具”时您会想到什么?

You’re probably picturing a cover on top of something. That’s all we need to understand.

您可能在想在某物上面盖上盖子。 这就是我们需要了解的所有内容。

Wait — but this article is related to coding and using CSS animation…

等等,但是本文与编码和使用CSS动画有关……

Don’t worry! We’ll get right to it.

不用担心 我们会正确处理的。

创建基本遮罩 (Creating the basic mask)

Let say we have a iv> with a background: green; and it looks something like this:

假设我们ith a background: iv> ith a background:绿色; 它看起来像这样:

Now, say I have a face.svg:

现在,说我有一个face.svg :

If we apply a CSS property mask-image: url(face.svg); on the iv>, you’ll be amazed to see what we get:

如果我们应用CSS属性mask-image: url(face.svg); iv>上,您会惊讶地看到我们得到了什么:

You might be thinking that something is odd here. The face.svg was placed over the iv>, but it took up the color of the background. This is the opposite of what you might have expected. This happens because of the mask-type property which makes the opaque part of the svg transparent. This allows the background color to be visible.

您可能会认为这里有些奇怪。 所述face.svg被放置在 IV>,但它占去了彩色Ó f the back地面。 这与您预期的相反。 发生这种情况是因为f the mas k型属性使svg的不透明部分透明。 这样可以使背景色可见。

Let’s not get deeper into that now. Just keep in mind that we can use background-color to change the color of the mask. If you are familiar with different ways of using background-color, we can also use gradients and write a simple gradient which fills red in the center and radially spreads into black outwards. The code for that is the following:

现在让我们不深入讨论。 请记住,我们可以使用background-color更改蒙版的颜色。 如果您熟悉使用background-color不同方式,我们还可以使用渐变并编写一个简单的渐变,该渐变在中心填充红色,并在径向向外扩展为黑色。 相应的代码如下:

background-image: -webkit-radial-gradient( hsla(0, 100%, 50%, .7), hsla(0, 100%, 20%, .8), hsla(0, 100%, 10%, 1));

Which results in this:

结果如下:

添加动画 (Adding the animation)

Now let’s add some animation to this empty face. For this I have expression.svg which looks like the below image. For simplicity, I have created all the svgs with the same width and height, so that we avoid aligning the face and expression manually.

现在,让我们向该空面Kong添加一些动画。 为此,我有expression.svg ,如下图所示。 为简单起见,我创建了所有具有相同宽度和高度的svg,以便避免手动对齐面部和表情。

Now mask-image has this cool option which allows multiple images to be used as masks. So we can do this: mask-image: url(face.svg), url(expression.svg);. This is what we have now:

现在mask-image有了这个很酷的选项,可以将多个图像用作遮罩。 这样我们就可以做到: mask-image: url(face.svg), url(expression.svg); 。 这就是我们现在所拥有的:

One of the most important properties of CSS masks is mask-position, which positions the mask from the top left corner relative to its parent. And I can position multiple masks using the property mask-position just like mask-image.

CSS遮罩的最重要属性之一是mask-position ,它相对于其父遮罩从左上角定位遮罩。 而且我可以使用属性mask-position来放置多个遮罩,就像mask-image

So to make the face sad, we can use something like this: mask-position: 0 0, 0 12px;. And the result is this:

因此,要使脸部悲伤,我们可以使用类似这样的方法: mask-position: 0 0, 0 12px; 。 结果是这样的:

The first position 0 0 is for the face.svg, and the second 0 12px is for expression.svg. This pushes it 12px from above and results in the above expression.

第一个位置0 0用于face.svg ,第二个0 12px用于expression.svg 。 这会将其从上方推12px ,并产生以上表达式。

应用功能 (Applying functionality)

Now let’s animate these expressions on hover. So the complete code we get after applying the hover pseudo class is the following:

现在让我们在悬停时为这些表达式设置动画。 因此,在应用悬停伪类后获得的完整代码如下:

i { background-image: -webkit-radial-gradient(hsla(0, 100%, 50%, .7), hsla(0, 100%, 20%, .8) 60%, hsla(0, 100%, 10%, 1)); mask-image: url('face.svg'), url('expression.svg'); mask-position: 0 0, 0 12px; /* To make the sad expression */

transition: mask-position .5s ease-out;}

i:hover { background-image: -webkit-radial-gradient(hsla(120, 100%, 50%, .7), hsla(120, 100%, 20%, .8) 60%, hsla(120, 100%, 10%, 1));

mask-position: 0 0, 0 0; /* To make the happy expression */

transition: mask-position .1s linear;}

After playing with the CSS a bit more, we can do this:

在使用CSS多一点之后,我们可以执行以下操作:

This is one of the methods we can use to build those gripping animations we come across almost daily.

这是我们几乎每天都可以用来制作那些令人抓狂的动画的方法之一。

重要说明 (One Important Note)

The masking properties might not work across all the browsers. So to make them work in all the browsers, just prepend browser specific labels like -webkit- , -moz- & -0- .

屏蔽属性可能不适用于所有浏览器。 因此,要使其在所有浏览器中都能正常工作,只需在浏览器特定的标签前加上-webkit- ,- -moz--0-

You can look at the complete code here on github and codepen.

您可以在github和codepen上查看完整的代码。

Thanks for reading! I hope you learned something.

谢谢阅读! 我希望你学到了一些东西。

翻译自: https://www.freecodecamp.org/news/how-i-built-a-mood-changing-animation-using-css-masks-565b16ed051f/

css 蒙版



推荐阅读
  • 本文深入解析了WCF Binding模型中的绑定元素,详细介绍了信道、信道管理器、信道监听器和信道工厂的概念与作用。从对象创建的角度来看,信道管理器负责信道的生成。具体而言,客户端的信道通过信道工厂进行实例化,而服务端则通过信道监听器来接收请求。文章还探讨了这些组件之间的交互机制及其在WCF通信中的重要性。 ... [详细]
  • MATLAB字典学习工具箱SPAMS:稀疏与字典学习的详细介绍、配置及应用实例
    SPAMS(Sparse Modeling Software)是一个强大的开源优化工具箱,专为解决多种稀疏估计问题而设计。该工具箱基于MATLAB,提供了丰富的算法和函数,适用于字典学习、信号处理和机器学习等领域。本文将详细介绍SPAMS的配置方法、核心功能及其在实际应用中的典型案例,帮助用户更好地理解和使用这一工具箱。 ... [详细]
  • 2018 HDU 多校联合第五场 G题:Glad You Game(线段树优化解法)
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6356在《Glad You Game》中,Steve 面临一个复杂的区间操作问题。该题可以通过线段树进行高效优化。具体来说,线段树能够快速处理区间更新和查询操作,从而大大提高了算法的效率。本文详细介绍了线段树的构建和维护方法,并给出了具体的代码实现,帮助读者更好地理解和应用这一数据结构。 ... [详细]
  • MyISAM和InnoDB是MySQL中最为广泛使用的两种存储引擎,每种引擎都有其独特的优势和适用场景。MyISAM引擎以其简单的结构和高效的读取速度著称,适用于以读操作为主、对事务支持要求不高的应用。而InnoDB引擎则以其强大的事务处理能力和行级锁定机制,在需要高并发写操作和数据完整性的场景下表现出色。选择合适的存储引擎应综合考虑业务需求、性能要求和数据一致性等因素。 ... [详细]
  • TypeScript ESLint: 避免使用隐式 any 类型,建议指定更具体的类型以提高代码可维护性
    在使用 Vue 引入 SVGSpriteLoader 时遇到了问题。具体表现为在 `shims-vue.d.ts` 文件中进行相关配置后,WebStorm 报错。为了解决这一问题,建议避免使用隐式 `any` 类型,而是指定更具体的类型,以提高代码的可维护性和类型安全性。可以通过在 ESLint 配置中禁用隐式 `any` 类型来实现这一目标。 ... [详细]
  • 本文探讨了如何在C#应用程序中通过选择ComboBox项从MySQL数据库中检索数据值。具体介绍了在事件处理方法 `comboBox2_SelectedIndexChanged` 中可能出现的常见错误,并提供了详细的解决方案和优化建议,以确保数据能够正确且高效地从数据库中读取并显示在界面上。此外,还讨论了连接字符串的配置、SQL查询语句的编写以及异常处理的最佳实践,帮助开发者避免常见的陷阱并提高代码的健壮性。 ... [详细]
  • 本文探讨了利用JavaScript实现集合的对称差集算法的方法。该算法旨在处理多个数组作为输入参数,同时保留每个数组中元素的原始顺序。算法不会移除单个数组内的重复元素,但会删除在不同数组之间出现的重复项。通过这种方式,能够有效地计算出多个数组的对称差集。 ... [详细]
  • 使用 `git stash` 可以将当前未提交的修改保存到一个临时存储区,以便在后续恢复工作目录时使用。例如,在处理中间状态时,可以通过 `git stash` 命令将当前的所有未提交更改推送到一个新的储藏中,从而保持工作目录的整洁。此外,本文还将详细介绍如何解决 `git stash pop` 时可能出现的冲突问题,帮助用户高效地管理代码变更。 ... [详细]
  • 在 Kubernetes 中,Pod 的调度通常由集群的自动调度策略决定,这些策略主要关注资源充足性和负载均衡。然而,在某些场景下,用户可能需要更精细地控制 Pod 的调度行为,例如将特定的服务(如 GitLab)部署到特定节点上,以提高性能或满足特定需求。本文深入解析了 Kubernetes 的亲和性调度机制,并探讨了多种优化策略,帮助用户实现更高效、更灵活的资源管理。 ... [详细]
  • 在C#中开发MP3播放器时,我正在考虑如何高效存储元数据以便快速检索。选择合适的数据结构,如字典或数组,对于优化性能至关重要。字典能够提供快速的键值对查找,而数组则在连续存储和遍历方面表现优异。根据具体需求,合理选择数据结构将显著提升应用的响应速度和用户体验。 ... [详细]
  • Spring框架中的面向切面编程(AOP)技术详解
    面向切面编程(AOP)是Spring框架中的关键技术之一,它通过将横切关注点从业务逻辑中分离出来,实现了代码的模块化和重用。AOP的核心思想是将程序运行过程中需要多次处理的功能(如日志记录、事务管理等)封装成独立的模块,即切面,并在特定的连接点(如方法调用)动态地应用这些切面。这种方式不仅提高了代码的可维护性和可读性,还简化了业务逻辑的实现。Spring AOP利用代理机制,在不修改原有代码的基础上,实现了对目标对象的增强。 ... [详细]
  • 本文探讨了基于点集估算图像区域的Alpha形状算法在Python中的应用。通过改进传统的Delaunay三角剖分方法,该算法能够生成更加灵活和精确的形状轮廓,避免了单纯使用Delaunay三角剖分时可能出现的过大三角形问题。这种“模糊Delaunay三角剖分”技术不仅提高了形状的准确性,还增强了对复杂图像区域的适应能力。 ... [详细]
  • 本文详细介绍了在 Python 中使用 OpenCV 进行图像处理的各种方法和技巧,重点讲解了腐蚀(erode)和膨胀(dilate)操作,以及开运算和闭运算的应用。腐蚀操作可以去除前景物体的边缘部分,而膨胀操作则可以扩展前景物体的边界。开运算和闭运算则是结合这两种基本操作,用于消除图像中的噪声和填充空洞,提高图像处理的效果。通过具体的代码示例和实际应用案例,读者可以深入理解这些技术在图像处理中的重要作用。 ... [详细]
  • PHP中元素的计量单位是什么? ... [详细]
  • Understanding the Distinction Between decodeURIComponent and Its Encoding Counterpart
    本文探讨了 JavaScript 中 `decodeURIComponent` 和其编码对应函数之间的区别。通过详细分析这两个函数的功能和应用场景,帮助开发者更好地理解和使用它们,避免常见的编码和解码错误。 ... [详细]
author-avatar
白白加黑黑99_889
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有