作为一名资深前端架构师,我将为你全面总结 CSS3 的核心特性和在现代 Web 开发中的应用。CSS3 并非一个单一的规范,而是一系列模块的总称,这些模块独立发展,共同极大地扩展了 CSS2.1 的能力。它使前端开发者能够创建更具表现力、更灵活、更响应式的用户界面,而无需依赖图片或 JavaScript 的复杂操作。
CSS3 引入了许多强大的新选择器和伪类,让样式选择更加精确和灵活。
讲解: 属性选择器允许你根据 HTML 元素的属性及其值来选择元素。CSS3 扩展了这一能力,使其能够匹配属性值开头、结尾或包含特定字符串的元素,这在处理动态内容或结构时尤其有用。
[attr^="value"]: 选择属性值以指定字符串开头的元素。常用于匹配特定前缀的 URL。[attr$="value"]: 选择属性值以指定字符串结尾的元素。常用于匹配特定文件类型(如 `.pdf`)。[attr*="value"]: 选择属性值包含指定字符串的元素。常用于模糊匹配类名或数据属性。/* 选择所有 href 属性以 "https://" 开头的链接,为其设置绿色文本 */
a[href^="https://"] {
color: green;
}
/* 选择所有类名以 "-item" 结尾的 div 元素,为其添加蓝色边框 */
div[class$="-item"] {
border: 1px solid blue;
padding: 5px;
}
/* 选择所有 data-id 属性包含 "user" 字符串的元素,为其设置背景色 */
[data-id*="user"] {
background-color: #fffacd; /* 浅黄色 */
}
说明: 上面示例中,"安全链接"会变绿,包含"-item"的 div 会有蓝色边框,包含"user"的 span 会有黄色背景。
讲解: 结构伪类根据元素在父元素中的位置(DOM 树结构)来选择它们。这极大地简化了代码,避免了为每个特定位置的元素手动添加类。
:first-child / :last-child: 匹配父元素的第一个/最后一个子元素,不考虑元素类型。:nth-child(n) / :nth-last-child(n): 匹配父元素的第 n 个子元素(从开头/结尾计数)。n 可以是数字、关键字 (odd, even) 或公式 (2n+1, -n+5)。:first-of-type / :last-of-type: 匹配父元素中特定类型的第一个/最后一个子元素。:nth-of-type(n) / :nth-last-of-type(n): 匹配父元素中特定类型的第 n 个子元素。:only-child: 如果元素是其父元素的唯一子元素。:only-of-type: 如果元素是其父元素的唯一同类型子元素。:empty: 选择没有子元素(包括文本节点、空格)的元素。ul li:nth-child(2n+1) { /* 奇数行列表项 */
background-color: #f0f0f0;
}
div p:first-of-type { /* 每个 div 下的第一个 p 元素 */
font-weight: bold;
color: #dc3545;
}
span:only-child { /* 如果 span 是其父元素的唯一子元素 */
font-style: italic;
color: #007bff;
}
.empty-box:empty { /* 如果 .empty-box 没有内容 */
height: 30px;
border: 1px dashed gray;
background-color: #eee;
}
这是段落 1 (粗体)
这是段落 2
唯一子元素 (斜体)另一段落
非唯一子元素 另一个非唯一子元素说明: 奇数列表项有背景色;每个父元素下的第一个段落加粗红色;唯一子元素的 span 变斜体蓝色;空 div 显示边框和背景。
讲解: 这两种伪类在特定场景下提供强大的选择能力。
:target: 当 URL 的片段标识符(#后面的部分)与某个元素的 ID 匹配时,该元素将被选中。常用于实现单页应用中的锚点链接高亮或显示隐藏内容。:not(selector): 这是一个否定伪类,匹配不符合括号内选择器条件的元素。它非常灵活,可以用于排除特定元素。/* 当 URL 为 #section-target 时,此元素会高亮 */
#section-target:target {
background-color: yellow;
padding: 10px;
border: 2px solid orange;
}
/* 选择所有不是 .warning 类的 div 元素 */
div:not(.warning) {
border: 1px solid lightgray;
margin-bottom: 5px;
}
/* 选择所有 input 元素,除了类型为 checkbox 或 radio 的 */
input:not([type="checkbox"]):not([type="radio"]) {
border-color: blue;
}
说明: 点击"跳转到目标元素"链接,URL 变化后,目标 div 会高亮。非警告 div 会有浅灰色边框,普通文本框会有蓝色边框。
CSS3 带来了许多可以直接在 CSS 中实现的美观效果,减少了对图片编辑软件的依赖,提升了加载速度和维护性。
border-radius)讲解: border-radius 属性允许你为元素的边框添加圆角。你可以为所有角设置相同的半径,也可以单独为每个角设置不同的水平和垂直半径。
border-radius: 10px;: 所有四个角都是 10px 的圆角。border-radius: 10px 20px;: 左上/右下为 10px,右上/左下为 20px。border-radius: 10px 20px 30px 40px;: 按顺时针方向(左上、右上、右下、左下)设置。border-radius: 50%;: 如果元素是正方形,将变成圆形;如果是矩形,则变成椭圆形。/ 分隔水平和垂直半径,例如 border-radius: 10px / 20px;。.rounded-box-1 {
border-radius: 15px; /* 所有角 15px 圆角 */
}
.rounded-box-2 {
border-radius: 30px 0 30px 0; /* 对角线圆角 */
}
.circle {
width: 100px;
height: 100px;
border-radius: 50%; /* 正方形元素变为圆形 */
background-color: purple;
}
说明: 第一个方块是统一圆角,第二个是交错圆角,第三个正方形变成了圆形。
box-shadow 和 text-shadow)讲解: 阴影效果能为元素和文本增加深度感,使其在页面上更加突出。它们都支持多重阴影,通过逗号分隔多个阴影定义。
box-shadow: offset-x offset-y blur-radius spread-radius color inset;
offset-x: 水平偏移量 (正值向右)。offset-y: 垂直偏移量 (正值向下)。blur-radius: 模糊半径,值越大越模糊。spread-radius (可选): 阴影扩散半径 (正值使阴影变大)。color: 阴影颜色,支持 RGBA 以设置透明度。inset (可选): 将阴影变为内阴影。text-shadow: offset-x offset-y blur-radius color;
box-shadow 类似,但没有 spread-radius 和 inset。.shadow-box {
box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.4); /* 简单阴影 */
}
.multi-shadow-box {
box-shadow: 0 0 10px #007bff, /* 蓝色光晕 */
5px 5px 5px rgba(0, 0, 0, 0.3); /* 黑色硬阴影 */
}
.inset-shadow-box {
box-shadow: inset 0 0 10px red; /* 红色内阴影 */
}
.text-shadow-example {
text-shadow: 2px 2px 5px gray; /* 简单文本阴影 */
}
.glowing-text {
text-shadow: 0 0 5px white, 0 0 10px blue, 0 0 15px lightblue; /* 发光文本 */
}
说明: 演示了普通外阴影、多重阴影、内阴影以及文本阴影效果。
linear-gradient 和 radial-gradient)讲解: 渐变允许你创建平滑的颜色过渡背景,而无需使用图片。这不仅减少了 HTTP 请求,还使得背景在不同尺寸下都能完美缩放。
linear-gradient(direction, color-stop1, color-stop2, ...): 线性渐变。
direction: 可以是角度 (如 45deg), 或关键字 (to top, to right, to bottom right)。color-stop: 颜色值,可选加位置 (如 red 10%, blue 90%)。radial-gradient(shape size at position, color-stop1, color-stop2, ...): 径向渐变。
shape: circle (圆形) 或 ellipse (椭圆形)。size: 渐变大小 (closest-corner, farthest-corner, closest-side, farthest-side)。position: 渐变中心位置 (如 center, top left, 20% 30%)。.linear-gradient-example {
/* 从左上到右下,红色到蓝色 */
background: linear-gradient(to bottom right, red, blue);
}
.radial-gradient-example {
/* 中心为白色,边缘为绿色的圆形渐变 */
background: radial-gradient(circle at center, white, green);
}
.repeating-linear-gradient {
/* 重复线性渐变,创建条纹效果 */
background: repeating-linear-gradient(45deg, yellow, yellow 10px, black 10px, black 20px);
}
说明: 第一个盒子展示了从左到右的红黄线性渐变;第二个盒子展示了从中心向外扩散的白蓝径向渐变。
讲解: CSS3 为背景图像提供了更精细的控制,让背景效果更加丰富和灵活。
background-size: 控制背景图片大小。
cover: 缩放背景图片以完全覆盖背景区域,可能裁剪。contain: 缩放背景图片以完全显示在背景区域内,可能留下空白。width height: 自定义尺寸,如 200px 100%。background-origin: 定义背景图片的定位区域。
padding-box (默认): 从内边距盒子的左上角开始定位。border-box: 从边框盒子的左上角开始定位。content-box: 从内容盒子的左上角开始定位。background-clip: 定义背景的绘制区域。
border-box (默认): 背景绘制到边框外边缘。padding-box: 背景绘制到内边距外边缘。content-box: 背景绘制到内容区域。text: 背景被裁剪为文本的形状(需要浏览器支持)。.background-enhanced {
background-image: url('https://via.placeholder.com/50/FF0000/FFFFFF?text=A'),
url('https://via.placeholder.com/50/0000FF/FFFFFF?text=B'); /* 多个背景图 */
background-position: top left, bottom right; /* 各自定位 */
background-repeat: no-repeat; /* 不重复 */
background-size: 50px auto; /* 尺寸 */
background-origin: content-box; /* 从内容区域开始定位 */
background-clip: padding-box; /* 裁剪到内边距区域 */
padding: 20px;
border: 5px dashed gray;
width: 200px;
height: 150px;
}
说明: 盒子有虚线边框和内边距。两个背景图(红色的A和蓝色的B)分别定位在左上角和右下角,且只在内容区域内显示,背景绘制范围被裁剪到内边距区域。
讲解: CSS Transform 属性允许你在不影响文档流的情况下,对元素进行空间上的变形(移动、旋转、缩放、倾斜)。这是实现复杂 UI 动画和交互效果的关键。
讲解: 2D 转换是在二维平面(X 和 Y 轴)上进行的变形。
translate(x, y) 或 translateX(x), translateY(y): 沿 X 轴和/或 Y 轴移动元素。rotate(angle): 绕 Z 轴(屏幕平面)旋转元素。scale(x, y) 或 scaleX(x), scaleY(y): 沿 X 轴和/或 Y 轴缩放元素。skew(x-angle, y-angle) 或 skewX(x-angle), skewY(y-angle): 沿 X 轴和/或 Y 轴倾斜元素。matrix(...): 直接应用一个 3x3 的 2D 变换矩阵,提供最高级的控制。transform-origin: 属性用于设置所有转换操作的原点。默认是元素的中心 (50% 50%)。.transformed-2d-box {
width: 70px; height: 70px; background-color: #fd7e14; color: white;
display: flex; justify-content: center; align-items: center;
transition: transform 0.4s ease-out; /* 添加过渡效果 */
}
.transformed-2d-box:hover {
transform: rotate(20deg) scale(1.1) translateX(10px); /* 悬停时旋转、放大、平移 */
}
说明: 鼠标悬停在方块上,它会轻微旋转、放大并向右移动,展示了 2D 转换的复合应用和过渡效果。
讲解: 3D 转换将元素带入三维空间,增加了 Z 轴的概念,从而实现更具沉浸感的视觉效果。需要两个关键属性来定义 3D 场景:
perspective: 定义观察者(眼睛)与 3D 元素平面之间的距离。它应用于父元素,影响所有 3D 变换的子元素。值越大,透视效果越弱(元素远近变化不明显);值越小,透视效果越强(远处的元素看起来更小)。transform-style: preserve-3d;: 关键属性,应用于父元素,指示其子元素应该在 3D 空间中各自定位,而不是扁平化到父元素的 2D 平面上。3D 转换函数:
translateZ(z) / translate3d(x, y, z): 沿 Z 轴(深度)移动。正值表示向观察者靠近,负值表示远离。rotateX(angle) / rotateY(angle) / rotateZ(angle) / rotate3d(x, y, z, angle): 绕 X、Y、Z 轴或任意向量旋转。scaleZ(z) / scale3d(x, y, z): 沿 Z 轴缩放(不常用)或三维缩放。matrix3d(...): 最底层的 4x4 3D 变换矩阵,用于高级自定义。backface-visibility: 控制元素背面(当元素翻转时)是否可见。设置为 hidden 可以避免在翻转卡片等效果中看到背面内容。.transformed-3d-parent {
perspective: 500px; /* 定义视距 */
margin: 20px auto; width: 100px; height: 100px; /* 为了演示,设置固定大小 */
}
.transformed-3d-box {
width: 100px; height: 100px; background-color: #6f42c1; color: white;
display: flex; justify-content: center; align-items: center;
transform-style: preserve-3d; /* 保持 3D 空间 */
transition: transform 0.6s ease-in-out;
backface-visibility: hidden; /* 隐藏背面 */
}
.transformed-3d-box:hover {
transform: rotateY(45deg) rotateX(15deg); /* 悬停时在 3D 空间旋转 */
}
说明: 鼠标悬停在方块上,它会在 3D 空间中绕 Y 轴和 X 轴旋转,展示了透视效果。
讲解: CSS3 原生提供了强大的动画能力,使网页元素动起来更加流畅和高效,通常由 GPU 加速,性能优于基于 JavaScript 的动画(在某些情况下)。
讲解: 过渡允许你在 CSS 属性值从一个状态平滑地变为另一个状态时,定义一个动画效果。它通常由用户交互或 JavaScript 改变样式触发。
transition-property: 指定要应用过渡效果的 CSS 属性名称(如 background-color, transform, opacity 等)。可使用 all 匹配所有可过渡属性。transition-duration: 过渡效果的持续时间,单位是秒 (s) 或毫秒 (ms)。transition-timing-function: 过渡速度曲线,定义动画在整个持续时间内的变化速度。
ease (默认): 慢-快-慢。linear: 匀速。ease-in: 慢速开始。ease-out: 慢速结束。ease-in-out: 慢速开始和结束。cubic-bezier(n,n,n,n): 自定义贝塞尔曲线。transition-delay: 过渡效果开始前的延迟时间。transition: 复合属性,用于一次性设置所有过渡属性。例如:transition: background-color 0.3s ease-in-out 0.1s, transform 0.5s;。.button-transition {
background-color: #007bff;
color: white;
padding: 10px 20px;
border: none;
border-radius: 5px;
cursor: pointer;
transition: background-color 0.3s ease-in-out, transform 0.2s ease-out; /* 定义过渡 */
}
.button-transition:hover {
background-color: #0056b3; /* 改变背景色 */
transform: translateY(-2px); /* 向上轻微移动 */
}
说明: 鼠标悬停在按钮上时,背景色和平移效果会平滑地过渡。
讲解: 动画允许你定义更复杂的、时间线控制的动画序列。它通过 @keyframes 规则定义动画的关键帧,然后通过 animation 属性将动画应用到元素。
@keyframes name { from {...} to {...} } 或 { 0% {...} 50% {...} 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: 复合属性。@keyframes bounce {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-20px); }
}
.animated-box {
width: 60px; height: 60px; background-color: #28a745;
margin: 20px auto;
border-radius: 50%;
animation: bounce 1s infinite alternate ease-in-out; /* 应用动画 */
}
说明: 圆形盒子会不断地上下"弹跳",展示了 @keyframes 和 animation 属性的组合应用。
讲解: Flexbox 是一种一维布局模型,专门用于在行或列中布置元素。它旨在有效地分配容器中的空间并对齐项目,即使它们的大小未知或动态变化。它非常适合组件内部的布局,如导航栏、表单元素或卡片列表。
核心概念:
Flex 容器 (Flex Container): 应用 display: flex; 或 display: inline-flex; 的元素。
Flex 项目 (Flex Item): Flex 容器的直接子元素。
主轴 (Main Axis): Flex 项目排列的方向(行或列)。
交叉轴 (Cross Axis): 与主轴垂直的方向。
应用于 Flex 容器的属性,控制其内部 Flex 项目的整体行为。
display: flex; / inline-flex;: 定义一个 Flex 容器。flex-direction: 定义主轴的方向,决定 Flex 项目的排列顺序。
row (默认): 从左到右(水平)。row-reverse: 从右到左(水平)。column: 从上到下(垂直)。column-reverse: 从下到上(垂直)。justify-content: 定义 Flex 项目在主轴上的对齐方式。
flex-start: 从主轴起点开始对齐。flex-end: 从主轴终点开始对齐。center: 居中对齐。space-between: 两端对齐,项目之间间距相等。space-around: 项目之间和两端都有间距,两端间距是项目之间间距的一半。space-evenly: 项目之间和两端间距都相等。align-items: 定义 Flex 项目在交叉轴上的对齐方式。
flex-start: 交叉轴起点对齐。flex-end: 交叉轴终点对齐。center: 交叉轴居中对齐。baseline: 项目内容基线对齐。stretch (默认): 如果项目未设置高度或设置为 auto,则拉伸填充容器。flex-wrap: 定义 Flex 项目是否换行。
nowrap (默认): 不换行,项目会挤压在一行内。wrap: 换行,从左到右,从上到下。wrap-reverse: 换行,从左到右,从下到上。align-content: 定义多行 Flex 项目在交叉轴上的对齐方式。仅当 flex-wrap 为 wrap 且有多行项目时有效。
justify-content 值类似:flex-start, flex-end, center, space-between, space-around, stretch。应用于 Flex 项目的属性,控制单个项目在 Flex 容器中的行为。
flex-grow: 定义项目的放大比例。当容器有多余空间时,项目会根据这个比例放大。默认是 0 (不放大)。flex-shrink: 定义项目的缩小比例。当容器空间不足时,项目会根据这个比例缩小。默认是 1 (允许缩小)。flex-basis: 定义项目在分配多余空间前占据的主轴空间。可以是一个长度值 (如 100px) 或百分比。默认是 auto。flex: 复合属性,简写 flex-grow flex-shrink flex-basis。
flex: 1; 等同于 flex: 1 1 0%; (允许放大缩小,初始尺寸为 0)。flex: auto; 等同于 flex: 1 1 auto; (允许放大缩小,初始尺寸根据内容)。flex: none; 等同于 flex: 0 0 auto; (不放大不缩小,初始尺寸根据内容)。order: 定义项目的排列顺序。数值越小,排列越靠前。默认是 0。align-self: 允许单个 Flex 项目覆盖容器的 align-items 属性,在交叉轴上单独对齐。.flex-container-example {
display: flex;
justify-content: space-around; /* 主轴项目两端对齐,中间分散 */
align-items: center; /* 交叉轴项目居中 */
flex-wrap: wrap; /* 允许项目换行 */
gap: 10px; /* 项目间间距 */
border: 1px dashed #007bff;
padding: 10px;
margin-top: 15px;
}
.flex-item-example {
background-color: #d1ecf1;
padding: 15px;
flex: 1; /* 每个项目平均分配空间并可伸缩 */
min-width: 80px; /* 最小宽度,防止过小 */
text-align: center;
border-radius: 5px;
}
.flex-item-example:nth-child(2) {
order: -1; /* 第二个项目排到最前面 */
flex-grow: 2; /* 第二个项目放大比例是其他项目的两倍 */
}
说明: 项目在主轴上分散对齐,在交叉轴上居中。第二个项目被指定了更小的 order 值,所以它排在了第一位,并且其宽度是其他项目放大后的两倍。
讲解: Grid Layout 是一种强大的二维布局模型,允许你同时控制行和列,将页面划分为更复杂的网格结构。它非常适合整个页面的布局(如头部、侧边栏、主体内容、页脚),以及需要精确对齐的复杂组件。
核心概念:
Grid 容器 (Grid Container): 应用 display: grid; 或 display: inline-grid; 的元素。
Grid 项目 (Grid Item): Grid 容器的直接子元素。
网格线 (Grid Lines): 定义网格结构的分隔线。
网格轨道 (Grid Tracks): 网格线之间的空间,即行或列。
网格单元 (Grid Cells): 单个网格线交叉形成的区域。
网格区域 (Grid Areas): 由多格网格单元组成的矩形区域。
应用于 Grid 容器的属性,控制其内部 Grid 项目的整体布局。
display: grid; / inline-grid;: 定义一个 Grid 容器。grid-template-columns / grid-template-rows: 定义网格的列/行结构和尺寸。
px, %, em, rem。fr (fraction): 弹性单位,表示可用空间的分数。auto: 自动分配空间,根据内容或剩余空间。repeat(count, value): 重复定义列/行。例如 repeat(3, 1fr)。minmax(min, max): 定义最小和最大尺寸范围。例如 minmax(100px, 1fr)。gap (推荐,取代 grid-gap): 定义网格行和列之间的间距。
gap: 10px; (行和列都是 10px)。gap: 10px 20px; (行间距 10px, 列间距 20px)。grid-auto-columns / grid-auto-rows: 定义隐式创建的(未在 grid-template-* 中明确定义的)网格轨道的尺寸。grid-auto-flow: 控制未明确放置的网格项目如何自动排列 (row (默认), column, dense)。justify-items / align-items: 定义网格单元内项目在水平/垂直方向上的默认对齐方式。 (与 Flexbox 的 align-items 类似)。justify-content / align-content: 定义网格整体在容器内的水平/垂直对齐方式。 (与 Flexbox 的 justify-content 类似)。应用于 Grid 项目的属性,控制单个项目在 Grid 容器中的位置和尺寸。
grid-column-start / grid-column-end / grid-row-start / grid-row-end: 定义项目在网格中的起始/结束网格线。
span N (跨越 N 条轨道)。grid-column / grid-row: 复合属性,简写 start / end。grid-area: 命名网格区域,并根据名称定位项目。
grid-template-areas 定义区域名称。grid-area: area-name;。justify-self / align-self: 允许单个 Grid 项目覆盖容器的对齐方式。.grid-container-example {
display: grid;
/* 定义三列:第一列和第三列宽度自适应内容,中间列占据剩余空间的 2 份 */
grid-template-columns: auto 2fr auto;
grid-template-rows: auto 100px; /* 定义两行:第一行自适应,第二行 100px */
gap: 15px; /* 行和列间距 */
border: 1px dashed #28a745;
padding: 10px;
margin-top: 15px;
}
.grid-item-example {
background-color: #d4edda;
padding: 15px;
text-align: center;
border-radius: 5px;
}
/* 第一个项目占据第一行的所有列 */
.grid-item-example:first-child {
grid-column: 1 / span 3; /* 从第一列线开始,跨越 3 列 */
}
/* 第二个项目占据第二行的前两列 */
.grid-item-example:nth-child(2) {
grid-row: 2;
grid-column: 1 / span 2;
background-color: #ffe0b2;
}
/* 第三个项目占据第二行的第三列 */
.grid-item-example:nth-child(3) {
grid-row: 2;
grid-column: 3;
background-color: #bbdefb;
}
说明: 演示了一个简单的网页布局:一个占据全部宽度的头部,接着是两列内容(一个宽一个窄)。
讲解: 媒体查询是实现响应式设计的核心技术。它允许你根据设备的特性(如视口宽度、高度、屏幕方向、分辨率、媒体类型等)应用不同的 CSS 规则,从而使网站在不同设备上都能提供最佳的用户体验。
基本语法: @media mediatype and (mediafeature) { /* CSS rules */ }
mediatype: 媒体类型,如 all (所有), screen (屏幕), print (打印), speech (语音)。mediafeature: 媒体特性,如 width, height, min-width, max-width, orientation (portrait/landscape), resolution 等。and (与), not (非), only (仅限,用于旧浏览器兼容)。/* 小屏幕设备(视口宽度小于或等于 768px) */
@media screen and (max-width: 768px) {
body {
font-size: 14px; /* 减小字体 */
}
.main-nav {
flex-direction: column; /* 导航项垂直排列 */
}
.grid-container-example {
grid-template-columns: 1fr; /* 网格变为单列布局 */
}
}
/* 中等屏幕设备(视口宽度在 769px 到 1024px 之间) */
@media screen and (min-width: 769px) and (max-width: 1024px) {
.container {
padding: 20px 30px; /* 调整内边距 */
}
}
/* 打印样式 */
@media print {
body {
color: black;
background-color: white;
}
nav, footer {
display: none; /* 打印时隐藏导航和页脚 */
}
}
请尝试调整浏览器窗口大小,观察文本大小和布局的变化。
说明: 当视口宽度小于 768px 时,文本会变小,导航栏的选项会垂直排列。
除了上述核心特性,CSS3 还包含许多其他实用模块,它们在特定场景下提供了强大的功能。
讲解: 多列布局允许你将内容像报纸一样分成多列,这对于长篇文本的阅读体验非常有益。浏览器会自动处理内容的流向和列的平衡。
column-count: 指定希望将内容分成多少列。column-width: 指定每列的理想宽度。浏览器会根据这个宽度计算列数。columns: 复合属性,简写 column-width column-count。column-gap: 定义列之间的间距。column-rule: 定义列之间的分隔线(类似于边框)。break-after / break-before / break-inside: 控制内容在列或页面中断时的行为。.multi-column-article {
column-count: 3; /* 将内容分成 3 列 */
column-gap: 30px; /* 列间距 30px */
column-rule: 1px solid #ccc; /* 列之间有 1px 灰色实线 */
background-color: #f0f8ff;
padding: 15px;
border-radius: 5px;
}
/* 也可以只指定宽度,让浏览器计算列数 */
.another-multi-column {
column-width: 200px; /* 每列至少 200px 宽 */
column-gap: 20px;
}
CSS3 多列布局是响应式设计的重要组成部分,它允许开发者将文本内容分割成多列,从而在不同的屏幕尺寸上提供更好的阅读体验。这种布局方式特别适用于报纸、杂志类的内容展示,可以提高文本的横向阅读效率,减少用户滚动页面的频率。
通过简单的 CSS 属性,如 `column-count` 来指定列的数量,`column-gap` 来定义列之间的间距,以及 `column-rule` 来添加分隔线,开发者可以轻松实现复杂的文本排版效果。浏览器会自动处理内容的填充和列的平衡,使得在不同设备上都能保持良好的视觉效果。这在以前通常需要复杂的 JavaScript 或后端处理才能实现。
然而,在使用多列布局时也需要注意一些潜在的问题,例如内容的阅读顺序可能会变得不直观,或者在某些情况下,如果内容不足以填满所有列,可能会出现空白区域。因此,在实际应用中,需要根据具体的内容类型和用户体验目标进行权衡和设计。
说明: 这段文字被分成了两列,中间有灰色分隔线,展示了多列布局的效果。
讲解: @font-face 规则允许你引入自定义字体文件,从而在用户的浏览器中显示特定的字体,而无需用户本地安装。这解决了 Web 字体可用性的限制,让设计师有更大的自由度。
font-family: 定义字体名称。src: 指定字体文件的路径和格式(url() format())。
woff2 (推荐,压缩率高), woff, ttf (TrueType), otf (OpenType), eot (IE 专用)。font-weight / font-style: 定义字体的粗细和样式,用于匹配不同的字体变体。unicode-range: 仅加载特定 Unicode 范围内的字符,用于优化加载性能(例如只加载中文字体中的常用字)。@font-face {
font-family: 'CustomSerif'; /* 自定义字体名称 */
src: url('fonts/CustomSerif-Regular.woff2') format('woff2'),
url('fonts/CustomSerif-Regular.woff') format('woff');
font-weight: normal;
font-style: normal;
/* unicode-range: U+000-5FF; /* 仅加载基本拉丁字符和拉丁补充字符,用于优化 */
}
body {
font-family: 'CustomSerif', serif; /* 优先使用自定义字体,备用衬线字体 */
}
这是使用系统衬线字体渲染的文本。
这是使用系统等宽字体渲染的文本。
如果加载了自定义字体,会显示这里。
说明: 由于没有实际的字体文件路径,上方示例的第三段文字不会实际显示自定义字体。但在实际项目中,通过 @font-face 引入的字体会生效。
讲解: CSS3 引入了更灵活的颜色表示方法,尤其增强了透明度控制,这对于创建叠加效果、半透明背景和阴影至关重要。
RGBA(red, green, blue, alpha):
red, green, blue: 0-255 的整数值。alpha: 透明度,0 (完全透明) 到 1 (完全不透明) 的浮点数。HSLA(hue, saturation, lightness, alpha):
hue (色相): 0-360 度,表示颜色在色轮上的位置 (0/360=红, 120=绿, 240=蓝)。saturation (饱和度): 0-100%,表示颜色的纯度(0% 灰度,100% 纯色)。lightness (亮度): 0-100%,表示颜色的明暗(0% 黑,50% 正常,100% 白)。alpha: 透明度,与 RGBA 相同。.rgba-example {
background-color: rgba(255, 0, 0, 0.5); /* 50% 透明度的红色 */
border: 1px solid red;
}
.hsla-example {
background-color: hsla(240, 100%, 50%, 0.7); /* 70% 透明度的纯蓝色 */
border: 1px solid blue;
}
说明: 在一个灰色背景上,两个半透明的盒子(一个红色一个蓝色)叠加显示,可以看到下方的灰色背景,证明了透明度效果。
calc())讲解: calc() 函数允许你在 CSS 属性值中执行数学计算(加、减、乘、除)。它在响应式布局和动态尺寸计算中非常有用,可以将不同单位的值进行混合运算。
+, -, *, /。.sidebar {
/* 侧边栏宽度等于父容器的 30% 减去 20px 的间距 */
width: calc(30% - 20px);
}
.main-content {
/* 主内容区宽度等于父容器的 70% 减去 20px 的间距 */
width: calc(70% - 20px);
margin-left: 10px;
}
.centered-box {
/* 通过 calc() 实现水平垂直居中定位 */
position: absolute;
top: calc(50% - 50px); /* 50% 减去自身高度一半 */
left: calc(50% - 50px); /* 50% 减去自身宽度一半 */
width: 100px;
height: 100px;
}
calc()) 示例说明: 灰色容器内的绿色盒子,其宽度动态计算为父容器的 100% 减去 40px 的总边距。
讲解: 虽然严格来说是在 CSS Cascading and Inheritance Level 1 中引入,但 CSS 变量(也称为自定义属性)是现代 CSS 工作流不可或缺的一部分,它使得 CSS 更加模块化、可维护和动态。
-- 作为前缀来定义变量,通常在 :root 伪类中定义全局变量,或在特定选择器中定义局部变量。
:root { --main-color: #007bff; }var() 函数来引用变量。
color: var(--main-color);:root {
--primary-color: #007bff;
--secondary-color: #28a745;
--spacing-unit: 15px;
--border-radius-base: 5px;
}
.card {
background-color: var(--primary-color);
color: white;
padding: var(--spacing-unit);
border-radius: var(--border-radius-base);
margin-bottom: var(--spacing-unit);
}
.card.secondary {
background-color: var(--secondary-color);
}
说明: 两个盒子都使用了 CSS 变量定义的颜色、内边距和圆角。第二个盒子通过直接设置背景色覆盖了变量的颜色值。
讲解: CSS3 引入了一些针对表单元素状态的伪类,以及有限地控制表单元素外观的属性。
:checked: 匹配被选中的复选框或单选框。:enabled / :disabled: 匹配启用/禁用的表单元素。:read-only / :read-write: 匹配只读/可写的输入框。:valid / :invalid: 匹配符合/不符合表单验证规则的输入框。:required: 匹配带有 required 属性的输入框。::placeholder (伪元素): 改变输入框占位文本的样式(注意浏览器前缀)。input:checked + label { /* 选中复选框时,改变相邻 label 的样式 */
font-weight: bold;
color: green;
}
input:invalid { /* 输入不符合验证规则时,显示红色边框 */
border: 1px solid red;
}
/* 占位文本的样式,需要浏览器前缀 */
.text-input-placeholder::placeholder {
color: gray;
font-style: italic;
}
.text-input-placeholder::-webkit-input-placeholder { /* Chrome, Safari */
color: gray;
font-style: italic;
}
.text-input-placeholder::-moz-placeholder { /* Firefox */
color: gray;
font-style: italic;
opacity: 1; /* Firefox 默认对 placeholder 文本应用透明度 */
}
.text-input-placeholder:-ms-input-placeholder { /* Internet Explorer */
color: gray;
font-style: italic;
}
说明: 选中复选框时,相邻的文字会变粗变绿。邮箱输入框如果内容不符合邮箱格式,会显示红色边框。第二个文本框的占位符文本显示红色。
CSS3 的出现,彻底改变了前端开发的格局。它从根本上提升了 Web 界面的表现力、交互性和响应能力。从增强的选择器到强大的布局系统(Flexbox 和 Grid),再到精美的视觉效果和动画,CSS3 为开发者提供了前所未有的控制力。
如今,我们所说的"CSS3"中的大部分特性已经成为现代浏览器中的标准,并且得到了广泛支持。开发者不再需要担心浏览器兼容性前缀(除了极少数特定场景,如 ::placeholder 等伪元素),可以放心地使用这些强大的功能。
持续学习 CSS 的新特性和最佳实践,例如逻辑属性、容器查询、层叠层 (Cascade Layers) 等,将帮助你始终走在前端发展的前沿,构建更健壮、更灵活、更具吸引力的 Web 应用。未来,随着 Web Components 和新的 CSS 模块(如 Scroll-driven Animations)的成熟,CSS 的能力还将继续扩展,为我们带来更多可能性。
感谢您的阅读,希望这份深度总结能助您在 CSS 世界中游刃有余!