亲爱的学习者们,欢迎来到CSS3的精彩世界!如果你是Web开发领域的“小白”,对CSS感到一丝陌生或迷茫,那么恭喜你,你找对地方了!本教程将以最易懂的方式,带你一步步揭开CSS3的神秘面纱,让你从零开始,掌握现代网页布局与美化的核心技能。
想象一下,如果HTML是网页的骨架和内容,那么CSS就是赋予网页生命与美感的魔法师。它能让你的网页拥有色彩、布局、动画,让用户眼前一亮。而CSS3,则是这位魔法师的最新、最强大的武器库!
我们将从基础概念讲起,深入到CSS3的每一个新特性,并提供大量实用的代码示例和生动的比喻,确保你不仅“知其然”,更“知其所以然”。准备好了吗?让我们一起开启这段充满乐趣的学习之旅吧!
学习建议:
在深入CSS3之前,我们先来聊聊CSS的“前世今生”。CSS,全称Cascading Style Sheets(层叠样式表),是用来描述HTML或XML(包括SVG、MathML等)文档呈现的语言。简单来说,它决定了你的网页看起来是什么样子的——字体大小、颜色、图片位置、页面布局等等。
CSS的发展经历了多个版本,从最初的CSS1、CSS2,到我们今天要学习的CSS3。每一次迭代都带来了更强大的功能和更灵活的控制方式。CSS3不是一个单一的版本,而是一系列模块的总称,每个模块独立发展,例如:选择器、盒模型、背景与边框、文本效果、转换(Transforms)、过渡(Transitions)、动画(Animations)、多列布局(Multi-column Layout)、弹性盒子(Flexbox)和网格布局(Grid Layout)等。
CSS3的核心优势:
图 1-1:CSS3 带来的视觉与交互革命
在移动设备普及的今天,网页不再只在电脑屏幕上显示。如何让同一个网页在手机、平板、电脑上都能美观且易于操作?这就是响应式设计的魅力,而CSS3正是实现响应式设计的核心驱动力。无论是打造精致的UI界面,还是实现酷炫的交互动画,CSS3都扮演着不可或缺的角色。
将CSS样式应用到HTML文档有三种主要方式。理解它们的适用场景和优先级非常重要。
直接将CSS代码写在HTML标签的style属性中。这种方式简单直接,但不推荐用于大型项目,因为它将内容与样式混淆,难以维护和复用。
<p style="color: blue; font-size: 16px; padding: 5px; border: 1px solid lightblue;">这是一段蓝色的文字。</p>
这是一段蓝色的文字。
警示:行内样式拥有最高的优先级,这意味着它会覆盖所有其他方式设置的样式。这在调试时可能导致问题,并且难以管理。请尽量避免过度使用。
将CSS代码写在HTML文档的<head>标签内的<style>标签中。这种方式适用于单个HTML文件需要特定样式,且样式不需要被其他文件复用的情况。
<!-- 样式定义在 <head> 中的 <style> 标签内 -->
<style>
.internal-style-demo-container {
font-family: Arial, sans-serif;
background-color: #f0f0f0;
padding: 10px;
border: 1px solid #ddd;
}
.internal-style-demo-container h1 {
color: green;
}
</style>
<!-- HTML 内容 -->
<div class="internal-style-demo-container">
<h1>欢迎来到我的网页</h1>
<p>这是一个使用内部样式表的简单示例。</p>
</div>
这是一个使用内部样式表的简单示例。
将CSS代码单独保存为一个.css文件,然后在HTML文档中使用<link>标签引入。这是最推荐的方式,因为它实现了内容(HTML)与样式(CSS)的彻底分离,提高了代码的可维护性、可复用性和加载效率。
HTML 文件 (index.html) 引入外部 CSS 的方式:
<!DOCTYPE html>
<html>
<head>
<title>外部样式表示例</title>
<link rel="stylesheet" href="styles.css"> <!-- 引入外部样式表 -->
</head>
<body>
<div class="external-style-demo-container">
<h1>我的外部样式网站</h1>
<p>这真的是一个使用外部样式表的典范。</p>
</div>
</body>
</html>
CSS 文件 (styles.css) 内容(由于无法实际加载外部文件,这里直接通过预定义的类名进行演示):
/* styles.css 的内容大致如下 */
.external-style-demo-container {
font-family: Verdana, sans-serif;
background-color: lightblue;
padding: 10px;
}
.external-style-demo-container h1 {
color: darkred;
text-align: center;
}
这真的是一个使用外部样式表的典范。
小贴士:当多种样式来源作用于同一个元素时,优先级规则是:行内样式 > 内部样式表/外部样式表(取决于它们在HTML中的顺序,后声明的优先级高)> 浏览器默认样式。但请记住,!important规则可以打破这个优先级,但通常不建议使用,因为它会使样式难以调试。
选择器是CSS的灵魂!它们告诉浏览器,你想要对HTML文档中的哪个(或哪些)元素应用样式。掌握好选择器,你就能像狙击手一样精准地控制页面元素。
<div class="selector-demo-container">
<p>这是一段普通的段落。</p>
<p>这是另一段普通段落。</p>
<h1>这是一个居中的标题。</h1>
</div>
.selector-demo-container p { /* 选择所有 <p> 标签 */
line-height: 1.8;
border: 1px solid #ddd;
margin-bottom: 5px;
padding: 5px;
}
.selector-demo-container h1 { /* 选择所有 <h1> 标签 */
text-align: center;
border: 1px solid #ddd;
padding: 5px;
margin-bottom: 10px;
}
这是一段普通的段落。
这是另一段普通段落。
class属性选择元素,可以给多个元素添加同一个类。这是最常用且灵活的选择器之一。
<div class="selector-demo-container">
<p class="highlight">这段文字会高亮。</p>
<div class="highlight">这个div也会高亮。</div>
</div>
.selector-demo-container .highlight { /* 注意开头的点号 '.' */
background-color: yellow;
color: black;
padding: 5px;
margin-bottom: 5px;
border: 1px dashed orange;
}
这段文字会高亮。
id属性选择元素。id在一个HTML文档中必须是唯一的,所以它只能选择一个元素。
<div class="selector-demo-container">
<div id="main-header">主标题</div>
</div>
.selector-demo-container #main-header { /* 注意开头的井号 '#' */
font-size: 2em;
color: purple;
border: 2px solid purple;
padding: 5px;
margin-bottom: 10px;
}
类 vs ID:class就像是班级,一个班级里可以有很多学生;id就像是身份证号,每个人只有一个且独一无二。在CSS中,优先使用类选择器,除非你确定某个元素在整个页面中是唯一的且需要通过JS进行操作。
组合选择器允许你根据元素之间的关系来选择它们。
<div class="selector-demo-container">
<div class="descendant-example" style="border: 1px solid blue; padding: 10px;">
<p>这是div的直接子p。</p>
<section style="border: 1px solid green; padding: 5px;">
<p>这是div的孙子p。</p>
</section>
</div>
</div>
.selector-demo-container .descendant-example div p { /* 选择所有在 .descendant-example 内部的 <div> 内部的 <p> 标签 */
margin-bottom: 5px;
background-color: #eef;
padding: 5px;
}
这是div的直接子p。
这是div的孙子p。
> 符号表示子元素。只选择作为指定元素直接子元素的元素。
<div class="selector-demo-container">
<ul class="child-example" style="border: 1px solid purple; padding: 10px;">
<li>直接子项 1</li>
<li>直接子项 2
<ul>
<li>孙子项 1</li>
</ul>
</li>
</ul>
</div>
.selector-demo-container .child-example ul > li { /* 选择所有作为 <ul> 直接子元素的 <li> 标签 */
list-style-type: square;
color: #369;
padding: 3px;
}
+ 符号表示紧邻的兄弟元素。选择紧邻在指定元素后的兄弟元素。
<div class="selector-demo-container">
<div class="adjacent-sibling-example">
<h2>标题二</h2>
<p>紧邻标题二的段落。</p>
<p>非紧邻标题二的段落。</p>
</div>
</div>
.selector-demo-container .adjacent-sibling-example h2 + p { /* 选择紧跟在 <h2> 后面的第一个 <p> 标签 */
font-style: italic;
color: #900;
background-color: #ffe0e0;
padding: 5px;
}
紧邻标题二的段落。
非紧邻标题二的段落。
~ 符号表示所有兄弟元素。选择指定元素之后的所有兄弟元素。
<div class="selector-demo-container">
<div class="general-sibling-example">
<h2>通用兄弟选择器</h2>
<p>第一个兄弟段落。</p>
<span>一个span</span>
<p>第二个兄弟段落。</p>
</div>
</div>
.selector-demo-container .general-sibling-example h2 ~ p { /* 选择 <h2> 之后的所有 <p> 标签(不必紧邻) */
text-indent: 2em;
background-color: #ffe;
padding: 5px;
}
第一个兄弟段落。
一个span第二个兄弟段落。
属性选择器允许你根据HTML元素的属性及其值来选择元素。
以下HTML元素将应用对应的CSS规则:
外部链接重要信息 (class~="info")
普通文本


伪类用于选择处于特定状态的元素,或基于其在文档树中的位置进行选择。
将鼠标悬停在列表项上,观察效果。
伪元素用于选择元素内容的特定部分,并为其添加样式。CSS3推荐使用双冒号::来区分伪类和伪元素。
挑战一下:
尝试使用CSS3选择器,让一个列表中,第一个li的字体加粗,最后一个li的颜色变为红色,并且鼠标悬停在任意li上时,背景颜色变为淡蓝色。
在CSS中,每个HTML元素都被视为一个矩形的“盒子”。理解盒模型是理解CSS布局的关键,因为它决定了元素占据的空间大小。
图 1-2:CSS 盒模型示意图
width和height属性控制。box-sizing 属性:标准盒模型 vs. IE 盒模型这是CSS3中一个非常重要的属性,它改变了我们计算元素总宽度和总高度的方式。
box-sizing这里有两个盒子,都设定 width: 100px; height: 100px; padding: 20px; border: 5px solid;
图 1-3:box-sizing: content-box (左) vs border-box (右) 对比
最佳实践:在项目开始时,通常会通过CSS重置或归一化样式,将所有元素的box-sizing设置为border-box,这样可以使布局计算更加直观和便捷。
/* 全局设置所有元素使用 border-box 盒模型 */
* {
box-sizing: border-box;
}
/* 或者更精确地应用于所有元素和伪元素 */
html {
box-sizing: border-box;
}
*, *::before, *::after {
box-sizing: inherit;
}
box-sizing: border-box观察下方两个盒子的实际宽度:第一个是默认的 content-box,第二个应用了 border-box。它们都设置了 width: 150px; padding: 10px; border: 2px;
CSS3极大地增强了背景图片的控制能力,让背景不再单调。
background-image 多背景图现在,你可以在一个元素上设置多张背景图,它们会按照声明的顺序层叠显示(第一张在最上层)。
.background-demo-container .multi-bg {
width: 300px;
height: 200px;
border: 1px solid #ccc;
background-image: url('https://picsum.photos/100/100?random=3'), /* 小图标 */
url('https://picsum.photos/300/200?random=4'); /* 大背景图 */
background-repeat: no-repeat, no-repeat;
background-position: top left, center center; /* 每个背景图可以有单独的位置 */
}
图 2-1:多背景图叠加效果
background-size:`cover`, `contain` 及自定义尺寸这个属性用于控制背景图片的尺寸,完美解决图片填充问题。
.background-demo-container .bg-example {
width: 400px;
height: 250px;
border: 1px solid #ccc;
margin-bottom: 20px;
background-image: url('https://picsum.photos/600/400?random=6');
background-repeat: no-repeat;
background-position: center center;
background-color: #eee; /* 背景色用于看清空白区域 */
}
.background-demo-container .bg-example.cover { background-size: cover; }
.background-demo-container .bg-example.contain { background-size: contain; }
.background-demo-container .bg-example.custom { background-size: 50% 80%; }
background-sizebackground-size: cover; (图片会覆盖整个区域,可能被裁剪)background-size: contain; (图片会完整包含在区域内,可能有空白)background-size: 50% 80%; (自定义尺寸)background-origin 与 background-clip这两个属性控制背景图片的起点和裁剪范围。这里只展示概念,因为视觉差异较小且需要特定边界条件。
background-origin:指定背景图片的起始位置。padding-box (默认)、border-box、content-box。background-clip:指定背景的绘制区域。border-box (默认)、padding-box、content-box、text。background-attachment:滚动与固定背景控制背景图片是否随页面滚动。
.background-demo-container .fixed-bg-body {
height: 300px; /* Limited height for demo */
overflow-y: scroll; /* Make it scrollable */
border: 1px solid #ccc;
background-image: url('https://picsum.photos/1920/1080?random=7');
background-size: cover;
background-attachment: fixed; /* 背景固定 */
color: #fff;
text-shadow: 1px 1px 2px rgba(0,0,0,0.7);
padding: 20px;
}
.background-demo-container .scroll-bg-body {
height: 300px; /* Limited height for demo */
overflow-y: scroll; /* Make it scrollable */
border: 1px solid #ccc;
background-image: url('https://picsum.photos/1920/1080?random=7');
background-size: cover;
background-attachment: scroll; /* 背景随内容滚动 */
color: #fff;
text-shadow: 1px 1px 2px rgba(0,0,0,0.7);
padding: 20px;
margin-top: 20px;
}
background-attachment固定背景 (background-attachment: fixed;)
当你滚动这个区域时,背景图片会保持不动,文字内容则会滚动过去,产生一种视差效果。这种效果常用于创建沉浸式的视觉体验。
内容 1
内容 2
内容 3
内容 4
内容 5
内容 6
内容 7
内容 8
内容 9
内容 10
滚动背景 (background-attachment: scroll;)
当你滚动这个区域时,背景图片会随着文字内容一起滚动。这是背景的默认行为,也是最常见的用法。
内容 1
内容 2
内容 3
内容 4
内容 5
内容 6
内容 7
内容 8
内容 9
内容 10
CSS3让边框和阴影拥有了前所未有的表现力。
告别生硬的直角,让你的元素边缘变得圆润起来。可以为每个角设置不同的半径。
.border-shadow-demo-container .rounded-box {
width: 150px;
height: 100px;
border: 2px solid #3498db;
background-color: #ecf0f1;
display: inline-flex;
justify-content: center;
align-items: center;
margin: 10px;
}
.border-shadow-demo-container .rounded-box.all-radius { border-radius: 15px; } /* 所有角都圆角15px */
.border-shadow-demo-container .rounded-box.custom-radius { border-radius: 20px 0 20px 0; } /* 左上、右下圆角20px,右上、左下直角 */
.border-shadow-demo-container .circle {
width: 100px;
height: 100px;
background-color: #e74c3c;
border-radius: 50%; /* 变成圆形或椭圆 */
display: inline-flex;
justify-content: center;
align-items: center;
color: white;
margin: 10px;
}
border-radius图 2-2:不同 border-radius 值带来的圆角效果
给元素添加立体的阴影效果,提升视觉层次感。语法:box-shadow: offset-x offset-y blur-radius spread-radius color inset;
.border-shadow-demo-container .shadow-box {
width: 200px;
height: 100px;
background-color: white;
box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.3); /* 标准外阴影 */
}
.border-shadow-demo-container .inner-shadow {
width: 200px;
height: 100px;
background-color: #f39c12;
box-shadow: inset 0 0 10px rgba(0, 0, 0, 0.5); /* 内阴影 */
color: white;
}
.border-shadow-demo-container .multi-shadow {
width: 200px;
height: 100px;
background-color: #ccc;
box-shadow: 2px 2px 5px rgba(0,0,0,0.3),
-2px -2px 5px rgba(255,255,255,0.8) inset;
color: #333;
}
box-shadow使用图片作为元素的边框,创造独特的视觉效果。这个属性比较复杂,但潜力巨大。
.border-shadow-demo-container .img-border {
width: 200px;
height: 100px;
border: 20px solid transparent; /* 必须设置边框宽度,否则图片不显示 */
border-image: url('https://picsum.photos/50/50?random=9') 30 round; /* 图片路径,切割边框的量,重复方式 */
display: inline-flex;
justify-content: center;
align-items: center;
color: #333;
margin: 10px;
background-color: #f9f9f9; /* 方便看清内部 */
}
border-image理解border-image:border-image的工作原理是将一张图片切割成九宫格(四个角、四条边和中心),然后将这些部分分别填充到元素的边框和背景区域。30表示切割的宽度/高度,round表示图像会重复,如果不能完整重复则拉伸以填充。
CSS3提供了更多对文本的控制,让文字不再枯燥。
给文字添加阴影,使其更具层次感或立体感,语法与box-shadow类似。
.text-effect-demo-container h1.shadowed {
color: white;
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5); /* 水平偏移,垂直偏移,模糊半径,颜色 */
background-color: #555;
padding: 10px;
display: inline-block;
}
.text-effect-demo-container .fancy-text {
color: #228dff;
font-size: 2em;
text-align: center;
margin: 20px 0;
text-shadow: 0 0 5px #fff,
0 0 10px #fff,
0 0 15px #fff,
0 0 20px #228dff,
0 0 35px #228dff,
0 0 40px #228dff,
0 0 50px #228dff,
0 0 75px #228dff; /* 霓虹灯效果 */
}
text-shadow霓虹灯文本效果
处理长单词或URL在容器内不换行导致溢出的问题。
.text-effect-demo-container .long-text {
width: 150px;
border: 1px solid #ccc;
padding: 5px;
background-color: #f9f9f9;
}
.text-effect-demo-container .long-text.break-word-style { word-wrap: break-word; } /* 已废弃,推荐 overflow-wrap */
.text-effect-demo-container .long-text.break-all-style { word-break: break-all; }
ThisIsAVeryLongWordWithoutAnySpacesThatWouldNormallyOverflowTheContainer.
word-wrap: break-word;
ThisIsAVeryLongWordWithoutAnySpacesThatWouldNormallyOverflowTheContainer.
word-break: break-all;
当文本内容超出容器宽度时,如何显示?常常用于单行文本溢出显示省略号。
.text-effect-demo-container .single-line-ellipsis {
width: 200px;
white-space: nowrap; /* 不换行 */
overflow: hidden; /* 溢出部分隐藏 */
text-overflow: ellipsis; /* 溢出部分显示省略号 */
border: 1px solid #ccc;
padding: 5px;
background-color: #f9f9f9;
}
使用网页字体,让你的设计不再受限于用户电脑中安装的字体。告别“宋体”和“微软雅黑”!
/* 注意:此处无法直接加载外部字体文件进行演示,但代码逻辑如此 */
@font-face {
font-family: 'MyCustomFont'; /* 自定义字体名称 */
src: url('fonts/my-custom-font.woff2') format('woff2'), /* 优先加载woff2 */
url('fonts/my-custom-font.woff') format('woff'); /* 其次加载woff */
font-weight: normal;
font-style: normal;
}
.custom-font-demo {
font-family: 'MyCustomFont', sans-serif; /* 使用自定义字体,如果加载失败则使用无衬线字体 */
font-size: 1.5em;
padding: 10px;
border: 1px dashed #ccc;
background-color: #fcfcfc;
}
这段文字尝试加载自定义字体。
(如果字体文件实际存在且路径正确,你将看到不同的字体效果。)
字体格式:常见的网页字体格式有:.woff2 (最佳压缩和性能), .woff (兼容性好), .ttf (TrueType), .otf (OpenType), .eot (IE专用)。为了最佳兼容性和性能,推荐使用.woff2和.woff。
CSS3提供了更灵活的颜色表示方式,特别是透明度。
在传统的RGB (Red, Green, Blue) 模式基础上增加了Alpha通道,用于控制颜色的透明度。
.color-demo-container .solid-red { background-color: rgb(255, 0, 0); } /* 纯红色 */
.color-demo-container .translucent-red { background-color: rgba(255, 0, 0, 0.5); } /* 50% 透明度的红色 */
/* Alpha 值范围从 0 (完全透明) 到 1 (完全不透明) */
(背景为灰色,方便观察透明度)
HSLA模式更符合人类对颜色的感知,调整起来更直观。同样包含Alpha通道。
H (Hue):色相,0-360度,0/360是红色,120是绿色,240是蓝色。S (Saturation):饱和度,0-100%,0%是灰色,100%是纯色。L (Lightness):亮度,0-100%,0%是黑色,100%是白色,50%是正常亮度。A (Alpha):透明度,0-1。.color-demo-container .colorful-box { background-color: hsla(240, 100%, 50%, 0.7); } /* 70% 透明度的蓝色 */
(右侧叠加在灰色背景上,再次感受透明度)
为什么要用RGBA/HSLA?它们能方便地控制背景、边框、文本等的透明度,而不会影响其内容的透明度。比如,你有一个半透明的背景,但上面的文字仍然清晰可见。
布局是网页设计的核心。CSS3为我们带来了两个革命性的布局模块:Flexbox和Grid,它们彻底改变了Web布局的方式,让复杂的排列变得轻而易举。同时,媒体查询是实现响应式设计的基石。
Flexbox(弹性盒子)是CSS3中一个强大的布局模块,用于在一维方向(行或列)上对项目进行布局。它使得对齐、分布空间和排序项目变得非常容易。
图 3-1:Flexbox 核心概念示意图
display: flex的父元素。<div class="container-flex">
<div class="item-flex">1</div>
<div class="item-flex">2</div>
<div class="item-flex">3</div>
</div>
.flex-demo-container .container-flex {
display: flex; /* 声明为 Flex 容器 */
height: 150px;
border: 1px solid #0056b3;
background-color: #f0f8ff;
margin-bottom: 20px;
}
.flex-demo-container .item-flex {
width: 60px;
height: 60px;
background-color: #3498db;
color: white;
margin: 5px;
display: flex; /* 让项目内部内容也能flex居中 */
justify-content: center;
align-items: center;
border-radius: 5px;
}
flex-direction: row; justify-content: flex-start; align-items: stretch; (默认)
flex-direction: row; justify-content: center; align-items: center;
flex-direction: column; justify-content: space-around;
<div class="container-flex">
<div class="item-flex item-flex-order-1">A</div>
<div class="item-flex item-flex-order-2">B</div>
<div class="item-flex item-flex-order-3">C</div>
</div>
.flex-demo-container .item-flex-order-1 { order: 2; } /* 排序,值越小越靠前 */
.flex-demo-container .item-flex-order-2 { order: 1; flex-grow: 1; } /* 伸展,占据剩余空间 */
.flex-demo-container .item-flex-order-3 { order: 3; flex-shrink: 0; flex-basis: 120px; } /* 收缩,基础大小 */
项目排序、伸缩、基础大小:
align-self 覆盖容器 align-items:
Flexbox让垂直居中不再是噩梦!
<div class="center-container">
<div class="centered-item">我居中了!</div>
</div>
.flex-demo-container .center-container {
display: flex;
justify-content: center; /* 水平居中 */
align-items: center; /* 垂直居中 */
height: 150px;
border: 2px dashed #666;
margin-bottom: 20px;
background-color: #fcfcfc;
}
.flex-demo-container .centered-item {
background-color: #27ae60;
color: white;
padding: 20px;
border-radius: 8px;
font-size: 1.2em;
}
等高布局:Flexbox天然支持等高,因为align-items的默认值是stretch。
<div class="equal-height-container">
<div class="equal-height-item">
<p>这是内容较少的栏目。</p>
</div>
<div class="equal-height-item" style="height: 150px;">
<p>这是内容较多的栏目,可以看到旁边的栏目也会自动等高。</p>
</div>
</div>
.flex-demo-container .equal-height-container {
display: flex; /* 关键! */
border: 1px solid #ddd;
margin-top: 20px;
background-color: #fcfcfc;
}
.flex-demo-container .equal-height-item {
background-color: #f7f7f7;
border: 1px solid #eee;
padding: 10px;
flex: 1; /* 每个项目都等宽且等高 */
display: flex; /* 如果内部内容需要垂直居中,再次声明flex */
flex-direction: column; /* 内容垂直排列 */
justify-content: space-between; /* 内容在垂直方向上两端对齐 */
min-height: 80px; /* Ensure some height for demo */
}
这是内容较少的栏目。
这是内容较多的栏目,可以看到旁边的栏目也会自动等高。Flexbox让这一切变得轻而易举!
Grid布局是CSS3中更高级的布局模块,用于在二维方向(行和列)上对项目进行布局。它非常适合创建复杂的整体页面布局。
图 3-2:Grid 布局核心概念示意图
display: grid或display: inline-grid的父元素。<div class="grid-container-basic">
<div class="grid-item">A</div>
<div class="grid-item">B</div>
<div class="grid-item">C</div>
<div class="grid-item">D</div>
<div class="grid-item">E</div>
<div class="grid-item">F</div>
<div class="grid-item">G</div>
<div class="grid-item">H</div>
<div class="grid-item">I</div>
</div>
.grid-demo-container .grid-container-basic {
display: grid; /* 声明为 Grid 容器 */
grid-template-columns: 1fr 2fr 1fr; /* 三列,中间列是左右两列的两倍宽 */
grid-template-rows: 80px auto 40px; /* 三行,高度分别为80px,自动,40px */
grid-gap: 10px; /* 行和列间距都是10px */
height: 300px;
border: 1px solid #0056b3;
background-color: #f0f8ff;
margin-bottom: 20px;
}
.grid-demo-container .grid-item {
background-color: #3498db;
color: white;
padding: 10px;
border: 1px solid rgba(0, 0, 0, 0.1);
display: flex;
justify-content: center;
align-items: center;
}
这些属性应用于Grid项目,控制其在网格中的位置和大小。
<div class="grid-container-basic">
<div class="grid-item grid-item-span-first">占据两列</div>
<div class="grid-item">Item B</div>
<div class="grid-item grid-item-self-align">自对齐</div>
<div class="grid-item">Item D</div>
</div>
.grid-demo-container .grid-item-span-first {
grid-column: 1 / span 2; /* 第一个项目占据两列 */
background-color: #28a745;
}
.grid-demo-container .grid-item-self-align {
background-color: #dc3545;
justify-self: end; /* 在其单元格内水平右对齐 */
align-self: center; /* 在其单元格内垂直居中 */
height: 40px; /* Give it a fixed height to show align-self */
}
Grid布局非常适合实现传统的“头部-侧边栏-内容-底部”等复杂布局。
<div class="page-layout">
<header>Header</header>
<nav>Navigation</nav>
<main>Main Content</main>
<aside>Sidebar</aside>
<footer>Footer</footer>
</div>
.grid-demo-container .page-layout {
display: grid;
grid-template-columns: 150px 1fr; /* 左侧边栏150px,内容区1fr */
grid-template-rows: auto 1fr auto; /* 头部自适应,内容区1fr,底部自适应 */
grid-template-areas:
"header header"
"nav main"
"footer footer";
height: 400px; /* 限制高度方便演示 */
gap: 10px; /* 各区域间距 */
border: 1px dashed #666;
margin-bottom: 20px;
}
.grid-demo-container .page-layout > * {
color: white;
display: flex;
justify-content: center;
align-items: center;
border-radius: 5px;
}
.grid-demo-container header { grid-area: header; background-color: #3498db; }
.grid-demo-container nav { grid-area: nav; background-color: #2ecc71; }
.grid-demo-container main { grid-area: main; background-color: #f1c40f; }
.grid-demo-container aside { /* 注意:这里的 aside 没有被 grid-template-areas 直接放置,
如果需要显示,需要修改 template-areas 或使用 grid-column/row 定位 */
grid-column: 2 / 3; /* 在第二列 */
grid-row: 2 / 3; /* 在第二行 */
background-color: #e74c3c;
display: none; /* 暂时隐藏,因为 template-areas 没有它的位置,避免重叠 */
}
.grid-demo-container footer { grid-area: footer; background-color: #9b59b6; }
grid-template-areas)Grid vs Flexbox:
它们不是互相替代,而是相辅相成。在一个Grid布局的单元格内,你仍然可以使用Flexbox来对齐其内部的元素。
媒体查询允许你根据设备的特性(如屏幕宽度、高度、分辨率、方向等)来应用不同的CSS样式。这是实现响应式设计的基石,让你的网站在任何设备上都能呈现出最佳效果。
/* 当屏幕宽度小于等于 768px 时应用以下样式 */
@media screen and (max-width: 768px) {
body {
font-size: 14px; /* 字体变小 */
}
.main-navigation {
flex-direction: column; /* 导航栏垂直堆叠 */
}
}
/* 当屏幕宽度大于等于 992px 时应用以下样式 */
@media screen and (min-width: 992px) {
.sidebar {
display: block; /* 侧边栏显示 */
}
}
@media 关键字:开始媒体查询。screen:媒体类型,表示用于屏幕设备。其他常见类型包括print(打印)和all(所有设备)。and:逻辑运算符,连接多个条件。(max-width: 768px):媒体特性,表示屏幕最大宽度为768像素。width / height:视口宽度和高度。
min-width:视口最小宽度。max-width:视口最大宽度。orientation:设备方向。
portrait:竖屏。landscape:横屏。resolution:屏幕分辨率(DPI/DPPX)。
min-resolution:用于Retina等高DPI屏幕。断点是媒体查询中定义的不同屏幕尺寸临界值。常见的断点有:
| 屏幕类型 | 典型断点 (Max-width) | 典型断点 (Min-width) |
|---|---|---|
| 小屏幕/手机 | < 576px 或 < 768px | - |
| 中等屏幕/平板 | - | 576px 或 768px |
| 大屏幕/桌面 | - | 992px |
| 超大屏幕 | - | 1200px |
Mobile First(移动优先)策略:这是一种推荐的响应式设计方法。先为小屏幕设备编写基础样式,然后逐步使用min-width的媒体查询为更大屏幕添加或覆盖样式。这样可以确保移动设备的加载速度,并更容易管理CSS。
/* 默认样式(移动端样式) */
body {
font-size: 16px;
}
.container {
padding: 10px;
}
/* 中等屏幕(平板及以上) */
@media (min-width: 768px) {
body {
font-size: 18px;
}
.container {
padding: 20px;
}
}
/* 大屏幕(桌面及以上) */
@media (min-width: 992px) {
body {
font-size: 20px;
}
.container {
padding: 30px;
}
}
结合Flexbox或Grid和媒体查询,实现一个简单的响应式三列布局。
<div class="responsive-columns">
<div class="col">Column 1</div>
<div class="col">Column 2</div>
<div class="col">Column 3</div>
</div>
.media-query-demo-container .responsive-columns {
display: flex; /* 默认在桌面端是行排列 */
flex-wrap: wrap;
gap: 15px;
padding: 15px;
border: 1px dashed #ccc;
margin-bottom: 20px;
background-color: #fcfcfc;
}
.media-query-demo-container .col {
flex: 1; /* 默认等宽 */
min-width: 250px; /* 最小宽度限制,防止挤压过小 */
background-color: #8e44ad;
color: white;
padding: 20px;
text-align: center;
border-radius: 5px;
}
/* 当屏幕宽度小于 768px 时,列垂直堆叠 */
@media (max-width: 767px) {
.media-query-demo-container .responsive-columns {
flex-direction: column; /* 变为列方向 */
}
.media-query-demo-container .col {
min-width: auto; /* 不再限制最小宽度,充满容器 */
}
}
请尝试调整浏览器窗口大小,观察下方布局的变化。
图 3-3:响应式布局在桌面(左)和手机(右)上的表现
CSS3动画和过渡让网页从静态变得生动有趣,极大地提升了用户体验,而无需依赖JavaScript。它们是Web动效的核心。
过渡允许你在CSS属性改变时,创建一个平滑的动画效果,而不是瞬间改变。
transition-property:指定要过渡的CSS属性。可以是一个属性名,多个属性名(逗号分隔),或all(所有可过渡属性)。transition-duration:过渡完成所需的时间(秒s或毫秒ms)。transition-timing-function:过渡的速度曲线(缓动函数),控制动画的加速和减速。
ease (默认):慢速开始,然后变快,然后慢速结束。linear:匀速。ease-in:慢速开始。ease-out:慢速结束。ease-in-out:慢速开始和结束。cubic-bezier(n,n,n,n):自定义贝塞尔曲线。steps(n, start|end):分步过渡。transition-delay:过渡开始前的延迟时间。transition (简写属性):上述四个属性的简写。通过过渡,让按钮在鼠标悬停时平滑改变背景色和大小。
<button class="transition-btn">悬停我</button>
.transition-demo-container .transition-btn {
padding: 10px 20px;
font-size: 18px;
background-color: #3498db;
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
outline: none; /* 移除点击时的外边框 */
/* 定义过渡效果 */
transition: background-color 0.3s ease, transform 0.3s ease;
}
.transition-demo-container .transition-btn:hover {
background-color: #2980b9; /* 悬停时改变背景色 */
transform: scale(1.05); /* 悬停时稍微放大 */
}
图 4-1:按钮悬停过渡效果
转换允许你对元素进行平移、旋转、缩放和倾斜等操作,创造出丰富的2D或3D视觉效果。
.transition-demo-container .box-transform {
width: 100px;
height: 100px;
background-color: #e74c3c;
margin: 50px auto;
transition: transform 0.5s ease;
display: flex;
justify-content: center;
align-items: center;
color: white;
border-radius: 5px;
}
.transition-demo-container .box-transform:hover {
/* 组合多个转换:向右移动50px,向下移动20px,同时顺时针旋转45度 */
transform: translate(50px, 20px) rotate(45deg);
}
将鼠标悬停在方块上:
3D转换需要一个透视(perspective)来创建深度感,通常设置在父元素上。
.transition-demo-container .box-transform.transform-3d-example {
margin-top: 20px;
background-color: #2c3e50;
perspective: 800px; /* 景深,数值越小,透视效果越明显 */
}
.transition-demo-container .box-transform.transform-3d-example .inner-box-3d {
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
transform-style: preserve-3d; /* 确保子元素在3D空间中 */
transition: transform 1s ease;
background-color: inherit;
color: white;
}
.transition-demo-container .box-transform.transform-3d-example:hover .inner-box-3d {
/* 3D旋转:绕Y轴旋转180度 */
transform: rotateY(180deg);
}
指定转换的起点。默认是元素的中心(50% 50%)。
.transition-demo-container .rotate-from-top-left {
transform-origin: top left; /* 从左上角开始旋转 */
background-color: #f1c40f;
color: #333;
padding: 10px;
display: inline-block;
transition: transform 0.5s ease;
}
.transition-demo-container .rotate-from-top-left:hover {
transform: rotate(45deg);
}
transform-origin在进行3D转换时,控制元素的背面是否可见。常用于翻转效果。
.transition-demo-container .card-container-3d {
perspective: 1000px;
width: 200px;
height: 120px;
margin: 50px auto;
position: relative;
border: 1px dashed #ccc;
}
.transition-demo-container .card-3d {
width: 100%;
height: 100%;
position: absolute;
transform-style: preserve-3d;
transition: transform 0.6s;
cursor: pointer;
}
.transition-demo-container .card-front, .transition-demo-container .card-back {
position: absolute;
width: 100%;
height: 100%;
backface-visibility: hidden; /* 背面隐藏 */
display: flex;
justify-content: center;
align-items: center;
border-radius: 8px;
font-size: 1.5em;
color: white;
box-shadow: 0 4px 8px rgba(0,0,0,0.1);
}
.transition-demo-container .card-front {
background-color: #3498db;
z-index: 2; /* 确保正面在上面 */
}
.transition-demo-container .card-back {
background-color: #e74c3c;
transform: rotateY(180deg); /* 背面一开始就翻转180度 */
z-index: 1; /* 确保背面在下面 */
}
.transition-demo-container .card-container-3d:hover .card-3d {
transform: rotateY(180deg); /* 悬停时翻转整个卡片 */
}
挑战一下:
尝试制作一个“跳动”的按钮动画。当鼠标悬停在按钮上时,按钮先向上“跳”一点,然后回落,同时背景颜色也发生变化。使用transition和transform结合实现。
过渡只适用于“从A到B”的单一状态变化,而动画则允许你定义复杂的、多步骤的、循环的动画序列。
这是动画的核心,用于定义动画在不同时间点(关键帧)的样式。
@keyframes pulse {
0% {
transform: scale(1);
opacity: 1;
}
50% {
transform: scale(1.1);
opacity: 0.7;
}
100% {
transform: scale(1);
opacity: 1;
}
}
你可以使用百分比 (0%到100%) 来定义动画的每个阶段,也可以使用from (等同于0%) 和to (等同于100%)。
这些属性应用于需要动画的元素。
animation-name:指定要应用的@keyframes动画名称。animation-duration:动画完成一次所需的时间。animation-timing-function:动画的速度曲线。animation-delay:动画开始前的延迟时间。animation-iteration-count:动画重复的次数(数字或infinite)。animation-direction:动画是向前播放、向后播放还是交替播放。
normal (默认):每次都从头到尾播放。reverse:每次都从尾到头播放。alternate:正向播放,然后反向播放,交替进行。alternate-reverse:反向播放,然后正向播放,交替进行。animation-fill-mode:动画结束后,元素样式停留在哪个状态。
none (默认):动画结束后,元素回到动画开始前的状态。forwards:动画结束后,元素停留在动画最后一帧的样式。backwards:动画开始前,元素就应用动画第一帧的样式。both:结合forwards和backwards。animation-play-state:控制动画的播放状态(running或paused)。animation (简写属性):所有动画属性的简写。加载动画:
<div class="loader"></div>
.animation-demo-container .loader {
width: 50px;
height: 50px;
border: 5px solid #f3f3f3;
border-top: 5px solid #3498db;
border-radius: 50%;
animation: spin 1s linear infinite; /* 应用动画 */
margin: 20px auto;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
图 4-2:一个简单的旋转加载动画
动画与过渡的选择:
掌握了核心的CSS3特性后,我们再来看看一些提升开发效率和代码质量的进阶技巧和最佳实践。
CSS变量(或称CSS自定义属性)允许你定义可复用的值,并在整个样式表中引用它们。这极大地提高了CSS的可维护性和灵活性,特别是对于主题定制和设计系统。
变量以--开头,定义在选择器内部,通常在:root伪类中定义全局变量。
:root { /* 定义全局变量 */
--primary-color: #3498db;
--secondary-color: #2ecc71;
--spacing-unit: 16px;
}
.custom-properties-demo-container {
background-color: var(--primary-color);
padding: var(--spacing-unit);
color: white;
border-radius: 8px;
margin-bottom: 20px;
}
.custom-properties-demo-container button {
background-color: var(--secondary-color);
color: white;
padding: calc(var(--spacing-unit) / 2) var(--spacing-unit); /* 变量可以在 calc() 中使用 */
border-radius: 5px;
border: none;
cursor: pointer;
margin-top: 10px;
}
这里的内容和按钮使用了全局定义的变量 --primary-color, --secondary-color, --spacing-unit。
CSS变量具有作用域。在哪个选择器中定义,就在哪个选择器及其子元素中可用。
.custom-properties-demo-container .card-var {
--card-bg: #f9f9f9; /* 局部变量,只在 .card-var 及其子元素中可用 */
background-color: var(--card-bg);
padding: var(--spacing-unit);
margin-top: var(--spacing-unit);
border-radius: 5px;
color: #333;
}
.custom-properties-demo-container .card-title-var {
color: var(--primary-color); /* 可以访问全局变量 */
border-bottom: 1px solid var(--card-bg); /* 可以访问父元素的局部变量 */
padding-bottom: 5px;
}
卡片内容使用了局部背景变量。
CSS变量的优势:
:root或特定元素的变量值,即可实现动态主题切换。这些是CSS3新增的相对单位,它们相对于视口(浏览器窗口)的尺寸。这对于响应式设计非常有用。
vw (viewport width):视口宽度的 1%。例如,1vw是视口宽度的1%。vh (viewport height):视口高度的 1%。例如,1vh是视口高度的1%。vmin:视口宽度和高度中较小值的 1%。vmax:视口宽度和高度中较大值的 1%。.viewport-demo-container .heading-vw {
font-size: 5vw; /* 标题字体大小随着视口宽度变化而变化 */
text-align: center;
background-color: #fcfcfc;
padding: 10px;
border: 1px dashed #ccc;
margin-bottom: 20px;
}
.viewport-demo-container .hero-section-vh {
height: 40vh; /* Changed for demo context */
background-image: url('https://picsum.photos/1920/1080?random=13');
background-size: cover;
background-position: center center;
display: flex;
justify-content: center;
align-items: center;
color: white;
text-shadow: 2px 2px 4px rgba(0,0,0,0.7);
font-size: 2em;
margin-bottom: 20px;
}
图 5-1:使用 vh 实现全屏高度
CSS Houdini是一组底层API,允许开发者直接访问CSS引擎的各个部分。它不是CSS属性,而是更深层次的机制,让你能够编写自己的CSS功能,比如自定义属性类型、自定义布局、自定义绘制等。
对于初学者而言,目前无需深入学习Houdini,但了解它的存在会让你知道CSS的未来发展方向——更开放、更可编程。
优秀的CSS不仅要美观,还要高效。以下是一些优化建议:
优化策略:
offsetHeight)。transform和opacity进行动画,因为它们不会引起回流,通常只会引起合成(Composition)。*作为关键选择器。[attribute*="value"])。background-position显示不同部分,减少HTTP请求。.primary-button而不是.red-btn),提高代码可读性和可维护性。图 5-2:CSS 性能优化是构建高效网页的关键
理论知识学习得再多,不如动手实践。现在,让我们将前面学到的CSS3知识运用到实际案例中,感受它们的强大魅力。
创建一个在桌面端水平排列,在移动端变为垂直堆叠并可展开/收起的导航栏。
<!-- HTML 结构 -->
<nav class="navbar">
<a href="#" class="nav-brand">Logo</a>
<button class="nav-toggle">☰</button> <!-- 汉堡菜单图标 -->
<ul class="nav-links">
<li><a href="#">首页</a></li>
<li><a href="#">关于我们</a></li>
<li><a href="#">服务</a></li>
<li><a href="#">联系我们</a></li>
</ul>
</nav>
/* CSS 样式 */
.navbar-demo-container .navbar {
display: flex;
justify-content: space-between;
align-items: center;
background-color: #333;
padding: 10px 20px;
color: white;
}
.navbar-demo-container .nav-brand {
color: white;
text-decoration: none;
font-size: 1.5em;
font-weight: bold;
}
.navbar-demo-container .nav-toggle {
display: none; /* 默认隐藏汉堡菜单 */
background: none;
border: none;
color: white;
font-size: 1.8em;
cursor: pointer;
}
.navbar-demo-container .nav-links {
list-style: none;
margin: 0;
padding: 0;
display: flex; /* 桌面端水平排列 */
}
.navbar-demo-container .nav-links li a {
color: white;
text-decoration: none;
padding: 10px 15px;
display: block;
transition: background-color 0.3s ease;
}
.navbar-demo-container .nav-links li a:hover {
background-color: #555;
}
/* 移动端媒体查询 */
@media (max-width: 768px) {
.navbar-demo-container .navbar {
flex-wrap: wrap; /* 允许换行 */
}
.navbar-demo-container .nav-toggle {
display: block; /* 显示汉堡菜单 */
}
.navbar-demo-container .nav-links {
flex-direction: column; /* 垂直堆叠 */
width: 100%;
display: none; /* 默认隐藏菜单项 */
text-align: center;
}
/* JavaScript 将会在这里添加一个类来显示/隐藏菜单 */
.navbar-demo-container .nav-links.active {
display: flex; /* 显示菜单项 */
}
}
注意:导航栏的展开/收起功能通过少量JavaScript实现。此处JavaScript代码已在页面头部集成,确保演示可用。
创建一个响应式的卡片列表,每张卡片在悬停时有独特的动画效果。
<!-- HTML 结构 -->
<div class="card-grid">
<div class="card">
<img src="https://picsum.photos/400/250?random=16" alt="Card Image 1">
<div class="card-content">
<h3>精选文章 1</h3>
<p>这是一个简短的描述,展示了卡片内容的魅力。</p>
<a href="#" class="read-more-btn">阅读更多</a>
</div>
</div>
<div class="card">
<img src="https://picsum.photos/400/250?random=17" alt="Card Image 2">
<div class="card-content">
<h3>精选文章 2</h3>
<p>这又是另一个例子,展示了CSS3的强大。</p>
<a href="#" class="read-more-btn">阅读更多</a>
</div>
</div>
<!-- 更多卡片... -->
</div>
/* CSS 样式 */
.card-layout-demo-container .card-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); /* 响应式网格列 */
gap: 25px;
padding: 25px;
background-color: #f0f2f5;
border-radius: 8px;
}
.card-layout-demo-container .card {
background-color: white;
border-radius: 10px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
overflow: hidden; /* 确保图片圆角 */
transition: transform 0.3s ease-in-out, box-shadow 0.3s ease-in-out;
}
.card-layout-demo-container .card:hover {
transform: translateY(-8px) scale(1.02); /* 悬停时向上浮起并略微放大 */
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2);
}
.card-layout-demo-container .card img {
width: 100%;
height: 200px; /* 固定高度,或使用 aspect-ratio */
object-fit: cover; /* 裁剪图片以填充,保持比例 */
border-top-left-radius: 10px;
border-top-right-radius: 10px;
}
.card-layout-demo-container .card-content {
padding: 15px;
}
.card-layout-demo-container .card-content h3 {
margin-top: 0;
color: #333;
}
.card-layout-demo-container .card-content p {
font-size: 0.9em;
color: #666;
line-height: 1.5;
}
.card-layout-demo-container .read-more-btn {
display: inline-block;
background-color: #3498db;
color: white;
padding: 8px 15px;
border-radius: 5px;
text-decoration: none;
margin-top: 10px;
transition: background-color 0.3s ease;
}
.card-layout-demo-container .read-more-btn:hover {
background-color: #2980b9;
}
将鼠标悬停在卡片上,观察其动画效果。
图 6-1:精美卡片布局示例
创建一个简单的、纯CSS动画的进度条。
<!-- HTML 结构 -->
<div class="progress-bar-wrapper">
<div class="progress-bar"></div>
</div>
/* CSS 样式 */
.progress-bar-demo-container .progress-bar-wrapper {
width: 80%;
height: 10px;
background-color: #e0e0e0;
border-radius: 5px;
overflow: hidden;
margin: 50px auto;
}
.progress-bar-demo-container .progress-bar {
width: 0%; /* 初始宽度为0 */
height: 100%;
background-color: #27ae60;
border-radius: 5px;
animation: fill-progress 2s forwards; /* 动画填充进度 */
}
@keyframes fill-progress {
0% { width: 0%; }
100% { width: 80%; } /* 填充到80% */
}
恭喜你!你已经完成了CSS3从入门到精通的奇妙旅程。从最基础的选择器,到高级的布局(Flexbox和Grid),再到令人惊叹的动画和过渡,你现在已经掌握了构建现代、响应式、交互式网页的核心魔法。
CSS3的世界广阔而深奥,本教程为你打下了坚实的基础。但这仅仅是开始。Web技术日新月异,持续学习是必不可少的。
下一步去哪里?
subgrid, container queries等),保持与时俱进。记住,学习永无止境,每一次敲击键盘,每一次解决bug,都是你向更强大的自己迈进的步伐。继续保持好奇心,勇敢地去创造吧!
如果你在本教程中遇到任何疑问,或者对某个知识点有更深层次的思考,欢迎随时提出。祝你未来的Web开发之路一片光明!