IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 仿 Tailwind CSS 官网首页 一个 button 的变化动画 -> 正文阅读

[JavaScript知识库]仿 Tailwind CSS 官网首页 一个 button 的变化动画

仿 Tailwind CSS 官网首页 一个 button 的变化动画

先来看一下 tailwind CSS 官网这个动画的效果. 模仿这个动画可以学到的是定义和使用 CSS 变量以及在 JavaScript 中操作修改 CSS 变量. 在之前的交互动画模仿中, 借用了 <input type="radio">, 而这次则改用 <input type="checkbox">
请添加图片描述
下面是我模仿的结果
请添加图片描述

HTML

<div class="container flex">
   <input type="checkbox" title="this input" name="input" id="input-switch">
   <label for="input-switch">
     <div class="switch">
       <div class="button"></div>
     </div>
   </label>
 </div>

因为开关是可以开也可以关, 所以不能用 radio 因为其开了再点就不会关. 所以改用 checkbox

CSS

  1. 定义两个变量, 分别表示开关的开关和默认的背景颜色, 重置样式, 定义一个 flex 的水平垂直居中布局
    :root {
      --radius: 20px;
      --bgColor: #fff;
    }
    * {
      padding: 0;
      margin: 0;
    }
    .flex {
      display: flex;
      justify-content: center;
      align-items: center;
    }
    
  2. 设置 container 容器的样式. 这里要使用之前定义的变量 bgColor, 给背景颜色的变化加上线性过渡
    .container {
      height: 100vh;
      background-color: var(--bgColor);
      transition: background-color .2s linear;
    }
    
  3. 设置开关默认的样式
    • border-radius: 9999px; 是为了使得按钮有💊的效果, 两端是圆的.
    .switch {
      width: calc( var(--radius) * 2.2 ); 
      height: calc( var(--radius) );
      background-color: rgb(96, 211, 96);
      border-radius: 9999px;
      position: relative;
      padding: 2px;
      transition: background-color .2s linear;
    }
    
  4. 设置开关中圆点?的效果
    • 注意其absolute 定位, 将来要修改其 left 控制其位置变化. 默认位置是靠左靠上 2px, 就是父元素的padding大小. 📕注意: left 是相对于父元素的 border 计算的, 所以要加上 父元素的 padding
    .button {
      height: var(--radius);
      width: var(--radius);
      border-radius: 50%;
      background-color: rgba(255, 255, 255, 0.9);
      transition: all .2s ease-in-out;
      position: absolute;
      left: 2px;
      top: 2px;
    }
    
  5. 设置checkbox效果
    • 默认是不显示
    • 选中后修改按钮的背景色. 并且修改?的left, 为父元素的 width (📕注意 width 不包括 padding) 减去自身宽度再加上 padding
    input[type="checkbox"] {
      display: none;
    }
    input[type="checkbox"]:checked + label .switch {
      background-color: #D10;
    }
    input[type="checkbox"]:checked + label .switch .button {
      left: calc( var(--radius) * 2.2 - var(--radius) + 2px );
    }
    

JavaScript

使用 setProperty 修改颜色

document.getElementById('input-switch').addEventListener('click', (e) => {
  if (e.target.checked) {
    document.body.style.setProperty('--bgColor', 'rgb(17, 24, 39)');
  } else {
    document.body.style.setProperty('--bgColor', '#fff');
  }
})

完整代码

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Switch</title>
  <link rel="stylesheet" href="style.css">
  <link rel="stylesheet" href="../css/font-awesome.css">
</head>
<body>
  <div class="container flex">
    <input type="checkbox" title="this input" name="input" id="input-switch">
    <label for="input-switch">
      <div class="switch">
        <div class="button"></div>
      </div>
    </label>
  </div>
  <script>
    document.getElementById('input-switch').addEventListener('click', (e) => {
      if (e.target.checked) {
        document.body.style.setProperty('--bgColor', 'rgb(17, 24, 39)');
      } else {
        document.body.style.setProperty('--bgColor', '#fff');
      }
    })
  </script>
</body>
</html>

:root {
  --radius: 20px;
  --bgColor: #fff;
}

* {
  padding: 0;
  margin: 0;
}
.container {
  height: 100vh;
  background-color: var(--bgColor);
  transition: background-color .2s linear;
}

.flex {
  display: flex;
  justify-content: center;
  align-items: center;
}
.switch {
  width: calc( var(--radius) * 2.2 ); 
  height: calc( var(--radius) );
  background-color: rgb(96, 211, 96);
  border-radius: 9999px;
  position: relative;
  padding: 2px;
  transition: background-color .2s linear;
}

.button {
  height: var(--radius);
  width: var(--radius);
  border-radius: 50%;
  background-color: rgba(255, 255, 255, 0.9);
  transition: all .2s ease-in-out;
  position: absolute;
  left: 2px;
  top: 2px;
}

input[type="checkbox"] {
  display: none;
}
input[type="checkbox"]:checked + label .switch {
  background-color: #D10;
}
input[type="checkbox"]:checked + label .switch .button {
  left: calc( var(--radius) * 2.2 - var(--radius) + 2px );
}

谢谢你看到这里😀

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-02-16 12:59:54  更:2022-02-16 13:00:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:40:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码