CSS布局技术

CSS布局概述

CSS布局技术是网页设计的核心,决定了元素在页面中的位置和排列方式。从传统的浮动布局到现代的Flexbox和Grid,布局技术不断演进。

东巴文(db-w.cn) 认为:掌握CSS布局技术是前端开发的基础,合理选择布局方式能大幅提升开发效率。

display属性

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>display属性示例</title>
    
    <style>
        body {
            font-family: 'Segoe UI', sans-serif;
            padding: 20px;
            background: #f5f5f5;
        }
        
        .container {
            max-width: 800px;
            margin: 0 auto;
            background: white;
            padding: 30px;
            border-radius: 10px;
        }
        
        h1 {
            color: #667eea;
            margin-bottom: 20px;
        }
        
        h2 {
            color: #764ba2;
            margin: 30px 0 15px;
            border-left: 4px solid #764ba2;
            padding-left: 15px;
        }
        
        /* display示例 */
        
        /* block */
        .block-demo {
            display: block;
            background: #e3f2fd;
            border: 2px solid #2196f3;
            padding: 15px;
            margin-bottom: 10px;
        }
        
        /* inline */
        .inline-demo {
            display: inline;
            background: #f3e5f5;
            border: 2px solid #9c27b0;
            padding: 5px;
        }
        
        /* inline-block */
        .inline-block-demo {
            display: inline-block;
            background: #e8f5e9;
            border: 2px solid #4caf50;
            padding: 15px;
            margin: 5px;
            width: 150px;
        }
        
        /* none */
        .none-demo {
            display: none;
            background: #fff3cd;
            border: 2px solid #ffc107;
            padding: 15px;
        }
        
        /* flex */
        .flex-demo {
            display: flex;
            background: #ffebee;
            border: 2px solid #f44336;
            padding: 15px;
            gap: 10px;
        }
        
        .flex-demo .item {
            background: #f44336;
            color: white;
            padding: 10px;
            flex: 1;
            text-align: center;
        }
        
        /* grid */
        .grid-demo {
            display: grid;
            grid-template-columns: repeat(3, 1fr);
            gap: 10px;
            background: #e0f2f1;
            border: 2px solid #009688;
            padding: 15px;
        }
        
        .grid-demo .item {
            background: #009688;
            color: white;
            padding: 10px;
            text-align: center;
        }
        
        /* 示例容器 */
        .demo-container {
            background: #f8f9fa;
            padding: 15px;
            border-radius: 5px;
            margin: 15px 0;
        }
        
        /* 代码块 */
        .code-block {
            background: #f8f9fa;
            padding: 15px;
            border-radius: 5px;
            border-left: 3px solid #667eea;
            margin: 10px 0;
            font-family: 'Courier New', monospace;
        }
        
        /* 表格 */
        .info-table {
            width: 100%;
            border-collapse: collapse;
            margin: 20px 0;
        }
        
        .info-table th,
        .info-table td {
            padding: 12px;
            text-align: left;
            border: 1px solid #ddd;
        }
        
        .info-table th {
            background: #667eea;
            color: white;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>display属性</h1>
        
        <h2>block(块级元素)</h2>
        <p>独占一行,可设置宽高、内外边距。</p>
        
        <div class="demo-container">
            <div class="block-demo">块级元素 1</div>
            <div class="block-demo">块级元素 2</div>
        </div>
        
        <div class="code-block">
            display: block;
        </div>
        
        <h2>inline(行内元素)</h2>
        <p>不独占一行,不能设置宽高,只能设置水平方向的内外边距。</p>
        
        <div class="demo-container">
            <span class="inline-demo">行内元素 1</span>
            <span class="inline-demo">行内元素 2</span>
            <span class="inline-demo">行内元素 3</span>
        </div>
        
        <div class="code-block">
            display: inline;
        </div>
        
        <h2>inline-block(行内块元素)</h2>
        <p>不独占一行,但可以设置宽高和内外边距。</p>
        
        <div class="demo-container">
            <div class="inline-block-demo">行内块 1</div>
            <div class="inline-block-demo">行内块 2</div>
            <div class="inline-block-demo">行内块 3</div>
        </div>
        
        <div class="code-block">
            display: inline-block;
        </div>
        
        <h2>none(隐藏元素)</h2>
        <p>元素不显示,不占据空间。</p>
        
        <div class="demo-container">
            <div class="block-demo">可见元素</div>
            <div class="none-demo">隐藏元素(不可见)</div>
            <div class="block-demo">可见元素</div>
        </div>
        
        <div class="code-block">
            display: none;
        </div>
        
        <h2>flex(弹性布局)</h2>
        <p>现代布局方式,灵活强大。</p>
        
        <div class="demo-container">
            <div class="flex-demo">
                <div class="item">项目 1</div>
                <div class="item">项目 2</div>
                <div class="item">项目 3</div>
            </div>
        </div>
        
        <div class="code-block">
            display: flex;
        </div>
        
        <h2>grid(网格布局)</h2>
        <p>二维布局系统,适合复杂布局。</p>
        
        <div class="demo-container">
            <div class="grid-demo">
                <div class="item">1</div>
                <div class="item">2</div>
                <div class="item">3</div>
                <div class="item">4</div>
                <div class="item">5</div>
                <div class="item">6</div>
            </div>
        </div>
        
        <div class="code-block">
            display: grid;<br>
            grid-template-columns: repeat(3, 1fr);
        </div>
        
        <h2>display属性对比</h2>
        <table class="info-table">
            <thead>
                <tr>
                    <th>属性值</th>
                    <th>是否独占一行</th>
                    <th>可否设置宽高</th>
                    <th>典型元素</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>block</td>
                    <td></td>
                    <td>可以</td>
                    <td>div, p, h1-h6</td>
                </tr>
                <tr>
                    <td>inline</td>
                    <td></td>
                    <td>不可以</td>
                    <td>span, a, strong</td>
                </tr>
                <tr>
                    <td>inline-block</td>
                    <td></td>
                    <td>可以</td>
                    <td>img, button</td>
                </tr>
                <tr>
                    <td>none</td>
                    <td>不显示</td>
                    <td>-</td>
                    <td>-</td>
                </tr>
                <tr>
                    <td>flex</td>
                    <td></td>
                    <td>可以</td>
                    <td>-</td>
                </tr>
                <tr>
                    <td>grid</td>
                    <td></td>
                    <td>可以</td>
                    <td>-</td>
                </tr>
            </tbody>
        </table>
    </div>
</body>
</html>

浮动布局

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>浮动布局示例</title>
    
    <style>
        body {
            font-family: 'Segoe UI', sans-serif;
            padding: 20px;
            background: #f5f5f5;
        }
        
        .container {
            max-width: 800px;
            margin: 0 auto;
            background: white;
            padding: 30px;
            border-radius: 10px;
        }
        
        h1 {
            color: #667eea;
            margin-bottom: 20px;
        }
        
        h2 {
            color: #764ba2;
            margin: 30px 0 15px;
            border-left: 4px solid #764ba2;
            padding-left: 15px;
        }
        
        /* 浮动示例 */
        
        /* 基本浮动 */
        .float-left {
            float: left;
            width: 200px;
            height: 150px;
            background: #e3f2fd;
            border: 2px solid #2196f3;
            padding: 15px;
            margin-right: 15px;
        }
        
        .float-right {
            float: right;
            width: 200px;
            height: 150px;
            background: #f3e5f5;
            border: 2px solid #9c27b0;
            padding: 15px;
            margin-left: 15px;
        }
        
        /* 清除浮动 */
        .clearfix::after {
            content: "";
            display: table;
            clear: both;
        }
        
        /* 多列布局 */
        .column {
            float: left;
            width: 33.333%;
            padding: 15px;
            box-sizing: border-box;
        }
        
        .column-box {
            background: #e8f5e9;
            border: 2px solid #4caf50;
            padding: 20px;
            height: 200px;
        }
        
        /* 图文环绕 */
        .image-float {
            float: left;
            width: 150px;
            height: 100px;
            background: #fff3cd;
            border: 2px solid #ffc107;
            margin: 0 15px 10px 0;
        }
        
        /* 导航菜单 */
        .nav {
            background: #667eea;
            padding: 0;
            list-style: none;
        }
        
        .nav li {
            float: left;
        }
        
        .nav li a {
            display: block;
            color: white;
            text-decoration: none;
            padding: 15px 20px;
        }
        
        .nav li a:hover {
            background: #764ba2;
        }
        
        /* 代码块 */
        .code-block {
            background: #f8f9fa;
            padding: 15px;
            border-radius: 5px;
            border-left: 3px solid #667eea;
            margin: 10px 0;
            font-family: 'Courier New', monospace;
        }
        
        /* 表格 */
        .info-table {
            width: 100%;
            border-collapse: collapse;
            margin: 20px 0;
        }
        
        .info-table th,
        .info-table td {
            padding: 12px;
            text-align: left;
            border: 1px solid #ddd;
        }
        
        .info-table th {
            background: #667eea;
            color: white;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>浮动布局</h1>
        
        <h2>基本浮动</h2>
        
        <h3>左浮动</h3>
        <div class="clearfix">
            <div class="float-left">
                左浮动元素
            </div>
            <p>这是文本内容,会环绕在浮动元素周围。浮动元素脱离文档流,但仍会影响文本排列。</p>
        </div>
        
        <div class="code-block">
            float: left;
        </div>
        
        <h3>右浮动</h3>
        <div class="clearfix">
            <div class="float-right">
                右浮动元素
            </div>
            <p>这是文本内容,会环绕在浮动元素周围。浮动元素脱离文档流,但仍会影响文本排列。</p>
        </div>
        
        <div class="code-block">
            float: right;
        </div>
        
        <h2>清除浮动</h2>
        <p>浮动元素会导致父容器高度塌陷,需要清除浮动。</p>
        
        <div class="code-block">
            /* 方法1:clearfix */<br>
            .clearfix::after {<br>
            &nbsp;&nbsp;content: "";<br>
            &nbsp;&nbsp;display: table;<br>
            &nbsp;&nbsp;clear: both;<br>
            }<br><br>
            /* 方法2:overflow */<br>
            .parent {<br>
            &nbsp;&nbsp;overflow: hidden;<br>
            }
        </div>
        
        <h2>多列布局</h2>
        <div class="clearfix">
            <div class="column">
                <div class="column-box">
                    <h3>第一列</h3>
                    <p>列内容</p>
                </div>
            </div>
            <div class="column">
                <div class="column-box">
                    <h3>第二列</h3>
                    <p>列内容</p>
                </div>
            </div>
            <div class="column">
                <div class="column-box">
                    <h3>第三列</h3>
                    <p>列内容</p>
                </div>
            </div>
        </div>
        
        <h2>图文环绕</h2>
        <div class="clearfix">
            <div class="image-float">图片区域</div>
            <p>这是一段很长的文本内容,用于演示图文环绕效果。图片浮动在左侧,文本会自动环绕在图片周围。这是传统的图文排版方式,在新闻网站和博客中经常使用。</p>
        </div>
        
        <h2>导航菜单</h2>
        <ul class="nav clearfix">
            <li><a href="#">首页</a></li>
            <li><a href="#">产品</a></li>
            <li><a href="#">服务</a></li>
            <li><a href="#">关于</a></li>
            <li><a href="#">联系</a></li>
        </ul>
        
        <h2>浮动属性说明</h2>
        <table class="info-table">
            <thead>
                <tr>
                    <th>属性值</th>
                    <th>说明</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>left</td>
                    <td>元素向左浮动</td>
                </tr>
                <tr>
                    <td>right</td>
                    <td>元素向右浮动</td>
                </tr>
                <tr>
                    <td>none</td>
                    <td>不浮动(默认)</td>
                </tr>
                <tr>
                    <td>inherit</td>
                    <td>继承父元素的浮动属性</td>
                </tr>
            </tbody>
        </table>
        
        <div style="background: #fff3cd; padding: 15px; border-radius: 5px; margin-top: 20px;">
            <strong>东巴文提示:</strong>浮动布局是传统布局方式,现代布局推荐使用Flexbox和Grid。
        </div>
    </div>
</body>
</html>

Flexbox布局

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Flexbox布局示例</title>
    
    <style>
        body {
            font-family: 'Segoe UI', sans-serif;
            padding: 20px;
            background: #f5f5f5;
        }
        
        .container {
            max-width: 800px;
            margin: 0 auto;
            background: white;
            padding: 30px;
            border-radius: 10px;
        }
        
        h1 {
            color: #667eea;
            margin-bottom: 20px;
        }
        
        h2 {
            color: #764ba2;
            margin: 30px 0 15px;
            border-left: 4px solid #764ba2;
            padding-left: 15px;
        }
        
        /* Flexbox示例 */
        
        /* 基本容器 */
        .flex-container {
            display: flex;
            background: #f8f9fa;
            padding: 15px;
            border: 2px solid #ddd;
            margin-bottom: 20px;
            gap: 10px;
        }
        
        .flex-item {
            background: #667eea;
            color: white;
            padding: 20px;
            text-align: center;
            border-radius: 5px;
        }
        
        /* flex-direction */
        .flex-row {
            flex-direction: row;
        }
        
        .flex-row-reverse {
            flex-direction: row-reverse;
        }
        
        .flex-column {
            flex-direction: column;
        }
        
        .flex-column-reverse {
            flex-direction: column-reverse;
        }
        
        /* justify-content */
        .justify-start {
            justify-content: flex-start;
        }
        
        .justify-end {
            justify-content: flex-end;
        }
        
        .justify-center {
            justify-content: center;
        }
        
        .justify-between {
            justify-content: space-between;
        }
        
        .justify-around {
            justify-content: space-around;
        }
        
        .justify-evenly {
            justify-content: space-evenly;
        }
        
        /* align-items */
        .align-start {
            align-items: flex-start;
            height: 150px;
        }
        
        .align-end {
            align-items: flex-end;
            height: 150px;
        }
        
        .align-center {
            align-items: center;
            height: 150px;
        }
        
        .align-stretch {
            align-items: stretch;
            height: 150px;
        }
        
        /* flex-wrap */
        .flex-nowrap {
            flex-wrap: nowrap;
        }
        
        .flex-wrap {
            flex-wrap: wrap;
        }
        
        .flex-wrap-reverse {
            flex-wrap: wrap-reverse;
        }
        
        /* flex-grow, flex-shrink, flex-basis */
        .grow-1 {
            flex-grow: 1;
        }
        
        .grow-2 {
            flex-grow: 2;
        }
        
        .shrink-0 {
            flex-shrink: 0;
        }
        
        /* 实际应用 */
        
        /* 导航栏 */
        .navbar {
            display: flex;
            justify-content: space-between;
            align-items: center;
            background: #667eea;
            padding: 15px 20px;
            border-radius: 5px;
            margin-bottom: 20px;
        }
        
        .navbar .logo {
            color: white;
            font-size: 20px;
            font-weight: bold;
        }
        
        .navbar .nav-links {
            display: flex;
            gap: 20px;
        }
        
        .navbar .nav-links a {
            color: white;
            text-decoration: none;
        }
        
        /* 卡片布局 */
        .card-layout {
            display: flex;
            gap: 20px;
        }
        
        .card {
            flex: 1;
            background: white;
            border: 1px solid #ddd;
            border-radius: 8px;
            padding: 20px;
            box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
        }
        
        .card h3 {
            color: #667eea;
            margin-bottom: 10px;
        }
        
        /* 圣杯布局 */
        .holy-grail {
            display: flex;
            flex-direction: column;
            min-height: 400px;
        }
        
        .holy-grail-header,
        .holy-grail-footer {
            background: #667eea;
            color: white;
            padding: 20px;
            text-align: center;
        }
        
        .holy-grail-body {
            display: flex;
            flex: 1;
        }
        
        .holy-grail-content {
            flex: 1;
            background: #f8f9fa;
            padding: 20px;
        }
        
        .holy-grail-nav,
        .holy-grail-ads {
            flex: 0 0 150px;
            background: #e8f5e9;
            padding: 20px;
        }
        
        .holy-grail-nav {
            order: -1;
        }
        
        /* 代码块 */
        .code-block {
            background: #f8f9fa;
            padding: 15px;
            border-radius: 5px;
            border-left: 3px solid #667eea;
            margin: 10px 0;
            font-family: 'Courier New', monospace;
        }
        
        /* 表格 */
        .info-table {
            width: 100%;
            border-collapse: collapse;
            margin: 20px 0;
        }
        
        .info-table th,
        .info-table td {
            padding: 12px;
            text-align: left;
            border: 1px solid #ddd;
        }
        
        .info-table th {
            background: #667eea;
            color: white;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>Flexbox布局</h1>
        
        <h2>flex-direction(主轴方向)</h2>
        
        <h3>row(默认)</h3>
        <div class="flex-container flex-row">
            <div class="flex-item">1</div>
            <div class="flex-item">2</div>
            <div class="flex-item">3</div>
        </div>
        
        <h3>row-reverse</h3>
        <div class="flex-container flex-row-reverse">
            <div class="flex-item">1</div>
            <div class="flex-item">2</div>
            <div class="flex-item">3</div>
        </div>
        
        <h3>column</h3>
        <div class="flex-container flex-column">
            <div class="flex-item">1</div>
            <div class="flex-item">2</div>
            <div class="flex-item">3</div>
        </div>
        
        <h3>column-reverse</h3>
        <div class="flex-container flex-column-reverse">
            <div class="flex-item">1</div>
            <div class="flex-item">2</div>
            <div class="flex-item">3</div>
        </div>
        
        <h2>justify-content(主轴对齐)</h2>
        
        <h3>flex-start</h3>
        <div class="flex-container justify-start">
            <div class="flex-item">1</div>
            <div class="flex-item">2</div>
            <div class="flex-item">3</div>
        </div>
        
        <h3>flex-end</h3>
        <div class="flex-container justify-end">
            <div class="flex-item">1</div>
            <div class="flex-item">2</div>
            <div class="flex-item">3</div>
        </div>
        
        <h3>center</h3>
        <div class="flex-container justify-center">
            <div class="flex-item">1</div>
            <div class="flex-item">2</div>
            <div class="flex-item">3</div>
        </div>
        
        <h3>space-between</h3>
        <div class="flex-container justify-between">
            <div class="flex-item">1</div>
            <div class="flex-item">2</div>
            <div class="flex-item">3</div>
        </div>
        
        <h3>space-around</h3>
        <div class="flex-container justify-around">
            <div class="flex-item">1</div>
            <div class="flex-item">2</div>
            <div class="flex-item">3</div>
        </div>
        
        <h3>space-evenly</h3>
        <div class="flex-container justify-evenly">
            <div class="flex-item">1</div>
            <div class="flex-item">2</div>
            <div class="flex-item">3</div>
        </div>
        
        <h2>align-items(交叉轴对齐)</h2>
        
        <h3>flex-start</h3>
        <div class="flex-container align-start">
            <div class="flex-item">1</div>
            <div class="flex-item">2</div>
            <div class="flex-item">3</div>
        </div>
        
        <h3>flex-end</h3>
        <div class="flex-container align-end">
            <div class="flex-item">1</div>
            <div class="flex-item">2</div>
            <div class="flex-item">3</div>
        </div>
        
        <h3>center</h3>
        <div class="flex-container align-center">
            <div class="flex-item">1</div>
            <div class="flex-item">2</div>
            <div class="flex-item">3</div>
        </div>
        
        <h3>stretch</h3>
        <div class="flex-container align-stretch">
            <div class="flex-item" style="padding: 10px;">1</div>
            <div class="flex-item" style="padding: 10px;">2</div>
            <div class="flex-item" style="padding: 10px;">3</div>
        </div>
        
        <h2>flex-wrap(换行)</h2>
        
        <h3>nowrap(默认)</h3>
        <div class="flex-container flex-nowrap">
            <div class="flex-item" style="width: 200px;">1</div>
            <div class="flex-item" style="width: 200px;">2</div>
            <div class="flex-item" style="width: 200px;">3</div>
        </div>
        
        <h3>wrap</h3>
        <div class="flex-container flex-wrap">
            <div class="flex-item" style="width: 200px;">1</div>
            <div class="flex-item" style="width: 200px;">2</div>
            <div class="flex-item" style="width: 200px;">3</div>
        </div>
        
        <h2>flex-grow, flex-shrink, flex-basis</h2>
        
        <div class="flex-container">
            <div class="flex-item grow-1">flex-grow: 1</div>
            <div class="flex-item grow-2">flex-grow: 2</div>
            <div class="flex-item grow-1">flex-grow: 1</div>
        </div>
        
        <div class="code-block">
            flex-grow: 1; /* 放大比例 */<br>
            flex-shrink: 1; /* 缩小比例 */<br>
            flex-basis: auto; /* 初始大小 */
        </div>
        
        <h2>实际应用:导航栏</h2>
        <div class="navbar">
            <div class="logo">东巴文</div>
            <div class="nav-links">
                <a href="#">首页</a>
                <a href="#">产品</a>
                <a href="#">服务</a>
                <a href="#">关于</a>
            </div>
        </div>
        
        <h2>实际应用:卡片布局</h2>
        <div class="card-layout">
            <div class="card">
                <h3>卡片 1</h3>
                <p>这是卡片内容</p>
            </div>
            <div class="card">
                <h3>卡片 2</h3>
                <p>这是卡片内容</p>
            </div>
            <div class="card">
                <h3>卡片 3</h3>
                <p>这是卡片内容</p>
            </div>
        </div>
        
        <h2>实际应用:圣杯布局</h2>
        <div class="holy-grail">
            <div class="holy-grail-header">头部</div>
            <div class="holy-grail-body">
                <div class="holy-grail-content">主内容区域</div>
                <div class="holy-grail-nav">导航</div>
                <div class="holy-grail-ads">广告</div>
            </div>
            <div class="holy-grail-footer">底部</div>
        </div>
        
        <h2>Flexbox属性总结</h2>
        <table class="info-table">
            <thead>
                <tr>
                    <th>属性</th>
                    <th>说明</th>
                </tr>
            </thead>
            <tbody>
                <tr><td>flex-direction</td><td>主轴方向</td></tr>
                <tr><td>justify-content</td><td>主轴对齐</td></tr>
                <tr><td>align-items</td><td>交叉轴对齐</td></tr>
                <tr><td>flex-wrap</td><td>换行方式</td></tr>
                <tr><td>align-content</td><td>多行对齐</td></tr>
                <tr><td>flex-grow</td><td>放大比例</td></tr>
                <tr><td>flex-shrink</td><td>缩小比例</td></tr>
                <tr><td>flex-basis</td><td>初始大小</td></tr>
                <tr><td>order</td><td>排列顺序</td></tr>
            </tbody>
        </table>
    </div>
</body>
</html>

Grid布局

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Grid布局示例</title>
    
    <style>
        body {
            font-family: 'Segoe UI', sans-serif;
            padding: 20px;
            background: #f5f5f5;
        }
        
        .container {
            max-width: 800px;
            margin: 0 auto;
            background: white;
            padding: 30px;
            border-radius: 10px;
        }
        
        h1 {
            color: #667eea;
            margin-bottom: 20px;
        }
        
        h2 {
            color: #764ba2;
            margin: 30px 0 15px;
            border-left: 4px solid #764ba2;
            padding-left: 15px;
        }
        
        /* Grid示例 */
        
        /* 基本容器 */
        .grid-container {
            display: grid;
            background: #f8f9fa;
            padding: 15px;
            border: 2px solid #ddd;
            margin-bottom: 20px;
            gap: 10px;
        }
        
        .grid-item {
            background: #667eea;
            color: white;
            padding: 20px;
            text-align: center;
            border-radius: 5px;
        }
        
        /* grid-template-columns */
        .grid-cols-fixed {
            grid-template-columns: 200px 200px 200px;
        }
        
        .grid-cols-percent {
            grid-template-columns: 25% 50% 25%;
        }
        
        .grid-cols-fr {
            grid-template-columns: 1fr 2fr 1fr;
        }
        
        .grid-cols-repeat {
            grid-template-columns: repeat(3, 1fr);
        }
        
        .grid-cols-auto {
            grid-template-columns: auto auto auto;
        }
        
        .grid-cols-minmax {
            grid-template-columns: minmax(100px, 200px) minmax(150px, 1fr) minmax(100px, 200px);
        }
        
        /* grid-template-rows */
        .grid-rows {
            grid-template-columns: repeat(3, 1fr);
            grid-template-rows: 100px 200px 100px;
        }
        
        /* gap */
        .grid-gap {
            grid-template-columns: repeat(3, 1fr);
            grid-gap: 20px;
        }
        
        /* grid-area */
        .grid-area {
            grid-template-columns: repeat(3, 1fr);
            grid-template-rows: repeat(3, 100px);
        }
        
        .grid-area .item-1 {
            grid-area: 1 / 1 / 3 / 3;
            background: #e3f2fd;
            color: #333;
        }
        
        .grid-area .item-2 {
            grid-area: 1 / 3 / 2 / 4;
            background: #f3e5f5;
            color: #333;
        }
        
        .grid-area .item-3 {
            grid-area: 2 / 3 / 4 / 4;
            background: #e8f5e9;
            color: #333;
        }
        
        .grid-area .item-4 {
            grid-area: 3 / 1 / 4 / 3;
            background: #fff3cd;
            color: #333;
        }
        
        /* 实际应用 */
        
        /* 网格系统 */
        .grid-system {
            grid-template-columns: repeat(12, 1fr);
            gap: 15px;
        }
        
        .col-6 {
            grid-column: span 6;
        }
        
        .col-4 {
            grid-column: span 4;
        }
        
        .col-3 {
            grid-column: span 3;
        }
        
        /* 网站布局 */
        .website-layout {
            grid-template-areas:
                "header header header"
                "nav content ads"
                "footer footer footer";
            grid-template-columns: 200px 1fr 200px;
            grid-template-rows: auto 1fr auto;
            min-height: 400px;
            gap: 0;
        }
        
        .website-layout .header {
            grid-area: header;
            background: #667eea;
            color: white;
            padding: 20px;
            text-align: center;
        }
        
        .website-layout .nav {
            grid-area: nav;
            background: #e8f5e9;
            padding: 20px;
        }
        
        .website-layout .content {
            grid-area: content;
            background: #f8f9fa;
            padding: 20px;
        }
        
        .website-layout .ads {
            grid-area: ads;
            background: #fff3cd;
            padding: 20px;
        }
        
        .website-layout .footer {
            grid-area: footer;
            background: #764ba2;
            color: white;
            padding: 20px;
            text-align: center;
        }
        
        /* 代码块 */
        .code-block {
            background: #f8f9fa;
            padding: 15px;
            border-radius: 5px;
            border-left: 3px solid #667eea;
            margin: 10px 0;
            font-family: 'Courier New', monospace;
        }
        
        /* 表格 */
        .info-table {
            width: 100%;
            border-collapse: collapse;
            margin: 20px 0;
        }
        
        .info-table th,
        .info-table td {
            padding: 12px;
            text-align: left;
            border: 1px solid #ddd;
        }
        
        .info-table th {
            background: #667eea;
            color: white;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>Grid布局</h1>
        
        <h2>grid-template-columns(列定义)</h2>
        
        <h3>固定宽度</h3>
        <div class="grid-container grid-cols-fixed">
            <div class="grid-item">200px</div>
            <div class="grid-item">200px</div>
            <div class="grid-item">200px</div>
        </div>
        
        <h3>百分比</h3>
        <div class="grid-container grid-cols-percent">
            <div class="grid-item">25%</div>
            <div class="grid-item">50%</div>
            <div class="grid-item">25%</div>
        </div>
        
        <h3>fr单位</h3>
        <div class="grid-container grid-cols-fr">
            <div class="grid-item">1fr</div>
            <div class="grid-item">2fr</div>
            <div class="grid-item">1fr</div>
        </div>
        
        <h3>repeat()函数</h3>
        <div class="grid-container grid-cols-repeat">
            <div class="grid-item">1</div>
            <div class="grid-item">2</div>
            <div class="grid-item">3</div>
            <div class="grid-item">4</div>
            <div class="grid-item">5</div>
            <div class="grid-item">6</div>
        </div>
        
        <h3>auto关键字</h3>
        <div class="grid-container grid-cols-auto">
            <div class="grid-item">auto</div>
            <div class="grid-item">auto auto</div>
            <div class="grid-item">auto</div>
        </div>
        
        <h3>minmax()函数</h3>
        <div class="grid-container grid-cols-minmax">
            <div class="grid-item">minmax(100px, 200px)</div>
            <div class="grid-item">minmax(150px, 1fr)</div>
            <div class="grid-item">minmax(100px, 200px)</div>
        </div>
        
        <h2>grid-template-rows(行定义)</h2>
        <div class="grid-container grid-rows">
            <div class="grid-item">100px</div>
            <div class="grid-item">200px</div>
            <div class="grid-item">100px</div>
            <div class="grid-item">1</div>
            <div class="grid-item">2</div>
            <div class="grid-item">3</div>
            <div class="grid-item">4</div>
            <div class="grid-item">5</div>
            <div class="grid-item">6</div>
        </div>
        
        <h2>gap(间距)</h2>
        <div class="grid-container grid-gap">
            <div class="grid-item">1</div>
            <div class="grid-item">2</div>
            <div class="grid-item">3</div>
            <div class="grid-item">4</div>
            <div class="grid-item">5</div>
            <div class="grid-item">6</div>
        </div>
        
        <div class="code-block">
            gap: 20px; /* 行列间距 */<br>
            row-gap: 20px; /* 行间距 */<br>
            column-gap: 20px; /* 列间距 */
        </div>
        
        <h2>grid-area(网格区域)</h2>
        <div class="grid-container grid-area">
            <div class="grid-item item-1">项目 1(跨2行2列)</div>
            <div class="grid-item item-2">项目 2</div>
            <div class="grid-item item-3">项目 3(跨2行)</div>
            <div class="grid-item item-4">项目 4(跨2列)</div>
        </div>
        
        <div class="code-block">
            grid-area: 1 / 1 / 3 / 3; /* 行开始 / 列开始 / 行结束 / 列结束 */<br>
            /* 或 */<br>
            grid-row: 1 / 3;<br>
            grid-column: 1 / 3;
        </div>
        
        <h2>实际应用:网格系统</h2>
        <div class="grid-container grid-system">
            <div class="grid-item col-6">col-6(占6列)</div>
            <div class="grid-item col-6">col-6(占6列)</div>
            <div class="grid-item col-4">col-4</div>
            <div class="grid-item col-4">col-4</div>
            <div class="grid-item col-4">col-4</div>
            <div class="grid-item col-3">col-3</div>
            <div class="grid-item col-3">col-3</div>
            <div class="grid-item col-3">col-3</div>
            <div class="grid-item col-3">col-3</div>
        </div>
        
        <h2>实际应用:网站布局</h2>
        <div class="grid-container website-layout">
            <div class="header">头部</div>
            <div class="nav">导航</div>
            <div class="content">主内容区域</div>
            <div class="ads">广告</div>
            <div class="footer">底部</div>
        </div>
        
        <div class="code-block">
            grid-template-areas:<br>
            &nbsp;&nbsp;"header header header"<br>
            &nbsp;&nbsp;"nav content ads"<br>
            &nbsp;&nbsp;"footer footer footer";
        </div>
        
        <h2>Grid属性总结</h2>
        <table class="info-table">
            <thead>
                <tr>
                    <th>属性</th>
                    <th>说明</th>
                </tr>
            </thead>
            <tbody>
                <tr><td>grid-template-columns</td><td>定义列</td></tr>
                <tr><td>grid-template-rows</td><td>定义行</td></tr>
                <tr><td>grid-template-areas</td><td>定义区域</td></tr>
                <tr><td>gap</td><td>间距</td></tr>
                <tr><td>grid-area</td><td>项目区域</td></tr>
                <tr><td>grid-column</td><td>项目列范围</td></tr>
                <tr><td>grid-row</td><td>项目行范围</td></tr>
                <tr><td>justify-items</td><td>水平对齐项目</td></tr>
                <tr><td>align-items</td><td>垂直对齐项目</td></tr>
            </tbody>
        </table>
    </div>
</body>
</html>

定位布局

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>定位布局示例</title>
    
    <style>
        body {
            font-family: 'Segoe UI', sans-serif;
            padding: 20px;
            background: #f5f5f5;
        }
        
        .container {
            max-width: 800px;
            margin: 0 auto;
            background: white;
            padding: 30px;
            border-radius: 10px;
        }
        
        h1 {
            color: #667eea;
            margin-bottom: 20px;
        }
        
        h2 {
            color: #764ba2;
            margin: 30px 0 15px;
            border-left: 4px solid #764ba2;
            padding-left: 15px;
        }
        
        /* 定位示例 */
        
        /* 相对定位容器 */
        .position-container {
            position: relative;
            background: #f8f9fa;
            padding: 15px;
            border: 2px solid #ddd;
            height: 200px;
            margin-bottom: 20px;
        }
        
        /* static */
        .position-static {
            position: static;
            background: #e3f2fd;
            border: 2px solid #2196f3;
            padding: 15px;
        }
        
        /* relative */
        .position-relative {
            position: relative;
            top: 20px;
            left: 20px;
            background: #f3e5f5;
            border: 2px solid #9c27b0;
            padding: 15px;
        }
        
        /* absolute */
        .position-absolute {
            position: absolute;
            top: 20px;
            right: 20px;
            background: #e8f5e9;
            border: 2px solid #4caf50;
            padding: 15px;
        }
        
        /* fixed */
        .position-fixed {
            position: fixed;
            bottom: 20px;
            right: 20px;
            background: #667eea;
            color: white;
            padding: 15px;
            border-radius: 5px;
            box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);
            z-index: 1000;
        }
        
        /* sticky */
        .position-sticky {
            position: sticky;
            top: 0;
            background: #764ba2;
            color: white;
            padding: 15px;
            margin: 0 -30px;
        }
        
        /* z-index */
        .z-index-demo {
            position: relative;
            height: 200px;
            background: #f8f9fa;
            border: 2px solid #ddd;
            margin-bottom: 20px;
        }
        
        .z-index-1 {
            position: absolute;
            top: 20px;
            left: 20px;
            width: 100px;
            height: 100px;
            background: #e3f2fd;
            border: 2px solid #2196f3;
            z-index: 1;
        }
        
        .z-index-2 {
            position: absolute;
            top: 40px;
            left: 40px;
            width: 100px;
            height: 100px;
            background: #f3e5f5;
            border: 2px solid #9c27b0;
            z-index: 2;
        }
        
        .z-index-3 {
            position: absolute;
            top: 60px;
            left: 60px;
            width: 100px;
            height: 100px;
            background: #e8f5e9;
            border: 2px solid #4caf50;
            z-index: 3;
        }
        
        /* 实际应用 */
        
        /* 模态框 */
        .modal-overlay {
            position: fixed;
            top: 0;
            left: 0;
            right: 0;
            bottom: 0;
            background: rgba(0, 0, 0, 0.5);
            display: flex;
            justify-content: center;
            align-items: center;
            z-index: 1000;
        }
        
        .modal {
            position: relative;
            background: white;
            padding: 30px;
            border-radius: 10px;
            max-width: 500px;
            width: 90%;
        }
        
        .modal-close {
            position: absolute;
            top: 10px;
            right: 10px;
            background: none;
            border: none;
            font-size: 24px;
            cursor: pointer;
            color: #666;
        }
        
        /* 工具提示 */
        .tooltip-container {
            position: relative;
            display: inline-block;
        }
        
        .tooltip {
            position: absolute;
            bottom: 100%;
            left: 50%;
            transform: translateX(-50%);
            background: #333;
            color: white;
            padding: 5px 10px;
            border-radius: 5px;
            font-size: 12px;
            white-space: nowrap;
            opacity: 0;
            transition: opacity 0.3s;
        }
        
        .tooltip-container:hover .tooltip {
            opacity: 1;
        }
        
        /* 代码块 */
        .code-block {
            background: #f8f9fa;
            padding: 15px;
            border-radius: 5px;
            border-left: 3px solid #667eea;
            margin: 10px 0;
            font-family: 'Courier New', monospace;
        }
        
        /* 表格 */
        .info-table {
            width: 100%;
            border-collapse: collapse;
            margin: 20px 0;
        }
        
        .info-table th,
        .info-table td {
            padding: 12px;
            text-align: left;
            border: 1px solid #ddd;
        }
        
        .info-table th {
            background: #667eea;
            color: white;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>定位布局</h1>
        
        <h2>static(静态定位)</h2>
        <p>默认值,元素按照正常文档流排列。</p>
        
        <div class="position-container">
            <div class="position-static">静态定位(默认)</div>
        </div>
        
        <div class="code-block">
            position: static;
        </div>
        
        <h2>relative(相对定位)</h2>
        <p>相对于元素自身原始位置进行偏移,仍占据文档流空间。</p>
        
        <div class="position-container">
            <div class="position-relative">相对定位(top: 20px; left: 20px;)</div>
        </div>
        
        <div class="code-block">
            position: relative;<br>
            top: 20px;<br>
            left: 20px;
        </div>
        
        <h2>absolute(绝对定位)</h2>
        <p>相对于最近的已定位祖先元素进行定位,脱离文档流。</p>
        
        <div class="position-container">
            <div class="position-absolute">绝对定位(top: 20px; right: 20px;)</div>
        </div>
        
        <div class="code-block">
            position: absolute;<br>
            top: 20px;<br>
            right: 20px;
        </div>
        
        <h2>fixed(固定定位)</h2>
        <p>相对于浏览器窗口进行定位,不随滚动条滚动。</p>
        
        <div class="code-block">
            position: fixed;<br>
            bottom: 20px;<br>
            right: 20px;
        </div>
        
        <p>(右下角有一个固定定位的示例)</p>
        
        <h2>sticky(粘性定位)</h2>
        <p>在滚动到指定位置前为相对定位,之后为固定定位。</p>
        
        <div style="height: 200px; overflow-y: auto; border: 2px solid #ddd; margin-bottom: 20px;">
            <div class="position-sticky">粘性定位(top: 0)</div>
            <div style="padding: 20px;">
                <p>内容 1</p>
                <p>内容 2</p>
                <p>内容 3</p>
                <p>内容 4</p>
                <p>内容 5</p>
                <p>内容 6</p>
                <p>内容 7</p>
                <p>内容 8</p>
                <p>内容 9</p>
                <p>内容 10</p>
            </div>
        </div>
        
        <div class="code-block">
            position: sticky;<br>
            top: 0;
        </div>
        
        <h2>z-index(层叠顺序)</h2>
        <p>控制定位元素的堆叠顺序,值越大越在上层。</p>
        
        <div class="z-index-demo">
            <div class="z-index-1">z-index: 1</div>
            <div class="z-index-2">z-index: 2</div>
            <div class="z-index-3">z-index: 3</div>
        </div>
        
        <div class="code-block">
            z-index: 1;<br>
            z-index: 2;<br>
            z-index: 3;
        </div>
        
        <h2>实际应用:工具提示</h2>
        <div style="text-align: center; padding: 50px;">
            <div class="tooltip-container">
                <button style="padding: 10px 20px; background: #667eea; color: white; border: none; border-radius: 5px; cursor: pointer;">悬停查看提示</button>
                <div class="tooltip">这是一个工具提示</div>
            </div>
        </div>
        
        <h2>定位属性总结</h2>
        <table class="info-table">
            <thead>
                <tr>
                    <th>属性值</th>
                    <th>相对对象</th>
                    <th>是否脱离文档流</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>static</td>
                    <td>正常文档流</td>
                    <td></td>
                </tr>
                <tr>
                    <td>relative</td>
                    <td>元素自身原始位置</td>
                    <td></td>
                </tr>
                <tr>
                    <td>absolute</td>
                    <td>最近已定位祖先元素</td>
                    <td></td>
                </tr>
                <tr>
                    <td>fixed</td>
                    <td>浏览器窗口</td>
                    <td></td>
                </tr>
                <tr>
                    <td>sticky</td>
                    <td>滚动容器</td>
                    <td></td>
                </tr>
            </tbody>
        </table>
    </div>
    
    <!-- 固定定位示例 -->
    <div class="position-fixed">
        固定定位示例
    </div>
</body>
</html>

最佳实践

1. 选择合适的布局方式

/* 一维布局:使用Flexbox */
.navbar {
    display: flex;
    justify-content: space-between;
}

/* 二维布局:使用Grid */
.dashboard {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    grid-template-rows: auto;
}

/* 文本环绕:使用浮动 */
.image {
    float: left;
    margin: 0 15px 10px 0;
}

2. 响应式布局

/* 使用媒体查询 */
.container {
    display: grid;
    grid-template-columns: 1fr;
    gap: 20px;
}

@media (min-width: 768px) {
    .container {
        grid-template-columns: repeat(2, 1fr);
    }
}

@media (min-width: 1024px) {
    .container {
        grid-template-columns: repeat(3, 1fr);
    }
}

3. 避免过度嵌套

/* 不推荐:过度嵌套 */
.container .wrapper .content .box .item {
    /* 样式 */
}

/* 推荐:扁平化 */
.container-item {
    /* 样式 */
}

学习检验

知识点测试

问题1:以下哪个属性可以让元素水平居中?

A. margin: auto; B. margin: 0 auto; C. text-align: center; D. align-items: center;

<details> <summary>点击查看答案</summary>

答案:B

东巴文解释:margin: 0 auto; 可以让块级元素水平居中,前提是元素必须有明确的宽度。text-align: center; 用于文本居中,align-items: center; 用于Flexbox交叉轴居中。

</details>

问题2:Flexbox的默认主轴方向是什么?

A. column B. row C. row-reverse D. column-reverse

<details> <summary>点击查看答案</summary>

答案:B

东巴文解释:Flexbox的默认主轴方向是row(水平方向从左到右)。

</details>

实践任务

任务:创建一个响应式卡片布局页面,使用Grid布局,在小屏幕上显示1列,中等屏幕显示2列,大屏幕显示3列。

<details> <summary>点击查看参考答案</summary>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>响应式卡片布局 - 东巴文</title>
    
    <style>
        /* 全局设置 */
        *,
        *::before,
        *::after {
            box-sizing: border-box;
            margin: 0;
            padding: 0;
        }
        
        body {
            font-family: 'Segoe UI', sans-serif;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            min-height: 100vh;
            padding: 20px;
        }
        
        .container {
            max-width: 1200px;
            margin: 0 auto;
        }
        
        h1 {
            color: white;
            text-align: center;
            margin-bottom: 30px;
            font-size: 2.5em;
        }
        
        /* 卡片网格 */
        .card-grid {
            display: grid;
            grid-template-columns: 1fr;
            gap: 20px;
        }
        
        /* 中等屏幕 */
        @media (min-width: 768px) {
            .card-grid {
                grid-template-columns: repeat(2, 1fr);
            }
        }
        
        /* 大屏幕 */
        @media (min-width: 1024px) {
            .card-grid {
                grid-template-columns: repeat(3, 1fr);
            }
        }
        
        /* 卡片样式 */
        .card {
            background: white;
            border-radius: 10px;
            overflow: hidden;
            box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
            transition: transform 0.3s, box-shadow 0.3s;
        }
        
        .card:hover {
            transform: translateY(-10px);
            box-shadow: 0 15px 40px rgba(0, 0, 0, 0.3);
        }
        
        .card-image {
            width: 100%;
            height: 200px;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            display: flex;
            justify-content: center;
            align-items: center;
            color: white;
            font-size: 48px;
        }
        
        .card-content {
            padding: 20px;
        }
        
        .card-title {
            font-size: 1.5em;
            margin-bottom: 10px;
            color: #333;
        }
        
        .card-text {
            color: #666;
            line-height: 1.6;
            margin-bottom: 15px;
        }
        
        .card-button {
            display: inline-block;
            padding: 10px 20px;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            color: white;
            text-decoration: none;
            border-radius: 5px;
            transition: opacity 0.3s;
        }
        
        .card-button:hover {
            opacity: 0.8;
        }
        
        /* 提示信息 */
        .info {
            background: rgba(255, 255, 255, 0.9);
            padding: 15px;
            border-radius: 5px;
            margin-bottom: 20px;
            text-align: center;
            color: #333;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>响应式卡片布局</h1>
        
        <div class="info">
            💡 提示:调整浏览器窗口大小查看响应式效果(小屏1列 → 中屏2列 → 大屏3列)
        </div>
        
        <div class="card-grid">
            <div class="card">
                <div class="card-image">🎨</div>
                <div class="card-content">
                    <h2 class="card-title">设计</h2>
                    <p class="card-text">创造美观的用户界面,提升用户体验。</p>
                    <a href="#" class="card-button">了解更多</a>
                </div>
            </div>
            
            <div class="card">
                <div class="card-image">💻</div>
                <div class="card-content">
                    <h2 class="card-title">开发</h2>
                    <p class="card-text">编写高质量的代码,实现功能需求。</p>
                    <a href="#" class="card-button">了解更多</a>
                </div>
            </div>
            
            <div class="card">
                <div class="card-image">🚀</div>
                <div class="card-content">
                    <h2 class="card-title">部署</h2>
                    <p class="card-text">将应用部署到服务器,让用户访问。</p>
                    <a href="#" class="card-button">了解更多</a>
                </div>
            </div>
            
            <div class="card">
                <div class="card-image">📊</div>
                <div class="card-content">
                    <h2 class="card-title">分析</h2>
                    <p class="card-text">收集和分析数据,优化产品性能。</p>
                    <a href="#" class="card-button">了解更多</a>
                </div>
            </div>
            
            <div class="card">
                <div class="card-image">🔒</div>
                <div class="card-content">
                    <h2 class="card-title">安全</h2>
                    <p class="card-text">保护用户数据安全,防止攻击。</p>
                    <a href="#" class="card-button">了解更多</a>
                </div>
            </div>
            
            <div class="card">
                <div class="card-image"></div>
                <div class="card-content">
                    <h2 class="card-title">性能</h2>
                    <p class="card-text">优化加载速度,提升用户体验。</p>
                    <a href="#" class="card-button">了解更多</a>
                </div>
            </div>
        </div>
    </div>
</body>
</html>
</details>

东巴文(db-w.cn) - 让编程学习更有趣!