旋转的视差效果

我们来看一个非常有意思的视差效果。

实现这个效果的过程可以锻炼很多 CSS 的常见技巧,所以子辰觉得很有必要把它拿出来讲一讲。

话不多说,咱们这就开始

首先是 html:

ini 复制代码
<body>
  <div class="container">
    <div class="item">
      <img src="./assets/1.jpeg" alt="" />
    </div>
    <div class="item">
      <img src="./assets/2.jpeg" alt="" />
    </div>
    <div class="item">
      <img src="./assets/3.jpeg" alt="" />
    </div>
    <div class="item">
      <img src="./assets/4.jpeg" alt="" />
    </div>
    <div class="item">
      <img src="./assets/5.jpeg" alt="" />
    </div>
  </div>
</body>

结构很简单,就是一个容器里边包含五个子元素,每个子元素里包含一张图片。

接下来我们来分析一下布局:

这种布局我们可以用 grid,将容易分成九宫格,然后让一些子元素跨越多行或者多列,整体的思路就是网格布局。

css 复制代码
.container {
  width: 300px;
  height: 300px;
  margin: 0 auto;
  margin-top: 100px;
  display: grid;
  /* 设置三行三列 */
  grid-template-columns: repeat(3, 1fr);
  grid-template-rows: repeat(3, 1fr);
  /* 为每一格起一个名字 */
  grid-template:
    'A A B'
    'C D B'
    'C E E';
  /* 设置四周的间隔为 5px */
  gap: 5px;
}
.item {
  overflow: hidden;
  border: 2px solid;
}

现在的效果就是这样的,接了下来我们就要让指定的元素占据指定的区域了:

css 复制代码
/* etc... */
.item:nth-child(1) {
  grid-area: A;
}
.item:nth-child(2) {
  grid-area: B;
}
.item:nth-child(3) {
  grid-area: C;
}
.item:nth-child(4) {
  grid-area: D;
}
.item:nth-child(5) {
  grid-area: E;
}

现在基本的布局已经没问题了,但是图片的尺寸不对,我们把图片的大小设置一下:

css 复制代码
/* etc... */
.item img {
  width: 100%;
  height: 100%;
  /* 保持原有尺寸比例 */
  object-fit: cover;
}

这样就好看多了,接下来就是实现动画了。

首先父元素有一个旋转是吧?我们先搞定父元素:

css 复制代码
/* etc... */
.container {
  animation: rotation 10s linear infinite;
}
@keyframes rotation {
  to {
    transform: rotate(360deg);
  }
}

你看现在就旋转起来了,但是父元素旋转之后,它里边的子元素特别是这个图片也跟着旋转了,这不是我们想要的效果,所以我们可以来这么一招。

就是父元素顺时针旋转,图片逆时针选择,这样就相互抵消就看不出图片的旋转了:

css 复制代码
/* etc... */
.container {
  --r: 360deg;
  animation: rotation 10s linear infinite;
}
.item img {
  --r: -360deg;
  animation: rotation 10s linear infinite;
}
/* 通过变量来复用动画 */
@keyframes rotation {
  to {
    transform: rotate(var(--r));
  }
}

现在就实现了这样一个效果,这是因为图片旋转了,和容器不匹配了,所以我们要把图片的宽高设置为大于容器对对角线的尺寸,图片放大以后还要让图片居中,这样在旋转的时候就不会露白了:

css 复制代码
.container {
  width: 300px;
  height: 300px;
  margin: 0 auto;
  margin-top: 100px;
  display: grid;
  grid-template-columns: repeat(3, 1fr)
  grid-template-rows: repeat(3, 1fr);
  grid-template:
    'A A B'
    'C D B'
    'C E E';
  gap: 5px;
}
.item {
  /* 图片居中 */
  display: flex;
  justify-content: center;
  align-items: center;
  overflow: hidden;
  border: 2px solid;
}
.item img {
  /* 将图片放大 */
  width: 260%;
  height: 260%;
  object-fit: cover;
}
.item:nth-child(1) {
  grid-area: A;
}
.item:nth-child(2) {
  grid-area: B;
}
.item:nth-child(3) {
  grid-area: C;
}
.item:nth-child(4) {
  grid-area: D;
}
.item:nth-child(5) {
  grid-area: E;
}
.container {
  --r: 360deg;
  animation: rotation 10s linear infini
}
.item img {
  --r: -360deg;
  animation: rotation 10s linear infini
}
@keyframes rotation {
  to {
    transform: rotate(var(--r));
  }
}

现在效果就很完美啦!

总结

这就是我们今天要分享的内容,通过这个案例,我们学习了 grid 布局、object-fit 属性、CSS 变量、动画等技巧,希望对大家有所帮助。

本文来源

本文来源自渡一官方公众号:Duing ,欢迎关注,获取最新最全最深入的技术讲解

感谢你阅读本文,如果你有任何疑问或建议,请在评论区留言,如果你觉得这篇文章有用,请点赞收藏或分享给你的朋友!

相关推荐
swipe33 分钟前
把 JavaScript 原型讲透:从 `[[Prototype]]`、`prototype` 到 `constructor` 的完整心智模型
前端·javascript·面试
问道飞鱼38 分钟前
【前端知识】React 组件生命周期:从底层原理到实践场景
前端·react.js·前端框架·生命周期
CHU7290351 小时前
定制专属美丽时刻:美容预约商城小程序的贴心设计
前端·小程序
浩~~2 小时前
反射型XSS注入
前端·xss
AwesomeDevin2 小时前
AI时代,我们的任务不应沉溺于与 AI 聊天,🤔 从“对话式编程”迈向“数字软件工厂”
前端·后端·架构
harrain2 小时前
antvG2折线图和区间range标记同时绘制
前端·javascript·vue.js·antv·g2
德育处主任Pro2 小时前
从重复搭建到高效生产,RollCode的H5开发新范式
前端
蜡台2 小时前
SPA(Single Page Application) Web 应用(即单页应用)架构模式 更新
前端·架构·vue·react·spa·spa更新
网络点点滴3 小时前
组件通信-作用域插槽
前端·javascript·vue.js
kyriewen114 小时前
异步编程:从“回调地狱”到“async/await”的救赎之路
开发语言·前端·javascript·chrome·typescript·ecmascript·html5