CSS 教程

纯干货教学,从零开始学习 CSS

CSS Flexbox

学习 CSS 弹性布局(Flexbox)的基本概念、属性和使用方法,掌握现代 CSS 布局技术。

什么是 CSS Flexbox?

CSS Flexbox(弹性布局)是一种一维布局模型,用于在容器中对项目进行灵活的排列和对齐。它可以轻松处理不同屏幕尺寸和设备的布局需求。

Flexbox 基本术语

  • 弹性容器 (Flex Container):应用了 display: flex;display: inline-flex; 的元素。
  • 弹性项目 (Flex Item):弹性容器的直接子元素。
  • 主轴 (Main Axis):弹性项目排列的主要轴线,默认为水平方向。
  • 交叉轴 (Cross Axis):与主轴垂直的轴线,默认为垂直方向。
  • 主轴起点/终点:弹性项目在主轴上的起始和结束位置。
  • 交叉轴起点/终点:弹性项目在交叉轴上的起始和结束位置。
  • 弹性项目尺寸:弹性项目在主轴和交叉轴上的尺寸。
/* 创建一个弹性容器 */
.flex-container { /* 选择器:class 为 flex-container 的元素 */
    display: flex; /* 属性:display,设置为 flex,创建一个块级弹性容器 */
    /* 其他 flex 容器属性,如 flex-direction, justify-content, align-items 等 */
}

/* 弹性项目会自动成为容器的子元素 */
.flex-item { /* 选择器:class 为 flex-item 的元素 */
    /* 其他 flex 项目属性,如 flex-grow, flex-shrink, flex-basis 等 */
}

Flexbox 容器属性

1. display

定义一个弹性容器。

描述
flex 创建一个块级弹性容器。
inline-flex 创建一个内联弹性容器。

2. flex-direction

定义主轴的方向,决定弹性项目的排列方向。

描述
row 默认值,主轴为水平方向,起点在左侧。
row-reverse 主轴为水平方向,起点在右侧。
column 主轴为垂直方向,起点在顶部。
column-reverse 主轴为垂直方向,起点在底部。

3. flex-wrap

定义弹性项目是否换行。

描述
nowrap 默认值,不换行,弹性项目会缩小以适应容器。
wrap 换行,第一行在顶部。
wrap-reverse 换行,第一行在底部。

4. flex-flow

flex-directionflex-wrap 的简写属性。

语法 描述
flex-flow: <flex-direction> <flex-wrap> 默认值为 row nowrap。

5. justify-content

定义弹性项目在主轴上的对齐方式。

描述
flex-start 默认值,弹性项目从主轴起点对齐。
flex-end 弹性项目从主轴终点对齐。
center 弹性项目在主轴上居中对齐。
space-between 弹性项目之间均匀分布,首尾项目贴近容器边缘。
space-around 弹性项目之间均匀分布,首尾项目距离容器边缘有一半间距。
space-evenly 弹性项目之间和与容器边缘之间都均匀分布。

6. align-items

定义弹性项目在交叉轴上的对齐方式。

描述
stretch 默认值,弹性项目拉伸以填充容器。
flex-start 弹性项目从交叉轴起点对齐。
flex-end 弹性项目从交叉轴终点对齐。
center 弹性项目在交叉轴上居中对齐。
baseline 弹性项目按基线对齐。

7. align-content

定义多根轴线(多行)在交叉轴上的对齐方式,仅在弹性项目换行时有效。

描述
stretch 默认值,轴线拉伸以填充容器。
flex-start 轴线从交叉轴起点对齐。
flex-end 轴线从交叉轴终点对齐。
center 轴线在交叉轴上居中对齐。
space-between 轴线之间均匀分布,首尾轴线贴近容器边缘。
space-around 轴线之间均匀分布,首尾轴线距离容器边缘有一半间距。
space-evenly 轴线之间和与容器边缘之间都均匀分布。

Flexbox 项目属性

1. order

定义弹性项目的排列顺序,数值越小,排列越靠前。

描述
number 默认值为 0,可以是负数。

2. flex-grow

定义弹性项目的放大比例,默认为 0,即不放大。

描述
number 默认值为 0,表示不放大。如果所有项目的 flex-grow 都为 1,则它们将平均分配剩余空间。

3. flex-shrink

定义弹性项目的缩小比例,默认为 1,即当空间不足时会缩小。

描述
number 默认值为 1,表示空间不足时会缩小。如果设置为 0,则空间不足时不会缩小。

4. flex-basis

定义弹性项目在主轴上的初始尺寸。

描述
length 指定具体的长度值,如 px、em、% 等。
auto 默认值,弹性项目的初始尺寸由其内容决定。

5. flex

flex-growflex-shrinkflex-basis 的简写属性。

描述
none 等同于 0 0 auto,表示不放大也不缩小。
auto 等同于 1 1 auto,表示会放大也会缩小。
1 等同于 1 1 0,表示会放大也会缩小,初始尺寸为 0。
<flex-grow> <flex-shrink> <flex-basis> 完整的简写形式。

6. align-self

定义单个弹性项目在交叉轴上的对齐方式,覆盖容器的 align-items 属性。

描述
auto 默认值,继承容器的 align-items 值。
stretch 弹性项目拉伸以填充容器。
flex-start 弹性项目从交叉轴起点对齐。
flex-end 弹性项目从交叉轴终点对齐。
center 弹性项目在交叉轴上居中对齐。
baseline 弹性项目按基线对齐。

Flexbox 实际应用示例

示例 1:水平居中

<div class="container"> 
    <div class="item">居中内容</div> 
</div> 

<style> 
.container { /* 选择器:class 为 container 的元素 */
    display: flex; /* 属性:display,设置为 flex,创建一个块级弹性容器 */
    justify-content: center; /* 属性:justify-content,设置弹性项目在主轴上居中对齐 */
    align-items: center; /* 属性:align-items,设置弹性项目在交叉轴上居中对齐 */
    height: 200px; /* 属性:height,设置容器高度为 200 像素 */
    background-color: #f0f0f0; /* 属性:background-color,设置背景颜色为浅灰色 */
}

.item { /* 选择器:class 为 item 的元素 */
    padding: 20px; /* 属性:padding,设置内边距为 20 像素(四个方向) */
    background-color: #e0f7fa; /* 属性:background-color,设置背景颜色为浅蓝色 */
    border-radius: 4px; /* 属性:border-radius,设置圆角为 4 像素 */
}
</style> 

示例 2:导航菜单

<nav class="navbar"> 
    <div class="logo">Logo</div> 
    <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> 

<style> 
.navbar { /* 选择器:class 为 navbar 的元素 */
    display: flex; /* 属性:display,设置为 flex,创建一个块级弹性容器 */
    justify-content: space-between; /* 属性:justify-content,设置弹性项目在主轴上两端对齐,中间留白 */
    align-items: center; /* 属性:align-items,设置弹性项目在交叉轴上居中对齐 */
    padding: 10px 20px; /* 属性:padding,设置内边距:上下 10 像素,左右 20 像素 */
    background-color: #333; /* 属性:background-color,设置背景颜色为深灰色 */
    color: white; /* 属性:color,设置文本颜色为白色 */
}

.nav-links { /* 选择器:class 为 nav-links 的元素 */
    display: flex; /* 属性:display,设置为 flex,创建一个块级弹性容器 */
    list-style: none; /* 属性:list-style,设置列表样式为无(移除默认项目符号) */
    gap: 20px; /* 属性:gap,设置弹性项目之间的间距为 20 像素 */
}

.nav-links a { /* 选择器:nav-links 内的 a 元素 */
    color: white; /* 属性:color,设置文本颜色为白色 */
    text-decoration: none; /* 属性:text-decoration,设置文本装饰为无(移除默认下划线) */
}
</style> 

示例 3:卡片布局

<div class="card-container"> 
    <div class="card">卡片 1</div> 
    <div class="card">卡片 2</div> 
    <div class="card">卡片 3</div> 
    <div class="card">卡片 4</div> 
</div> 

<style> 
.card-container { /* 选择器:class 为 card-container 的元素 */
    display: flex; /* 属性:display,设置为 flex,创建一个块级弹性容器 */
    flex-wrap: wrap; /* 属性:flex-wrap,设置弹性项目在容器空间不足时换行 */
    gap: 20px; /* 属性:gap,设置弹性项目之间的间距为 20 像素 */
    padding: 20px; /* 属性:padding,设置内边距为 20 像素(四个方向) */
}

.card { /* 选择器:class 为 card 的元素 */
    flex: 1 1 200px; /* 属性:flex,设置为 1 1 200px,表示会放大也会缩小,初始尺寸为 200 像素 */
    padding: 20px; /* 属性:padding,设置内边距为 20 像素(四个方向) */
    background-color: #f0f0f0; /* 属性:background-color,设置背景颜色为浅灰色 */
    border-radius: 4px; /* 属性:border-radius,设置圆角为 4 像素 */
    text-align: center; /* 属性:text-align,设置文本对齐方式为居中 */
}
</style> 

示例 4:圣杯布局

<div class="holy-grail"> 
    <header>头部</header> 
    <main class="content"> 
        <aside class="left-sidebar">左侧边栏</aside> 
        <section class="main-content">主内容</section> 
        <aside class="right-sidebar">右侧边栏</aside> 
    </main> 
    <footer>底部</footer> 
</div> 

<style> 
.holy-grail { /* 选择器:class 为 holy-grail 的元素 */
    display: flex; /* 属性:display,设置为 flex,创建一个块级弹性容器 */
    flex-direction: column; /* 属性:flex-direction,设置主轴为垂直方向,弹性项目垂直排列 */
    min-height: 100vh; /* 属性:min-height,设置最小高度为 100 视口高度,确保占满整个屏幕 */
}

header, footer { /* 选择器:header 和 footer 元素 */
    padding: 20px; /* 属性:padding,设置内边距为 20 像素(四个方向) */
    background-color: #333; /* 属性:background-color,设置背景颜色为深灰色 */
    color: white; /* 属性:color,设置文本颜色为白色 */
}

.content { /* 选择器:class 为 content 的元素 */
    display: flex; /* 属性:display,设置为 flex,创建一个块级弹性容器 */
    flex: 1; /* 属性:flex,设置为 1,使主内容区域占据剩余空间 */
}

.left-sidebar, .right-sidebar { /* 选择器:class 为 left-sidebar 和 right-sidebar 的元素 */
    flex: 0 0 200px; /* 属性:flex,设置为 0 0 200px,表示不放大也不缩小,固定宽度为 200 像素 */
    background-color: #f0f0f0; /* 属性:background-color,设置背景颜色为浅灰色 */
    padding: 20px; /* 属性:padding,设置内边距为 20 像素(四个方向) */
}

.main-content { /* 选择器:class 为 main-content 的元素 */
    flex: 1; /* 属性:flex,设置为 1,使主内容区域占据剩余空间 */
    padding: 20px; /* 属性:padding,设置内边距为 20 像素(四个方向) */
    background-color: #ffffff; /* 属性:background-color,设置背景颜色为白色 */
}
</style> 

Flexbox 使用技巧

  • 一维布局优先使用 Flexbox:Flexbox 适用于一维布局(水平或垂直),而 Grid 适用于二维布局。
  • 合理使用简写属性:使用 flex 简写属性可以简化代码。
  • 注意浏览器兼容性:虽然现代浏览器都支持 Flexbox,但在处理旧浏览器时需要考虑兼容性。
  • 避免过度使用:对于简单的布局,使用传统的布局方法可能更加高效。
  • 结合媒体查询:Flexbox 可以与媒体查询结合使用,创建响应式布局。
  • 使用 gap 属性:在弹性容器上使用 gap 属性可以方便地设置项目之间的间距。

Flexbox 总结

  • Flexbox 是一种一维布局模型,用于在容器中对项目进行灵活的排列和对齐。
  • 弹性容器通过 display: flex;display: inline-flex; 创建。
  • Flexbox 容器属性控制整个容器的布局方式,如主轴方向、对齐方式等。
  • Flexbox 项目属性控制单个项目的行为,如放大缩小比例、排列顺序等。
  • Flexbox 可以轻松实现水平居中、垂直居中、等宽布局等常见布局需求。
  • Flexbox 是现代 CSS 布局的重要工具,掌握它可以大大提高布局效率。