CSS3 布局与交互动效综合总结
1. Display 显示模式
Display属性控制元素的显示类型,是CSS布局的基础,决定了元素如何在页面中排列和占用空间。
主要显示模式
-
block
- 独占一行空间
- 可设置宽高、内外边距
- 默认宽度为父容器100%
- 常见元素:div, p, h1-h6
-
inline
- 水平排列,不独占一行
- 不可设置宽高
- 宽高由内容决定
- 常见元素:span, a, strong
-
inline-block
- 水平排列,兼具块级特性
- 可设置宽高、内外边距
- 元素间有默认间距
- 适合:导航项、按钮组
-
none
- 元素完全隐藏
- 不占用页面空间
- 不同于visibility: hidden
- 常用于条件显示/隐藏
代码示例
css
/* Display 属性示例 */
.block-example {
display: block;
width: 200px;
height: 50px;
background-color: #4CAF50;
}
.inline-example {
display: inline;
/* 宽高设置无效 */
background-color: #2196F3;
}
.inline-block-example {
display: inline-block;
width: 100px;
height: 40px;
background-color: #FF9800;
}
.none-example {
display: none;
}
/* 弹性容器 */
.flex-container {
display: flex;
}
/* 网格容器 */
.grid-container {
display: grid;
}
2. Float 浮动布局
Float属性使元素脱离正常文档流,允许文字和其他元素环绕它,常用于图文混排和多列布局。
浮动布局特点:
- 元素会向左或向右移动,直到碰到父容器边缘或另一个浮动元素
- 元素脱离普通文档流,但不脱离文本流
- 父容器可能发生高度坍塌,需要清除浮动
- 现代布局中逐渐被Flexbox和Grid替代,但仍用于特定场景
代码示例
css
/* Float 基本属性 */
.float-left {
float: left;
width: 190px;
height: 200px;
}
.float-right {
float: right;
}
.float-none {
float: none;
}
/* 清除浮动的方法 */
/* 1. 伪元素清除法 */
.clearfix::after {
content: "";
clear: both;
display: table;
}
/* 2. 给父元素设置overflow属性 */
.parent-container {
overflow: hidden; /* 或 auto */
}
3. Position 定位布局
Position属性定义了元素在页面中的定位方式,是创建复杂布局、覆盖元素和固定元素位置的重要工具。
主要定位方式
-
static
- 默认定位方式
- 遵循正常文档流
- top, right, bottom, left属性无效
- 不能通过z-index调整层级
-
relative
- 相对于自身正常位置定位
- 保留原位置空间
- 可通过top, right等属性偏移
- 常用作绝对定位元素的容器
-
absolute
- 相对于最近的定位祖先元素
- 脱离正常文档流
- 不保留原位置空间
- 定位参考点是包含块的padding-box
-
fixed
- 相对于视口定位
- 脱离文档流
- 滚动时位置固定不变
- 常用于导航栏和浮动按钮
-
sticky
- 混合relative和fixed定位
- 在正常流中滚动,达到阈值时固定
- 需要设置阈值(top, bottom等)
- 常用于列表标题和滚动指示器
代码示例
css
/* Position 定位示例 */
.static {
position: static;
}
.relative {
position: relative;
top: 10px;
left: 20px;
}
.relative-container {
position: relative;
width: 300px;
height: 200px;
background-color: #f0f0f0;
}
.absolute {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.fixed {
position: fixed;
top: 0;
right: 0;
}
.sticky {
position: sticky;
top: 20px;
}
.fixed-header {
position: fixed;
top: 0;
left: 0;
right: 0;
background-color: #333;
color: white;
z-index: 1000;
}
4. Flexbox 弹性盒子布局
Flexbox是一种一维布局模型,设计用于轻松地分配容器内元素的空间并处理对齐,特别适合处理不同屏幕尺寸和不同方向的布局需求。
Flexbox核心概念:
- 弹性容器(Flex Container):设置display: flex的父元素
- 弹性项目(Flex Items):容器内的直接子元素
- 主轴(Main Axis):项目排列的主要方向,由flex-direction决定
- 交叉轴(Cross Axis):与主轴垂直的方向
主要属性
容器属性
flex-direction:主轴方向(row/row-reverse/column/column-reverse)justify-content:主轴对齐(flex-start/center/flex-end/space-between/space-around)align-items:交叉轴对齐(stretch/flex-start/center/flex-end/baseline)flex-wrap:是否换行(nowrap/wrap/wrap-reverse)align-content:多轴线对齐(stretch/flex-start/center/flex-end/space-between/space-around)
项目属性
flex-grow:项目的放大比例,默认为0flex-shrink:项目的缩小比例,默认为1flex-basis:项目的基准值,默认为autoflex:grow、shrink、basis的简写order:项目的排列顺序,默认为0align-self:单个项目的对齐方式,覆盖align-items
代码示例
css
/* 弹性容器基础设置 */
.flex-container {
display: flex;
/* 主轴方向 */
flex-direction: row; /* row, row-reverse, column, column-reverse */
/* 是否换行 */
flex-wrap: wrap; /* nowrap, wrap, wrap-reverse */
/* 主轴对齐方式 */
justify-content: center; /* flex-start, flex-end, center, space-between, space-around */
/* 交叉轴对齐方式 */
align-items: center; /* stretch, flex-start, flex-end, center, baseline */
/* 多行对齐方式 */
align-content: space-between; /* stretch, flex-start, flex-end, center, space-between, space-around */
}
/* 弹性项目设置 */
.flex-item {
/* 项目放大比例 */
flex-grow: 1;
/* 项目缩小比例 */
flex-shrink: 1;
/* 项目基础尺寸 */
flex-basis: 200px;
/* 简写 */
flex: 1 1 200px;
/* 项目排列顺序 */
order: 0;
/* 单个项目对齐方式 */
align-self: auto;
}
/* 实际应用示例 */
.equal-height-cards {
display: flex;
}
.centered-content {
display: flex;
justify-content: center;
align-items: center;
height: 300px;
}
.nav-container {
display: flex;
justify-content: space-between;
}
.flex-responsive {
display: flex;
flex-wrap: wrap;
}
.flex-responsive > div {
flex: 1 1 300px;
}
5. Grid 网格布局
Grid布局是一个二维布局系统,允许我们同时在行和列两个维度上精确控制元素的排列,是CSS中最强大的布局工具。
Grid核心概念:
- 网格容器(Grid Container):设置display: grid的父元素
- 网格项(Grid Items):容器内的直接子元素
- 网格线(Grid Lines):划分行和列的线,从1开始编号
- 网格轨道(Grid Tracks):两条相邻网格线之间的空间(行或列)
- 网格单元格(Grid Cell):由行和列交叉形成的最小空间单元
- 网格区域(Grid Area):由一个或多个单元格组成的矩形区域
主要属性
容器属性
grid-template-columns:定义网格的列轨道grid-template-rows:定义网格的行轨道grid-template-areas:定义命名的网格区域gap:设置网格项之间的间距grid-auto-columns:隐式网格的列大小grid-auto-rows:隐式网格的行大小grid-auto-flow:控制自动放置项目的方式justify-items:单元格内的水平对齐align-items:单元格内的垂直对齐
项目属性
grid-column-start:项目开始的列线grid-column-end:项目结束的列线grid-row-start:项目开始的行线grid-row-end:项目结束的行线grid-column:列起始和结束的简写grid-row:行起始和结束的简写grid-area:指定项目的网格区域justify-self:单个项目的水平对齐align-self:单个项目的垂直对齐
代码示例
css
/* 网格容器基础设置 */
.grid-container {
display: grid;
/* 定义列 */
grid-template-columns: repeat(3, 1fr);
/* 定义行 */
grid-template-rows: 100px 1fr 80px;
/* 网格间距 */
gap: 10px;
/* 网格区域命名 */
grid-template-areas:
"header header header"
"sidebar main main"
"footer footer footer";
}
/* 网格项目设置 */
.header {
grid-area: header;
}
.sidebar {
grid-area: sidebar;
}
.main {
grid-area: main;
}
.footer {
grid-area: footer;
}
/* 网格线定位 */
.grid-item {
grid-column: 1 / 3; /* 从第1列到第3列 */
grid-row: 2 / 4; /* 从第2行到第4行 */
}
/* 响应式网格 */
.responsive-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
}
/* 复杂布局 */
.complex-layout {
display: grid;
grid-template-columns: 1fr 3fr;
grid-template-rows: auto 1fr auto;
grid-template-areas:
"header header"
"sidebar content"
"footer footer";
height: 100vh;
}
6. 2D/3D 变换
Transform 属性允许我们对元素进行旋转、缩放、平移和倾斜等变换操作,可以创建丰富的视觉效果,让页面更加生动。
变换基本概念:
- 2D变换:在平面上进行变换,包括平移、旋转、缩放和倾斜
- 3D变换:在三维空间中进行变换,需要设置透视效果才能正确显示
- 变换原点:所有变换的参考点,默认为元素中心点
- 组合变换:可以将多个变换操作组合在一起,按顺序执行
主要变换属性
2D 变换属性
translate(x, y):平移元素,可使用像素或百分比translateX(x):仅在X轴方向平移translateY(y):仅在Y轴方向平移scale(x, y):缩放元素,值大于1放大,小于1缩小scaleX(x):仅在X轴方向缩放scaleY(y):仅在Y轴方向缩放rotate(angle):旋转元素,正值顺时针,负值逆时针skew(x-angle, y-angle):倾斜元素,沿X和Y轴skewX(angle):仅沿X轴倾斜skewY(angle):仅沿Y轴倾斜transform-origin:设置变换原点
3D 变换属性
translate3d(x, y, z):在三维空间中平移translateZ(z):仅在Z轴方向平移scale3d(x, y, z):在三维空间中缩放scaleZ(z):仅在Z轴方向缩放rotate3d(x, y, z, angle):沿任意轴旋转rotateX(angle):沿X轴旋转(俯仰)rotateY(angle):沿Y轴旋转(偏航)rotateZ(angle):沿Z轴旋转(滚动)perspective:设置透视效果,创建3D空间感transform-style: preserve-3d:保持子元素的3D效果backface-visibility:控制元素背面是否可见
代码示例
css
/* 2D 变换 */
.transform-2d {
/* 平移 */
transform: translate(50px, 20px);
/* 缩放 */
transform: scale(1.5, 1.2);
/* 旋转 */
transform: rotate(45deg);
/* 倾斜 */
transform: skew(20deg, 10deg);
/* 组合变换 */
transform: translate(50px, 20px) rotate(45deg) scale(1.2);
/* 设置变换原点 */
transform-origin: top left;
}
/* 3D 变换 */
.transform-3d {
/* 3D 平移 */
transform: translate3d(50px, 20px, 100px);
/* 3D 旋转 */
transform: rotateY(180deg);
/* 3D 缩放 */
transform: scale3d(1.5, 1.5, 2);
/* 沿X轴旋转 */
transform: rotateX(45deg);
/* 沿自定义轴旋转 */
transform: rotate3d(1, 1, 1, 45deg);
}
/* 3D 场景设置 */
.scene {
perspective: 1000px; /* 透视距离 */
}
.three-d {
transform-style: preserve-3d; /* 保持3D效果 */
backface-visibility: hidden; /* 隐藏背面 */
transition: transform 0.5s ease;
}
/* 卡片翻转效果 */
.card {
position: relative;
width: 200px;
height: 300px;
transition: transform 0.6s;
transform-style: preserve-3d;
}
.card:hover {
transform: rotateY(180deg);
}
.card-front, .card-back {
position: absolute;
width: 100%;
height: 100%;
backface-visibility: hidden;
}
.card-back {
transform: rotateY(180deg);
}
7. Animation 动画
Animation 属性允许我们创建复杂的动画效果,通过定义关键帧来精确控制动画的各个阶段,实现比过渡效果更丰富的交互体验。
动画基本概念:
- 关键帧(Keyframes):定义动画在不同时间点的状态
- 动画属性:控制动画的持续时间、延迟、次数、方向等
- 动画事件:可以通过JavaScript监听动画的开始、结束和重复事件
- 性能优化:使用transform和opacity属性触发硬件加速,提高动画性能
主要动画属性
animation-name:指定要绑定到元素的关键帧名称animation-duration:动画完成一个周期所花费的秒或毫秒animation-timing-function:动画的速度曲线(ease, linear, ease-in, ease-out, ease-in-out, cubic-bezier(n,n,n,n))animation-delay:动画开始前的延迟时间animation-iteration-count:动画播放次数(n, infinite)animation-direction:动画是否在下一周期逆向播放(normal, reverse, alternate, alternate-reverse)animation-fill-mode:动画结束后保持的状态(none, forwards, backwards, both)animation-play-state:控制动画的播放状态(running, paused)animation:所有动画属性的简写
代码示例
css
/* 定义关键帧 */
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes pulse {
0% {
transform: scale(1);
}
50% {
transform: scale(1.05);
}
100% {
transform: scale(1);
}
}
/* 应用动画 */
.animated-element {
/* 基本动画设置 */
animation-name: fadeIn;
animation-duration: 1s;
animation-timing-function: ease-out;
animation-delay: 0.5s;
animation-iteration-count: 1;
animation-direction: normal;
animation-fill-mode: forwards;
/* 简写形式 */
animation: fadeIn 1s ease-out 0.5s 1 normal forwards;
}
/* 无限动画 */
.pulse-button {
animation: pulse 2s ease-in-out infinite;
}
/* 多阶段动画 */
@keyframes complexAnimation {
0% {
transform: translateX(0) rotate(0deg);
background-color: #3498db;
}
30% {
transform: translateX(100px) rotate(180deg);
background-color: #e74c3c;
}
70% {
transform: translateX(200px) rotate(180deg);
background-color: #2ecc71;
}
100% {
transform: translateX(300px) rotate(360deg);
background-color: #3498db;
}
}
.complex-animated {
animation: complexAnimation 4s ease-in-out infinite alternate;
}
动画事件
可以通过JavaScript监听动画事件:
javascript
const element = document.querySelector('.animated-element');
element.addEventListener('animationstart', () => {
console.log('动画开始');
});
element.addEventListener('animationend', () => {
console.log('动画结束');
});
element.addEventListener('animationiteration', () => {
console.log('动画重复');
});