CSS缓动函数试玩场 - 所有预设一览
并列播放所有CSS内置缓动函数(ease, linear等)的动画效果,方便对比选择。
UD5工具箱
使用 checkbox + :has() 选择器 实现零JavaScript的暗黑模式切换 · 现代浏览器全覆盖
这是一段演示文字,展示暗黑模式下的排版效果。点击右上角的开关按钮,即可实时切换整个页面的配色方案。所有卡片、表格、文字都会同步响应。
| 特性 | 纯CSS方案 | JS方案 |
|---|---|---|
| 加载速度 | 极快 | 较快 |
| 闪烁问题 | 无闪烁 | 可能有 |
| 依赖 | 零依赖 | 需JS |
<!-- 1. 隐藏的Checkbox(放在body内最前面) -->
<input type="checkbox" id="darkmode-toggle"
class="sr-only">
<!-- 2. 可见的Toggle标签 -->
<label for="darkmode-toggle">
<span class="toggle-track">
<span class="thumb"></span>
</span>
</label>
<!-- 3. 页面主体内容 -->
<div class="page-wrapper">
<!-- 所有页面内容 -->
</div>
/* ====== 亮色模式CSS变量(默认) ====== */
:root, .page-wrapper {
--bg: #f8f9fa;
--card-bg: #ffffff;
--text: #1a1a2e;
--text-secondary: #6c757d;
--border: #e2e8f0;
--shadow: 0 4px 16px rgba(0,0,0,0.08);
--accent: #6366f1;
transition: background-color 0.4s, color 0.4s;
}
/* ====== 暗黑模式覆盖(核心魔法!) ====== */
body:has(#darkmode-toggle:checked) .page-wrapper {
--bg: #0f0f1a;
--card-bg: #1e1e35;
--text: #d1d5db;
--text-secondary: #9ca3af;
--border: #2d2d4a;
--shadow: 0 4px 16px rgba(0,0,0,0.4);
--accent: #818cf8;
}
/* ====== 应用变量 ====== */
.page-wrapper {
background: var(--bg);
color: var(--text);
}
.card {
background: var(--card-bg);
border-color: var(--border);
box-shadow: var(--shadow);
}
完全基于CSS的:has()伪类和checkbox的:checked状态,无需任何JavaScript代码即可实现完整的暗黑模式切换功能。
使用CSS自定义属性(变量)管理全部颜色,一处定义、全局生效,维护极其方便,扩展性极强。
纯CSS方案在页面渲染前就确定了样式,避免了JavaScript方案常见的页面加载闪烁问题(FOIT)。
纯CSS暗黑模式切换是利用checkbox的:checked伪类配合CSS :has()选择器实现的主题切换方案。核心原理:
<input type="checkbox">放置在DOM中:has()选择器检测checkbox是否被选中body:has(#checkbox:checked)匹配时,覆盖CSS变量的值为暗黑模式配色整个过程完全不需要JavaScript,是CSS原生能力的优雅运用。
截至2024年底,所有主流浏览器均已全面支持:has()选择器:
全球约96%以上的用户浏览器支持该特性。对于极少数不支持的情况,可优雅降级为始终亮色模式。绝大多数现代Web项目已可放心用于生产环境。
纯CSS方案本身无法实现持久化存储(CSS不能读写localStorage)。但可以通过极少量JavaScript辅助:
// 读取保存的偏好
const saved = localStorage.getItem('darkmode');
if (saved === 'true') {
document.getElementById('darkmode-toggle').checked = true;
}
// 监听变化并保存
document.getElementById('darkmode-toggle')
.addEventListener('change', (e) => {
localStorage.setItem('darkmode', e.target.checked);
});
这样既保留了纯CSS的渲染性能优势,又实现了用户偏好的持久化。总共只需约8行JavaScript代码。
| 对比维度 | 纯CSS方案 | JavaScript方案 |
|---|---|---|
| 加载速度 | ✅ 极快(无JS阻塞) | ⚠️ 需等待JS执行 |
| 页面闪烁 | ✅ 无闪烁 | ⚠️ 可能闪白 |
| 持久化存储 | ❌ 需少量JS辅助 | ✅ 原生支持 |
| 系统偏好检测 | ⚠️ 需结合媒体查询 | ✅ 灵活处理 |
| 代码复杂度 | ✅ 极简单 | ⚠️ 较复杂 |
| SEO友好 | ✅ 完全友好 | ✅ 友好 |
可以通过CSS媒体查询prefers-color-scheme设置默认主题,再让用户手动切换覆盖:
/* 跟随系统偏好设置默认模式 */
@media (prefers-color-scheme: dark) {
.page-wrapper {
--bg: #0f0f1a;
--card-bg: #1e1e35;
--text: #d1d5db;
/* ...其他暗黑变量 */
}
}
/* 用户手动切换亮色模式时覆盖 */
body:has(#darkmode-toggle:checked) .page-wrapper {
--bg: #f8f9fa;
/* 切换到亮色模式 */
}
结合少量JS检测matchMedia,可实现系统偏好 → 用户手动 → 持久化存储的完整优先级链。
CSS变量(自定义属性)是暗黑模式实现的最佳实践,原因如下:
transition实现平滑的颜色过渡相比传统的"覆写每个类"方案,CSS变量方案可以减少60-80%的暗黑模式相关代码。
使用:has()选择器时,checkbox的位置非常灵活:
<body>内的任意位置:has()会向上查找,无论checkbox嵌套多深都能被检测到如果使用旧的通用兄弟选择器(~)方案(不使用:has()),则checkbox必须放在需要控制的元素之前作为兄弟节点。这是:has()方案相比旧方案的重要优势。
最佳实践:将checkbox放在<body>开头,使用sr-only类隐藏,label放在任意方便的位置。
对SEO的影响:
可访问性建议:
aria-label属性prefers-reduced-motion媒体查询减少动画本页面展示的暗黑模式方案已充分考虑可访问性要求。
本页面自身即使用纯CSS暗黑模式切换技术构建 ·
点击右上角开关体验 ·
所有现代浏览器均已支持 :has() 选择器
并列播放所有CSS内置缓动函数(ease, linear等)的动画效果,方便对比选择。
选择多张图片或纯色叠加,切换所有CSS混合模式并实时预览图层效果。
编写带有伪类的选择器,实时高亮匹配的HTML元素,探索现代CSS选择器的能力。
为内容区域生成灰色闪烁的骨架屏占位代码,包含卡片、标题等组件样式。
选择触发位置、箭头方向与样式,生成轻量悬停提示框代码。
调节光源角度、颜色和距离,生成凹凸柔和的新拟态UI元素CSS盒阴影代码,潮流设计工具。
可视化Flexbox容器和子项的所有属性及选项,鼠标悬停预览效果。
通过滑块和开关调整 Flex 容器和子项的所有 CSS 属性,实时观察布局变化,理解弹性盒子。
批量将文本中的<,>,&,等转换为HTML实体,或反向还原,包含选项保留已转义实体。
勾选需要展示的选项(接受/拒绝/设置),生成纯净HTML/JS代码,自行套用样式。
在页面上叠加可拖拽的半透明网格线,辅助网格布局对齐。
为页面上使用CSS Grid的元素显示网格线和名称,辅助布局开发和调试。
上传精灵图,自动切片检测或手动框选获取背景定位数值,生成CSS Sprite代码。
粘贴HTML并编写XPath表达式,高亮显示匹配的节点并提取文本。
拖拽调节Flex容器和子项属性,即时可视化响应效果,同时显示CSS代码,边学边用。
生成具有扫描线、荧光拖影和屏幕弯曲效果的纯CSS复古电脑终端样式。
输入嵌套对象和取值路径,测试?.可选链和??空值合并运算的结果,学习JS新特性。
通过叠加多个阴影创建柔和且真实的UI投影,导出CSS。
配置内容和位置,生成使用最新HTML popover属性的轻量弹窗代码,无需JavaScript。
输入新旧JSON,并排展示增删改的行级差异,辅助接口变动追踪。
自定义箭头方向、颜色、大小和动画,生成无需JavaScript的纯CSS tooltip组件代码。
提取HTML中内联style属性或嵌入式style标签,转变为独立CSS规则,辅助样式重构。
设定物理页框数,输入页引用串,动画展示不同页面置换算法的缺页率。
搜索CSS属性和选择器,展示在主流浏览器的支持版本和全局使用率百分比。
粘贴结构化数据代码,模拟Google结构化数据测试,检查错误与丰富结果。
制作像荧光笔划过的高亮背景或扫描下划线效果,导出类名。
编写Brainfuck代码,以可视化的方式步进执行,观察活动纸带和指针。
配置多屏垂直或水平滑动卡片,生成带CSS Scroll Snap的HTML页面代码。
调整透明度、模糊度和边框,实时预览毛玻璃UI卡片,生成兼容CSS backdrop-filter代码。
提取HTML中所有内嵌 `<style>` 标签的内容,合并生成单独CSS文件。