
本教程详细讲解如何利用纯CSS构建一个带有动态SVG图标的切换开关。通过隐藏的HTML复选框作为状态控制器,并巧妙结合CSS相邻兄弟选择器 (`+`) 和通用兄弟选择器 (`~`),配合 `visibility` 属性,实现点击切换时,不同SVG图标(如日/月)的无缝显示与隐藏,从而创建交互式UI元素,无需任何J*aScript。
在现代网页设计中,交互式切换开关(Toggle Switch)是常见的UI元素,常用于控制主题模式(如亮/暗模式)、设置选项等。本教程将引导您使用纯CSS和HTML构建一个功能完善、外观精美的切换开关,其特点是能够根据开关状态动态显示不同的SVG图标,例如“太阳”和“月亮”图标,而无需编写任何J*aScript代码。
首先,我们需要一个清晰的HTML结构来承载我们的切换开关。核心思想是使用一个隐藏的复选框(input[type="checkbox"])作为状态控制器,并通过其状态来驱动CSS样式的变化。
<label class="ThemeToggler" for="ThemeTogglerID">
<input id="ThemeTogglerID" class="ThemeTogglerInput" type="checkbox" data-toggle-theme="dark,light" data-act-class="ACTIVECLASS" checked />
<div class="ThemeTogglerFill" >
<div class="SunIcon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" >
<!-- Sun SVG Path Data -->
<path d="M12,18c-3.3,0-6-2.7-6-6s2.7-6,6-6s6,2.7,6,6S15.3,18,12,18zM12,8c-2.2,0-4,1.8-4,4c0,2.2,1.8,4,4,4c2.2,0,4-1.8,4-4C16,9.8,14.2,8,12,8z" />
<path d="M12,4c-0.6,0-1-0.4-1-1V1c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,3.6,12.6,4,12,4z" />
<path d="M12,24c-0.6,0-1-0.4-1-1v-2c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,23.6,12.6,24,12,24z" />
<path d="M5.6,6.6c-0.3,0-0.5-0.1-0.7-0.3L3.5,4.9c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C6.2,6.5,5.9,6.6,5.6,6.6z" />
<path d="M19.8,20.8c-0.3,0-0.5-0.1-0.7-0.3l-1.4-1.4c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C20.3,20.7,20,20.8,19.8,20.8z" />
<path d="M3,13H1c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S3.6,13,3,13z" />
<path d="M23,13h-2c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S23.6,13,23,13z" />
<path d="M4.2,20.8c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C4.7,20.7,4.5,20.8,4.2,20.8z" />
<path d="M18.4,6.6c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C18.9,6.5,18.6,6.6,18.4,6.6z" />
</svg>
</div>
<div class="MoonIcon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<!-- Moon SVG Path Data -->
<path d="M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z" />
</svg>
</div>
</div>
</label>我们将使用SCSS来编写样式,它提供了变量、混入(mixin)等功能,使CSS更易于维护和扩展。
装修公司企业网站源码2.0
装修公司源码,采用DIV+CSS布局,首页顶部采用了超大宽屏banner焦点图切换,带伸缩功能的导航条。首页信息展示量大,有利于SEO优化,首页版块包括,导航,焦点图切换,案例,行业动态,装修经验,装修知识。源码支持伪静态,后台开启即可,服务器必须支持rewrite功能,否则无法实现伪静态功能。信息支持二级分类。后台支持信息批量修改,删除,可以支持,视频,图片,附件上传。
0
查看详情
$width: 80px;
$height: 44px;
$border-radius: 50px;
$circle-size: $height - 4px; // 滑块大小
$icon-size: $circle-size - 2px; // 图标大小
$neutral: red; // 默认背景色
$secondary: white; // 悬停边框色
$base-100: white; // 默认边框色
$base-200: gray;
$base-300: black; // 滑块背景色
$base-content: white; // 图标填充色
// 混入:用于定义图标的通用样式
@mixin icon {
position: absolute; // 改为absolute,方便定位
display: block;
width: $icon-size;
height: $icon-size;
border-radius: 50%;
overflow: hidden;
fill: $base-content; // SVG图标的填充色
transition: visibility 0.25s, opacity 0.25s; // 添加过渡效果
}
.ThemeToggler {
width: $width;
height: $height;
flex-shrink: 0;
border-radius: $border-radius;
background-color: $neutral;
border: 1px solid $base-100;
display: inline-block;
cursor: pointer;
overflow: hidden; // 确保图标不会溢出
position: relative; // 为内部的绝对定位元素提供参考
&:hover {
border-color: $secondary;
}
}
.ThemeTogglerFill {
position: relative;
width: 100%;
height: 100%;
&:before {
content: "";
position: absolute;
top: 1px;
left: 1px;
height: $circle-size;
width: $circle-size;
background: $base-300;
box-shadow: 1px 0px 4px rgba(0, 0, 0, 0.15);
border-radius: $border-radius;
transition: background-color 0.25s, transform 0.25s;
}
}
.ThemeTogglerInput {
display: none; // 隐藏原生复选框
// 当复选框被选中时,移动滑块
&:checked ~ .ThemeTogglerFill::before {
transform: translateX($circle-size);
}
// 默认状态(复选框未选中)下的图标显示/隐藏
// `+` 选择器表示紧邻的兄弟元素
& + .ThemeTogglerFill {
.MoonIcon {
visibility: hidden;
opacity: 0;
}
.SunIcon {
visibility: visible;
opacity: 1;
}
}
// 当复选框被选中时,切换图标的显示/隐藏
&:checked + .ThemeTogglerFill {
.SunIcon {
visibility: hidden;
opacity: 0;
}
.MoonIcon {
visibility: visible;
opacity: 1;
}
}
}
.SunIcon {
@include icon;
top: 50%; //
垂直居中
left: 1.7px;
transform: translateY(-50%); // 垂直居中调整
}
.MoonIcon {
@include icon;
top: 50%; // 垂直居中
left: $circle-size + 2px; // 定位到右侧
transform: translateY(-50%); // 垂直居中调整
}将上述HTML和SCSS代码结合,即可实现一个功能完整的纯CSS动态图标切换开关。
HTML:
<label class="ThemeToggler" for="ThemeTogglerID">
<input id="ThemeTogglerID" class="ThemeTogglerInput" type="checkbox" data-toggle-theme="dark,light" data-act-class="ACTIVECLASS" checked />
<div class="ThemeTogglerFill" >
<div class="SunIcon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" >
<path d="M12,18c-3.3,0-6-2.7-6-6s2.7-6,6-6s6,2.7,6,6S15.3,18,12,18zM12,8c-2.2,0-4,1.8-4,4c0,2.
以上就是纯CSS实现带动态SVG图标的切换开关教程的详细内容,更多请关注其它相关文章!
相关文章:
QQ邮箱官方网页版登录 QQ邮箱个人邮箱快速访问
晋江读书网页版在线登录 晋江读书电脑版官网
Node.js 中使用 node-cron 实现定时 API 数据抓取与处理
Go语言中JSON数据解析与字段访问教程
Golang如何实现状态模式管理对象状态_Golang State模式实现技巧
快手网页版在线登录 快手网页版官网入口快速访问
漫蛙漫画官方主页入口 漫蛙MANWA网页直达访问链接
NRF24L01数据传输深度解析:解决大载荷接收异常与分包策略
58动漫网在线官方网 58动漫网正版动漫入口网址
如何在PHP中实现基于MySQL的动态分页查询
在Go开发中优雅管理ListenAndServe进程:GoSublime集成方案
天眼查企业查询官网入口 天眼查官方网页版查询
Mac怎么查看崩溃日志_Mac控制台错误报告分析
Go Martini框架:动态服务解码后的图片内容
PHP中基于用户角色的页面访问控制实践
Win10磁盘清理工具在哪 Win10打开并使用磁盘清理【教程】
MinIO大规模对象列表性能瓶颈深度解析与外部元数据管理策略
Go语言中JSON数据解码与字段访问指南
怎么去除衣服上的口红印_生活小妙招教你用酒精轻松擦除
《刺客信条4:黑旗》重制版新细节曝光:无缝加载 地图更细致!
C++ map遍历方法大全_C++ map迭代器使用总结
mysql如何设置表访问权限_mysql表访问权限配置
J*aScript中在Map循环中检测并处理空数组元素
steam官方入口大全 steam账号注册及操作指南
Lar*el的路由模型绑定怎么用_Lar*el Route Model Binding简化控制器逻辑
J*aScript中正确使用querySelectorAll与复杂CSS选择器
在J*a中如何捕获IndexOutOfBoundsException_索引越界异常防护方法说明
AO3最新入口2025公告_AO3中文官网合集
MAC如何将整个网页截长图_MAC使用Safari的导出为PDF或第三方工具
J*aScript中赋值与自增运算符的复杂交互与执行机制
谷歌浏览器无痕模式怎么开 Chrome开启无痕浏览设置方法【教程】
CSS响应式网页如何实现主次模块比例自适应_flex-grow与flex-shrink调整
构建轻量级网站内部消息系统:Formspree 集成指南
J*a TimerTask文件监控:HashMap状态管理与常见陷阱规避指南
J*a里如何使用forEach遍历Map_Map遍历方法说明
使用PHP DOM解析器高效提取HTML中特定标题及其紧邻段落
机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等
微信客户端如何收红包_微信客户端接收红包使用教程
提升屏幕阅读器对“m”时间单位的播报准确性:HTML与CSS组合解决方案
c++ dfs和bfs代码 c++深度广度优先搜索算法
Bilibili动漫最新防封地址发布-Bilibili动漫2025年最稳正版入口推荐
Go RPC HTTP服务正确实现与常见陷阱解析
J*aScript中localStorage数据的获取、清洗与格式化教程
解决 Vaadin 8 中大文件音频播放与定位时出现的 IOException
4399网页游戏电脑版全新入口 4399电脑端在线玩指南
php源码怎么在电脑上测试_电脑测试php源码方法步骤【教程】
css元素hover动画延迟生效怎么办_使用animation-delay调整触发时间
新三国志曹操传110级星符试炼夏侯渊极难攻略
Surface怎么安装系统 微软Surface Pro U盘重装win11教程
在PHP脚本中通过SSHFS挂载远程文件系统的最佳实践与常见问题解决