用css做一枚拟物风格的按钮

示例代码仓库:leixq1024/FrontEndSnippetHub: ✨html+css+js的前端特效合集

前言

不得不说小红书真不错, 复刻上面的一些小组件,对于练习css也很有帮助

​ 前两天刷小红书的时候看到有人用figma做了一个拟物的cmd按钮,效果如下

最终效果

我用css+svg复刻了这个按钮,效果如下

​ 其中svg是用来做按钮上面的噪点效果的,剩下主要是一些阴影的应用,具体就不做过多解释,可以看代码.

完整代码

html 复制代码
<!DOCTYPE html>
<html lang="zh-cn">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>拟物按钮</title>
    <style>
      :root {
        --btn-top: 13px;
      }
      html,
      body {
        position: relative;
        width: 100%;
        height: 100%;
        display: flex;
        align-items: center;
        justify-content: center;
        background: linear-gradient(180deg, #dfe2e4 50%, #657178 100%);
      }
      .btn {
        position: relative;
        width: 135px;
        height: 138px;
        border-radius: 30px;
        cursor: pointer;
        background: linear-gradient(
          90deg,
          #7c8288 0%,
          #4d5357 20%,
          #54595d 74%,
          #878c92 100%
        );
        box-shadow: rgba(0, 0, 0, 0.24) 0px 3px 8px;
      }
      .btn-1 {
        position: absolute;
        top: -16px;
        width: 100%;
        height: 100%;
        border: 1px solid rgba(139, 138, 159, 0.5);
        border-radius: 30px;
        background: linear-gradient(180deg, #c7c8cb 0%, #88959f 100%);
        box-shadow: inset 0 -1px 3px rgba(255, 255, 255, 0.6);
        overflow: hidden;
        display: flex;
        align-items: center;
        justify-content: center;
      }
      .btn-2 {
        position: absolute;
        width: 111px;
        height: 111px;
        border-radius: 15px;
        background: #272727;
      }
      .btn-2__warpper {
        position: absolute;
        top: var(--btn-top);
        width: 105px;
        height: 105px;
        border-radius: 13px;
        background: linear-gradient(
          90deg,
          #8f8f8f 0%,
          #626463 13%,
          #979c9d 89%,
          #797b7c 100%
        );
        border: 1px solid rgba(0, 0, 0, 0.5);
        transition: all 0.15s ease-in-out;
      }
      .btn-2__body {
        position: absolute;
        border-radius: 13px;
        width: 105px;
        height: 95px;
        background: linear-gradient(180deg, #fff 0%, #bfc4c7 100%);
        display: flex;
        align-items: end;
        justify-content: space-between;
        padding: 4px 12px;
        box-sizing: border-box;
        color: #929798;
        text-shadow: -1px -1px 1px #000, 1px 1px 1px rgba(255, 255, 255, 0.5);
        user-select: none;
      }
      /* 噪点背景 */
      .noise {
        position: absolute;
        top: -16px;
        left: 0;
        border-radius: 30px;
        opacity: 0.4;
        z-index: 999;
        display: block;
        transform: scaleY(2.15);
        transform-origin: top;
        pointer-events: none;
      }
    </style>
  </head>
  <body>
    <div class="btn" onmousedown="btnDown()" onmouseup="btnUp()">
      <!-- 噪点背景 -->
      <svg
        class="noise"
        width="135px"
        height="70px"
        viewBox="0 0 135 70"
        xmlns="http://www.w3.org/2000/svg"
      >
        <filter id="noise">
          <feTurbulence
            type="turbulence"
            baseFrequency="3"
            numOctaves="1"
            stitchTiles="stitch"
          />
        </filter>
        <rect width="100%" height="100%" filter="url(#noise)" />
      </svg>
      <div class="btn-1">
        <!-- 按键 -->
        <div class="btn-2"></div>
        <!-- 按键下层圆角矩形 -->
        <div class="btn-2__warpper">
          <!-- 按键白色部分 -->
          <div class="btn-2__body">
            <!-- 文字部分 -->
            <span>cmd</span>
            <span>⌘</span>
          </div>
        </div>
      </div>
    </div>
  </body>
  <script>
    // 按键按下
    const btnDown = () => {
      document.documentElement.style.setProperty('--btn-top', '17px')
    }
    // 按键抬起
    const btnUp = () => {
      document.documentElement.style.setProperty('--btn-top', '13px')
    }
  </script>
</html>
相关推荐
frjc2 小时前
Node.js 与 npm 极简安装教程
前端·npm·node.js
IMPYLH2 小时前
HTML 的 <main> 元素
前端·html
深念Y2 小时前
微服务抽取路线图:从胖单体到 ARM 集群
前端·arm开发·数据库·后端·微服务·云原生·架构
雪芽蓝域zzs3 小时前
Vue3 + Vite本地模拟数据(读取 JSON 数据)
前端
亿元程序员3 小时前
还有高手?用Shader让图片中的3D圆环转起来!
前端
灯澜忆梦3 小时前
【基于GO的Web开发14】gin请求重定向
前端·后端·golang·gin
qq_452396233 小时前
第十一篇:《前端性能优化体系:从加载到交互的全链路》
前端·性能优化·交互
Mh3 小时前
听说我兄弟喜欢跑车,所以必须安排上
前端·javascript·vue.js
zttbee3 小时前
vue学习(白话功能版)
前端·vue.js·学习·前端框架
qq_426003963 小时前
多语言新增语种全量测试策略
前端·javascript·python·pycharm·自动化