基于CSS mask-image 实现炫酷图片过渡效果之星球大战

简介: 基于CSS mask-image 实现炫酷图片过渡效果之星球大战

我正在参加「创意开发 投稿大赛」详情请看:掘金创意开发大赛来了!

在给公司开发官网的过程中,会有涉及到一些图片的鼠标悬停效果,鼠标悬停后会改变原图,单纯的渐隐渐现,放大缩小,左右平移已经满足不了产品经理期望了,总觉得不够惊艳,创意不够。其实作为一个开发者,也不会满足这普通日常的动画交互效果,在寻找新的 idea 时发现基于 CSS mask-image 可以实现很多不错的效果,本文将基于此属性实现四种图片过渡动画效果。

前置知识点 mask-image

mask-image CSS 属性用于设置元素上遮罩层的图像。默认值是 none,也就是无遮罩图片。因此,和 border 属性中的 border-style 属性类似,是一个想要有效果就必须设定的属性值。注意由于此属性目前还不是完全支持,部分浏览器还需要增加-webkit-前缀使用。

mask-image遮罩所支持的图片类型非常的广泛,可以是 url()静态图片资源,格式包括 JPG,PNG 以及 SVG 等都是支持的;也可以是动态生成的图片,例如使用各种 CSS3 渐变绘制的图片。语法上支持 CSS3 各类渐变,以及 url()功能符,image()功能符,甚至 element()功能符。同时还支持多背景,因此理论上,使用 mask-image 我们可以遮罩出任意我们想要的图形,非常强大。

语法如下:

/* <mask-source> value */
mask-image: url(masks.svg#mask1);
/* <image> values */
mask-image: linear-gradient(rgba(0, 0, 0, 1.0), transparent);
mask-image: image(url(mask.png), skyblue);
/* Multiple values */
mask-image: image(url(mask.png), skyblue), linear-gradient(rgba(0, 0, 0, 1.0), transparent);

示例演示,一个渐变色背景的纯文本元素增加 mask-image 属性后是什么效果呢。

8b13009bdc22e3b1e2d9ac15867ed7d.png

.mask {
  -webkit-mask-size: contain;
 -webkit-mask-image: url(https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/161ced10bf344eb085c34cefd8958dd1~tplv-k3u1fbpfcp-watermark.image?);
}

两张图片以渐变的方式合并成为一张图片。

b13bb9f8a1bf9d2ba7c7d0fc312b3dc.png

.scene-2 {
  background-image: url(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/fd9e83460a5645ccb78dc1c8efb86871~tplv-k3u1fbpfcp-watermark.image?);
  -webkit-mask-image: linear-gradient(to right, transparent 8%, #fff 30%);
}

如上图 1 所示,使用 mask-image 属性设置了一个 png 格式的客服图标,整个元素将只显示 png 图像的内容区域,其他区域都消失不见了。如图 2 所示,使用 mask-image 属性设置渐变颜色,使两种图片以渐变叠加的方式融合在了一起。

想必大家可以看出 mask-image 的主要功能了吧,CSS mask 属性在使用的时候就是 mask: xxx,现在随着这个属性的规范化,mask 属性实际上已经成为了诸多 mask-\*的缩写,除了 mask-image 还有以下属性,用法和 CSS background 用法是相仿的,具体属性值可以看 mask 遮罩层详解

mask-mode
mask-repeat
mask-position
mask-clip
mask-origin
mask-size
mask-type
mask-composite

介绍完主要的前置知识点,接下来就进入到具体的动画效果和实现过程。

效果一

c50a54d71faf14d6d5dd91292eff4c3.png

两张图片切换的过渡效果,动画开始前中间定位了一个透明的图标,动画开始后图标不断放大,直到图标放大到全屏此时已过渡到第二张图片,整个过程相当炫酷。基于上面的前置知识点,很快可想到对应的实现方式,这里需要额外用到其他的几个属性,用法和 background 类似:

  • mask-size: 如动画所示,中间的 png 图标从小放大,则需要这个属性控制图标的大小变化
  • mask-position: 图标一直是保持在水平垂直居中的位置放大,则需要这个属性图像的起始位置
  • mask-repeat:和 background 类似,不设置 no-repeat 图标会重复整个界面

动画效果示意图如下:

594d8fc451a93cc46f68c361955bed5.png

核心代码如下:

.scene-2 {
  background-image: url(https://assets.codepen.io/77020/sw-shape-zoom-scene-2.jpg);
  -webkit-mask-image: url(https://assets.codepen.io/77020/sw-jedi-crest.svg);
  -webkit-mask-size: 10%;
  -webkit-mask-position: center;
  -webkit-mask-repeat: no-repeat;
}
.scenes:is(:hover, :focus) .scene-2 {
  animation: scene-transition 4s cubic-bezier(1, 0, 1, 1) forwards;
}
@keyframes scene-transition {
  100% {
    -webkit-mask-size: 1800%;
  }
}

这时整体动画效果基本完成了,但是还有细节继续优化,动画开始前图标内的图片已经看到,这样对比整个界面不够鲜明美观,所以需要默认设置第二张图片的亮度,当动画进行到一定的阶段再彻底显示出来。

53d1f3e2e5dce50d3e09e525b787711.png

代码如下:

.scene-2 {
  filter: brightness(0%);
}
@keyframes scene-transition {
  25% {
    filter: brightness(100%);
  }
  100% {
    filter: brightness(100%);
  }
}

代码在线预览:code.juejin.cn/pen/7121173…

效果二

fd99babdfe071b05dd4ba24af22e7a0.png

如效果图所示,这里用到了锥形渐变 conic-gradient,通过一个完整的锥形渐变过渡图片。和上面的示例二类似,只不过把 linear-gradient 线性渐变改变为 conic-gradient 锥形渐变,通过控制锥形渐变的角度完成图片的过渡效果,动画效果示例图如下:

8c69797dd9ed141ad597b2fa261fbce.png

核心代码如下:

@property --angle {
  syntax: '<angle>';
  inherits: true;
  initial-value: -10deg;
}
.scene-2 {
  background-image: url(https://assets.codepen.io/77020/sw-clock-wipe-scene-2.jpg);
  z-index: -1;
  -webkit-mask-image:
    conic-gradient(
      #fff 0deg,
      #fff calc(var(--angle) - 10deg),
      transparent calc(var(--angle) + 10deg),
      transparent 360deg
    ),
    conic-gradient(
      transparent 340deg,
      #fff 360deg
    );
}
.scenes:is(:hover, :focus) .scene-2 {
  z-index: 1;
  animation: scene-transition 2s linear forwards;
}
@keyframes scene-transition {
  to { --angle: 370deg; }
}

代码在线预览:code.juejin.cn/pen/7121174…

效果三

c02bd179b8beb7f5233e53bd9c16b75.png

此效果由效果二的锥形渐变改变为 radial-gradient 径向渐变,控制渐变的范围从完全不见到覆盖整个元素。动画效果示例图如下:

4baa5a037b89154ac12ddd4fc080607.png

核心代码如下:

@property --radius {
  syntax: '<percentage>';
  inherits: true;
  initial-value: -5%;
}
@keyframes scene-transition {
  to { --radius: 105%; }
}
.scene-2 {
  background-image: url(https://assets.codepen.io/77020/sw-iris-wipe-scene-2.jpg);
  -webkit-mask-image: radial-gradient(
    circle,
    #fff calc(var(--radius) - 5%),
    transparent calc(var(--radius) + 5%)
  );
}
.scenes:is(:hover, :focus) .scene-2 {
  animation: scene-transition 2s linear forwards;
}

代码在线预览:code.juejin.cn/pen/7121179…

效果四

c8325032d506f26e79d452781ca4390.png

此效果和示例二中的效果一样,使用 linear-gradient 线性渐变过渡图片,这里将 mask-size 设置宽度的两倍,前面一半设置为透明色,则看到的还是第一张图片。触发动画的时候改变 mask-positionleft 变更为 right,动画效果示例图如下:核心代码如下:

2f1f4a4d1d882e30b4fcc7cad89d836.png

.scene-2 {
  background-image: url(https://assets.codepen.io/77020/sw-horizontal-wipe-scene-2.jpg);
  -webkit-mask-image: linear-gradient(
    to right,
    transparent 47.5%,
    #fff 52.5%
  );
  -webkit-mask-size: 210%;
  -webkit-mask-position: left;
}
.scenes:is(:hover, :focus) .scene-2 {
  -webkit-mask-position: right;
  transition: -webkit-mask-position 2s linear;
}

代码在线预览:code.juejin.cn/pen/7121181…

最后

本文基于 CSS mask-image 实现了四种图片过渡效果,相信这几种效果能够让你的老板眼前一亮,让你的项目炫酷起来吧。看到最后如果觉得有用,记得点个赞收藏起来,说不定哪天就用上啦。

专注前端开发,分享前端相关技术干货,公众号:南城大前端(ID: nanchengfe)

参考

mask-image:developer.mozilla.org/zh-CN/docs/…

codepen:codepen.io/lonekorean/…

mask 遮罩层详解:blog.csdn.net/qq_32682137…

CSS的mask-image属性详解 :www.php.cn/css-tutoria…



目录
相关文章
|
7月前
|
前端开发 UED 容器
CSS基础-背景属性:颜色、图片、重复
【6月更文挑战第9天】本文介绍了CSS背景属性,包括背景颜色、图片、重复的使用和常见问题。通过实例展示了如何设置背景颜色(如使用rgba()注意透明度影响)、背景图片(使用background-size控制缩放)、背景重复(避免默认平铺导致混乱)以及综合使用背景属性创建复杂效果。理解并熟练运用这些属性能提升网页设计的视觉层次和用户体验。建议通过实践不断探索和提升CSS技能。
89 4
|
2月前
|
前端开发
在Webpack配置文件中,如何配置loader以处理其他类型的文件,如CSS或图片
在Webpack配置文件中,通过设置`module.rules`来配置loader处理不同类型的文件。例如,使用`css-loader`和`style-loader`处理CSS文件,使用`file-loader`或`url-loader`处理图片等资源文件。配置示例:在`rules`数组中添加对应规则,指定`test`匹配文件类型,`use`指定使用的loader。
|
20天前
|
JavaScript 容器
jquery和CSS3图片排序过滤搜索插件
Filterizr是一款jquery和CSS3图片排序过滤插件。它可以对一组图片进行排序,按条件过滤和按关键字搜索。并在显示结果时使用指定的CSS3动画过渡效果。
25 2
|
2月前
|
编解码 前端开发 UED
探讨了CSS媒体查询在移动端开发中的应用,介绍了媒体查询的基本概念、常见条件及其在响应式布局、导航菜单、图片优化和字体调整等方面的具体应用
本文深入探讨了CSS媒体查询在移动端开发中的应用,介绍了媒体查询的基本概念、常见条件及其在响应式布局、导航菜单、图片优化和字体调整等方面的具体应用。通过实际案例分析和注意事项的讨论,旨在帮助开发者更好地理解和运用媒体查询,提升移动端用户体验。
50 4
|
2月前
CSS3实现的九宫格图片鼠标悬停去除遮罩层源码
CSS3实现的九宫格图片鼠标悬停去除遮罩层源码
20 0
CSS3实现的九宫格图片鼠标悬停去除遮罩层源码
|
3月前
|
前端开发 UED
Webpack 中处理 CSS 和图片资源的多 Loader 配置
【10月更文挑战第12天】 处理 CSS 和图片资源是 Webpack 配置中的重要部分。通过合理选择和配置多个 Loader,可以实现对这些资源的精细处理和优化,提升项目的性能和用户体验。在实际应用中,需要不断探索和实践,根据项目的具体情况进行灵活调整和优化,以达到最佳的处理效果。通过对 Webpack 中多 Loader 处理 CSS 和图片资源的深入了解和掌握,你将能够更好地应对各种复杂的资源处理需求,为项目的成功构建和运行提供坚实的基础。
97 1
|
5月前
|
前端开发
如何使用 CSS object-fit 进行图片的缩放和裁剪
如何使用 CSS object-fit 进行图片的缩放和裁剪
134 0
如何使用 CSS object-fit 进行图片的缩放和裁剪
|
5月前
|
前端开发
视觉冲击:CSS实现相册图片的放大效果,让网站首页更震撼!
视觉冲击:CSS实现相册图片的放大效果,让网站首页更震撼!
|
6月前
|
前端开发 容器
CSS【详解】对齐 (含文本垂直对齐,文本水平对齐、单行文本垂直居中、多行文本垂直居中、6 种方案块级元素水平垂直居中 、7 种方案图片水平垂直居中、文本自适应对齐、图标和文本对齐,图片和文本对齐等)
CSS【详解】对齐 (含文本垂直对齐,文本水平对齐、单行文本垂直居中、多行文本垂直居中、6 种方案块级元素水平垂直居中 、7 种方案图片水平垂直居中、文本自适应对齐、图标和文本对齐,图片和文本对齐等)
174 0
|
6月前
|
前端开发 C++
css 鼠标悬浮显示放大图片 vs 鼠标点击显示放大图片
css 鼠标悬浮显示放大图片 vs 鼠标点击显示放大图片
70 0

热门文章

最新文章

下一篇
开通oss服务