likes
comments
collection
share

🌪️ 这个按钮有点飘 —— 教大家实现一个好玩的 3D 按钮

作者站长头像
站长
· 阅读数 27

前言

思路分析

接下来我们一步一步的分析 3D 按钮的实现过程。

绘制 2D 按钮

一下子就上强度恐怕有点强人所难了,因此我们先从绘制一个 2D 按钮开始。

由于我们要绘制 4 个按钮,为了利于排版,这里我用了 ul 实现。

<ul>
  <li>
    <a href="#"><span class="iconfont icon-qiandao"> Sign </span></a>
  </li>
  <li>
    <a href="#"><span class="iconfont icon-gonglve"> Comment </span></a>
  </li>
  <li>
    <a href="#"><span class="iconfont icon-youxi"> Like </span></a>
  </li>
  <li>
    <a href="#"><span class="iconfont icon-huaban"> Color </span></a>
  </li>
</ul>

按钮本身是有 文字 + Icon 的,Icon 我们可以去 iconfont 中获取,然后下载 zip 包解压,将其中的 iconfont.css 以及 iconfont.ttf 这两个文件放入我们的项目中,通过 link 标签来引入外部资源。

<head>
    <link rel="stylesheet" href="./iconfont.css" />
</head>

2D 按钮就是一个矩形,相信大家都会,这里需要注意的是,由于使用了 li 标签,因此我们需要将 lilist-style 设置为 none,否则会有小圆点。

ul {
    display: flex;
    justify-content: center;
    align-items: center;
}
ul li {
    list-style: none;
    margin: 0 25px;
}

我们看看此时的效果:

🌪️ 这个按钮有点飘 —— 教大家实现一个好玩的 3D 按钮

2D 还是相对容易实现的,接下来我们看看 3D 按钮的实现原理。

3D 按钮

我们仔细观察可以发现,3D 按钮和 2D 按钮的区别,仅仅在于 能否看到另外的两面 。也就是说,我们将 2D 按钮加上两个面,是不是从视觉效果上来看,就是 3D 按钮了呢?

有的小伙伴会说:道理我都懂啊,那怎么加上这两个面呢?我矩形怎么才能变成平行四边形啊?

这我们就要借助一个新的属性 —— skew 。我们看看 MDN 对这个属性的描述:

skew 定义了一个元素在二维平面上的倾斜转换。

什么意思呢?实际上它就是在水平和垂直方向上将图形的每个点扭曲一定的角度。对于水平方向,我们可以借助 skewX 实现,对于垂直方向,我们可以借助 skewY 实现。

我们先来尝试加上左边的面吧。

左边的面

🌪️ 这个按钮有点飘 —— 教大家实现一个好玩的 3D 按钮

左边的面是一个高大于宽的平行四边形,我们先绘制一个矩形可以吧。这里我们使用伪元素 ::before 进行左面的绘制。

🌪️ 这个按钮有点飘 —— 教大家实现一个好玩的 3D 按钮

这里没啥问题,为了让侧面更立体一些,我们可以将侧面颜色调暗,做一个阴面的效果。

🌪️ 这个按钮有点飘 —— 教大家实现一个好玩的 3D 按钮

有点意思了。

接下来我们要让它往上“扯”一点,刚刚我们了解到,如果要对垂直方向“扯”,要用到 skewY 函数了。这里我们要 垂直 45deg 的角度来扯。

ul li a::before {
    content: "";
    position: absolute;
    top: 8px;
    left: -16px;
    height: 100%;
    width: 16px;
    background-color: #cecece;
    transition: 0.5s;
    transform: skewY(-45deg);
}

🌪️ 这个按钮有点飘 —— 教大家实现一个好玩的 3D 按钮

嗯嗯,美的很。

另一面

实际上另一面的原理也是一样的,这里就不再赘述了,我们看看效果图:

🌪️ 这个按钮有点飘 —— 教大家实现一个好玩的 3D 按钮

Hover 悬浮态

接下来我们要做一个悬浮效果,让按钮更生动一些。

这里我们要用 tranform 中的 translate 函数了,它可以让我们的元素进行横向或者纵向的位移,位移的同时我们给它加点阴影,就像是按钮向上升了一样。

translate 函数可以接收两个参数,分别是 X 轴偏移的距离,以及 Y 轴偏移的距离。

 ul li:hover a {
    background-color: #dd4b39;
    transform: translate(15px, -15px);
    box-shadow: -50px 50px 50px rgba(0, 0, 0, 0.5);
}

我们看看最终效果:

🌪️ 这个按钮有点飘 —— 教大家实现一个好玩的 3D 按钮

Github 源码地址

关于本文的所有代码及素材,都已上传至 Github 仓库,小伙伴们有需要的自取:

juejin-demo/3d-button-demo at main · catwatermelon/juejin-demo (github.com)

结束语

本文就到此结束了,希望大家阅读本文能所收获。

如果小伙伴们有别的想法,欢迎留言,让我们共同学习进步💪💪。

如果文中有不对的地方,或是大家有不同的见解,欢迎指出🙏🙏。

如果大家觉得所有收获,欢迎一键三连💕💕。