Appearance
CSS变量(自定义属性,简化代码,便于维护)
25.1 CSS变量的定义
基本语法
定义变量:
css
:root {
--变量名: 变量值;
}使用变量:
css
元素 {
属性: var(--变量名);
}变量的作用域
- 全局变量:在
:root伪类中定义,可在整个文档中使用 - 局部变量:在特定选择器中定义,只在该选择器及其后代中使用
示例
css
/* 全局变量 */
:root {
--primary-color: #3498db;
--secondary-color: #2ecc71;
--text-color: #333;
--font-size: 16px;
}
/* 局部变量 */
.card {
--card-bg: white;
--card-border: #ddd;
background-color: var(--card-bg);
border: 1px solid var(--card-border);
}25.2 CSS变量的使用
基本使用
css
/* 定义变量 */
:root {
--primary: #3498db;
--spacing: 20px;
--border-radius: 8px;
}
/* 使用变量 */
.button {
background-color: var(--primary);
padding: var(--spacing);
border-radius: var(--border-radius);
}
.container {
margin: var(--spacing);
padding: var(--spacing);
}变量的计算
css
:root {
--base-font-size: 16px;
--heading-font-size: calc(var(--base-font-size) * 1.5);
}
h1 {
font-size: var(--heading-font-size);
}变量的默认值
css
/* 当变量不存在时使用默认值 */
.element {
color: var(--undefined-variable, #333);
}变量的继承
css
.parent {
--color: blue;
}
.child {
color: var(--color); /* 继承父元素的变量 */
}25.3 变量的优势
1. 统一修改
传统CSS:
css
.button {
background-color: #3498db;
}
.card {
border-color: #3498db;
}
.link {
color: #3498db;
}使用变量:
css
:root {
--primary: #3498db;
}
.button {
background-color: var(--primary);
}
.card {
border-color: var(--primary);
}
.link {
color: var(--primary);
}2. 减少重复代码
传统CSS:
css
.container {
padding: 20px;
margin: 20px;
border-radius: 8px;
}
.card {
padding: 20px;
margin: 20px;
border-radius: 8px;
}使用变量:
css
:root {
--spacing: 20px;
--border-radius: 8px;
}
.container {
padding: var(--spacing);
margin: var(--spacing);
border-radius: var(--border-radius);
}
.card {
padding: var(--spacing);
margin: var(--spacing);
border-radius: var(--border-radius);
}3. 主题切换
css
/* 浅色主题 */
:root {
--bg-color: #fff;
--text-color: #333;
--primary: #3498db;
}
/* 深色主题 */
.dark-theme {
--bg-color: #333;
--text-color: #fff;
--primary: #2ecc71;
}
body {
background-color: var(--bg-color);
color: var(--text-color);
}
.button {
background-color: var(--primary);
}4. 提高可维护性
- 语义化:变量名可以描述其用途
- 集中管理:所有变量在一个地方定义
- 更容易理解:代码更加清晰易读
25.4 实战:用CSS变量设置页面主题色,一键切换主题
实战目标
使用CSS变量创建一个可以一键切换主题的页面。
实战步骤
- 创建HTML文件:
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CSS变量实战</title>
<style>
/* 在这里添加CSS样式 */
</style>
</head>
<body class="light-theme">
<div class="container">
<h1>CSS变量实战</h1>
<!-- 主题切换按钮 -->
<div class="theme-toggle">
<button id="lightBtn" class="theme-btn active">浅色主题</button>
<button id="darkBtn" class="theme-btn">深色主题</button>
<button id="blueBtn" class="theme-btn">蓝色主题</button>
</div>
<!-- 内容区域 -->
<section class="content">
<div class="card">
<h2>卡片标题</h2>
<p>这是卡片内容,使用CSS变量设置样式。</p>
<button class="btn">点击按钮</button>
</div>
<div class="card">
<h2>另一个卡片</h2>
<p>CSS变量让主题切换变得非常简单。</p>
<button class="btn">了解更多</button>
</div>
</section>
</div>
<script>
// 在这里添加JavaScript代码
</script>
</body>
</html>- 添加CSS样式:
css
/* 重置样式 */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
/* 浅色主题变量 */
:root {
--bg-color: #f5f5f5;
--card-bg: white;
--text-color: #333;
--primary-color: #3498db;
--secondary-color: #2ecc71;
--border-color: #ddd;
--button-bg: var(--primary-color);
--button-text: white;
--spacing: 20px;
--border-radius: 8px;
--box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
}
/* 深色主题变量 */
.dark-theme {
--bg-color: #2c3e50;
--card-bg: #34495e;
--text-color: #ecf0f1;
--primary-color: #3498db;
--secondary-color: #2ecc71;
--border-color: #444;
--button-bg: var(--primary-color);
--button-text: white;
--box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
}
/* 蓝色主题变量 */
.blue-theme {
--bg-color: #e3f2fd;
--card-bg: white;
--text-color: #1565c0;
--primary-color: #1976d2;
--secondary-color: #42a5f5;
--border-color: #bbdefb;
--button-bg: var(--primary-color);
--button-text: white;
--box-shadow: 0 2px 10px rgba(25, 118, 210, 0.2);
}
/* 全局样式 */
body {
font-family: "Microsoft YaHei", Arial, sans-serif;
background-color: var(--bg-color);
color: var(--text-color);
padding: var(--spacing);
transition: all 0.3s ease;
}
.container {
max-width: 800px;
margin: 0 auto;
}
h1 {
text-align: center;
margin-bottom: var(--spacing);
color: var(--primary-color);
}
/* 主题切换按钮 */
.theme-toggle {
display: flex;
justify-content: center;
gap: 10px;
margin-bottom: var(--spacing);
}
.theme-btn {
padding: 8px 16px;
border: 2px solid var(--primary-color);
background-color: transparent;
color: var(--primary-color);
border-radius: var(--border-radius);
cursor: pointer;
transition: all 0.3s ease;
}
.theme-btn:hover {
background-color: var(--primary-color);
color: var(--button-text);
}
.theme-btn.active {
background-color: var(--primary-color);
color: var(--button-text);
}
/* 内容区域 */
.content {
display: flex;
gap: var(--spacing);
flex-wrap: wrap;
}
.card {
flex: 1;
min-width: 300px;
background-color: var(--card-bg);
padding: var(--spacing);
border-radius: var(--border-radius);
border: 1px solid var(--border-color);
box-shadow: var(--box-shadow);
transition: all 0.3s ease;
}
.card h2 {
color: var(--primary-color);
margin-bottom: 10px;
}
.card p {
margin-bottom: 15px;
line-height: 1.6;
}
/* 按钮样式 */
.btn {
padding: 10px 20px;
background-color: var(--button-bg);
color: var(--button-text);
border: none;
border-radius: var(--border-radius);
cursor: pointer;
transition: all 0.3s ease;
}
.btn:hover {
transform: translateY(-2px);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
}
/* 响应式设计 */
@media (max-width: 768px) {
.content {
flex-direction: column;
}
.card {
width: 100%;
}
}- 添加JavaScript:
javascript
// 主题切换功能
const lightBtn = document.getElementById('lightBtn');
const darkBtn = document.getElementById('darkBtn');
const blueBtn = document.getElementById('blueBtn');
const body = document.body;
// 切换主题函数
function setTheme(theme) {
// 移除所有主题类
body.className = '';
// 添加选中的主题类
body.classList.add(theme);
// 更新按钮状态
document.querySelectorAll('.theme-btn').forEach(btn => {
btn.classList.remove('active');
});
// 激活当前按钮
if (theme === 'light-theme') {
lightBtn.classList.add('active');
} else if (theme === 'dark-theme') {
darkBtn.classList.add('active');
} else if (theme === 'blue-theme') {
blueBtn.classList.add('active');
}
}
// 绑定事件
lightBtn.addEventListener('click', () => setTheme('light-theme'));
darkBtn.addEventListener('click', () => setTheme('dark-theme'));
blueBtn.addEventListener('click', () => setTheme('blue-theme'));- 运行页面:在浏览器中打开文件,观察效果
预期效果
- 主题切换:点击不同的主题按钮,可以切换页面的整体主题
- 变量应用:所有样式都使用CSS变量定义,主题切换时变量值会相应改变
- 平滑过渡:主题切换时有平滑的过渡效果
- 响应式设计:在小屏幕设备上自动调整布局
