纯 CSS 实现有趣 Emoji 切换开关

147 阅读3分钟

前言

在前端开发中,如何通过简单的代码实现有趣的交互效果,是一个值得探索的话题。今天,我想分享一个用纯 CSS 实现的 Emoji 切换开关。这个小技巧不仅视觉效果吸引人,还能通过交互提供即时反馈,非常适合用在需要开关效果的场景中。

图片

一、为什么用纯 CSS?

使用纯 CSS 实现交互效果的好处在于:无需依赖 JavaScript,代码更简洁,性能更高,且易于维护。通过 CSS 的变量、3D 变换和过渡效果,我们可以实现一个动态、响应式的用户界面元素。

二、HTML 结构

首先,我们需要一个简单的 HTML 结构。这个结构包括一个 checkbox 和一个用于显示 Emoji 的容器。

<div class="switch">
  <input type="checkbox" class="switch__input" id="toggle">
  <label for="toggle" class="switch__label">Toggle</label>
  <div class="switch__wrapper">
    <div class="switch__emoji">
      <div class="switch__emoji-face"></div>
      <div class="switch__emoji-face"></div>
    </div>
  </div>
</div>
  • • switch__input 是一个隐藏的复选框,用于触发切换状态。
  • • switch__emoji 是 Emoji 的容器,包含两个 Emoji 表情。

三、CSS 样式

接下来,我们通过 CSS 来实现 Emoji 切换开关的样式和动画效果。

:root {
--hue223;
--bghsl(var(--hue), 10%90%);
--fghsl(var(--hue), 10%10%);
--trans-dur0.5s;
--trans-timing1cubic-bezier(0.6500.351);
--trans-timing2cubic-bezier(0.6500.351.5);
font-sizecalc(56px + (120 - 56) * (100vw - 280px) / (3840 - 280));
}

body {
background-colorvar(--bg);
colorvar(--fg);
display: flex;
justify-content: center;
align-items: center;
height100vh;
margin0;
}

.switch {
position: relative;
display: flex;
align-items: center;
}

.switch__input {
opacity0;
position: absolute;
}

.switch__label {
cursor: pointer;
margin-right1rem;
}

.switch__wrapper {
background-color: white;
border-radius50%;
box-shadow0001pxhsl(00%80%), 0004pxhsl(00%95%);
height2em;
width4em;
overflow: hidden;
position: relative;
}

.switch__emoji {
position: absolute;
height100%;
width200%;
transition: transform var(--trans-dur) var(--trans-timing1);
}

.switch__emoji-face {
position: absolute;
height100%;
width50%;
display: flex;
justify-content: center;
align-items: center;
transform-style: preserve-3d;
transition: transform var(--trans-dur) var(--trans-timing2);
}

.switch__emoji-face:before {
content"";
position: absolute;
width0.8em;
height0.8em;
border-radius50%;
background-colorhsl(4890%90%);
box-shadow0.25em0.25em0hsl(00%0%0.3);
}

.switch__emoji-face:after {
content"";
position: absolute;
width0.5em;
height0.5em;
border-radius50%;
background-colorhsl(4890%90%);
box-shadow0.25em0.25em0hsl(00%0%0.3);
}

.switch__input:checked + .switch__label + .switch__wrapper.switch__emoji {
transformtranslateX(100%);
}

.switch__input:checked + .switch__label + .switch__wrapper.switch__emoji-face:first-child {
transformrotateY(179.99deg);
}

.switch__input:checked + .switch__label + .switch__wrapper.switch__emoji-face:last-child {
transformrotateY(0);
}

四、动画效果解析

  1. 1. 3D 变换
    • • 使用 transform: translateX(100%) 实现滑块的移动效果。
    • • 使用 transform: rotateY(179.99deg) 实现 Emoji 的翻转效果。
  2. 2. 过渡效果
    • • 使用 transition 属性让动画更加平滑。
    • • cubic-bezier 定义了动画的缓动效果,使得动画更加自然。
  3. 3. 响应式设计
    • • 使用 calc() 和 vw 单位,确保字体大小和布局在不同设备上都能良好显示。

五、自定义 Emoji

如果你想自定义 Emoji,可以通过修改 .switch__emoji-face 的样式来实现。例如,可以调整 background-color 或添加更多的伪元素来创建不同的表情。

六、总结

通过纯 CSS,我们实现了一个有趣且功能丰富的 Emoji 切换开关。这个小技巧不仅视觉效果吸引人,还能通过交互提供即时反馈,非常适合用在需要开关效果的场景中。希望这篇文章能激发你探索更多 CSS 的可能性!

代码链接:code.juejin.cn/pen/7419571…

学习完这一篇,你已经超越99.99%的人,玩个游戏放松一下吧~