一个dark mode的动画

简介: 一个dark mode的动画

前言


还记得去年更新了几个 Dark Mode 的动画,比如这个按钮动画:



image.png

还有这个拉绳动画:

image.png


今年掘金出了一个码上掘金的playground,就顺势再更新几个吧~


本次灵感来源于第一个按钮动画,当时看着挺满意的,现在就觉得差点意思,完全可以不用加 span 做遮挡,svg好像也是多余的,直接用CSS画出来可能会更好... 反正做一个小小的改进吧,成果如下


image.png


有手就行的代码,但还是简单说一下思路,毕竟有字数限制🤷‍♂️


HTML+CSS


因为涉及到状态的切换,所以 HTML 部分我们依然使用 checkbox 的选中和未选中两种状态来代表明暗两种模式。


<h1>Mancuoj</h1>
<input type="checkbox" id="dark-checkbox" />
<label for="dark-checkbox"></label>
复制代码


然后我们需要在CSS部分将 checkbox 隐藏,用 label 替代并画出按钮。


/* 一些预设跳过了 */
label {
  display: block;
  position: relative;
  width: 90px;
  height: 50px;
  border-radius: 50px;
  background-color: $bg-color;
  cursor: pointer;
  &:before,
  &:after {
    display: block;
    position: absolute;
    content: "";
    width: 36px;
    height: 36px;
    border-radius: 50%;
    top: 7px;
    left: 7px;
    transition: all 1s;
  }
  &:before {
    background: linear-gradient(#fcd670, #f2784b);
  }
}
复制代码


这里我们用 :beforeafter 画出两个圆,将其中一个⚪加上颜色代表☀,然后两个⚪取交集部分作为🌙,如图所示:


image.png


隐藏复选框,然后移动⚪位置即可,也可以在这一步再把 :after 的内容画出来,不用移动位置:


#dark-checkbox {
  display: none;
  &:checked + label {
    &:before {
      background: linear-gradient(#f8f4ed, #e9ddb6);
      transform: translateX(40px);
    }
    &:after {
      background-color: $bg-color;
      transform: translateX(24px);
    }
  }
}
复制代码

然后是与 JS 联动的部分:


.dark {
  background-color: $dark-color;
  color: $light-color;
  transition: all 1s;
}
复制代码


JS


因为想要用 localStorage 记录用户的设置,所以就显得比较麻烦:


const changeTheme = () => {
  const darkCheck = document.getElementById("dark-checkbox");
  darkCheck.addEventListener("click", () => {
    if (darkCheck.checked) {
      document.body.classList.add("dark");
      localStorage.setItem("css", "dark");
    } else {
      document.body.classList.remove("dark");
      localStorage.removeItem("css");
    }
  });
  if (localStorage.getItem("css")) {
    document.body.className = "dark";
    darkCheck.checked = true;
  }
};
changeTheme();
复制代码


如果不用 localStorage 直接用一个 toggle() 一行就够了,你甚至可以不用JS,都随你~

目录
相关文章
|
编解码 并行计算
ffmpeg cuda加速 h264->hevc(h265) 缩小存储空间
ffmpeg cuda加速 h264->hevc(h265) 缩小存储空间
437 0
|
算法 网络协议 Linux
Linux模块文件编译到内核与独立编译成.ko文件的方法
Linux模块文件编译到内核与独立编译成.ko文件的方法
4148 0
|
存储 编译器 C语言
C语言数据类型
C语言数据类型
144 0
|
数据采集 数据处理 数据库
处理数据格式异常,例如无法完整显示数据、数据打开格式有误或者乱码等情况
处理数据格式异常,例如无法完整显示数据、数据打开格式有误或者乱码等情况
529 1
|
Linux 网络安全
【Linux通用】Centos系列跳过首次登陆新建用户
【Linux通用】Centos系列跳过首次登陆新建用户
2644 0
|
运维 开发工具 虚拟化
【运维排错】ESXI虚拟化主机时启动报错 Error 33 (Inconsistent data)
2202年了,大家应该还在用VMware的vSphere套件吧?不会大家的虚拟化方案都不用VMware了吧?不会吧不会吧W
8111 1
【运维排错】ESXI虚拟化主机时启动报错 Error 33 (Inconsistent data)
|
前端开发
CSS列表(有序,无序,去掉无序列表的点,列表一行显示)
CSS列表(有序,无序,去掉无序列表的点,列表一行显示)
CSS列表(有序,无序,去掉无序列表的点,列表一行显示)
|
网络协议 Unix 网络安全
|
7天前
|
存储 弹性计算 人工智能
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
2025年9月24日,阿里云弹性计算团队多位产品、技术专家及服务器团队技术专家共同在【2025云栖大会】现场带来了《通用计算产品发布与行业实践》的专场论坛,本论坛聚焦弹性计算多款通用算力产品发布。同时,ECS云服务器安全能力、资源售卖模式、计算AI助手等用户体验关键环节也宣布升级,让用云更简单、更智能。海尔三翼鸟云服务负责人刘建锋先生作为特邀嘉宾,莅临现场分享了关于阿里云ECS g9i推动AIoT平台的场景落地实践。
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
|
1天前
|
弹性计算 人工智能 安全
云上十五年——「弹性计算十五周年」系列客户故事(第二期)
阿里云弹性计算十五年深耕,以第九代ECS g9i实例引领算力革新。携手海尔三翼鸟、小鹏汽车、微帧科技等企业,实现性能跃升与成本优化,赋能AI、物联网、智能驾驶等前沿场景,共绘云端增长新图景。