CSS3布局方式介绍

news2025/7/19 15:23:17

CSS3布局方式介绍

CSS3布局(Layout)系统是现代网页设计中用于构建页面结构和控制元素排列的一组强大工具。CSS3提供了多种布局方式,每种方式都有其适用场景,其中最常用的是Flexbox和CSS Grid。

先看传统上几种布局方式,再较详细的介绍现代布局方式Flexbox和CSS Grid。

传统上几种布局方式

☆Multi-column Layout(多列布局):

这种布局方式可以让内容自动流进多个垂直排列的列中,适用于文本内容较多的情况。

基本使用:通过设置column-count或者column-width来确定列数或列宽,并通过column-gap和column-rule控制列之间的间隔和分隔线。例如:

<div class="multicol-container">
  <p>
    这是一段很长的文本,用于演示多列布局的效果。多列布局非常适合长文本的排版,类似于报纸的排版方式。
  </p>
</div>

<style>
  .multicol-container {
    column-count: 3;       /* 定义三列 */
    column-gap: 20px;      /* 列间距 */
    column-rule: 1px solid #ccc; /* 列分隔线 */
  }
</style>

☆Positioning(定位布局):

虽然这不是CSS3新引入的布局方式,但仍然是非常重要的布局手段之一。通过position属性(如static、 relative、absolute、fixed、sticky)结合top、right、bottom、left等属性来进行元素的精确定位。

<div class="container">
  <div class="box" style="position: relative; top: 20px; left: 20px;">Relative</div>
  <div class="box" style="position: absolute; top: 50px; right: 0;">Absolute</div>
  <div class="box" style="position: fixed; bottom: 0; left: 0;">Fixed</div>
</div>

<style>
  .container {
    position: relative;
    width: 300px;
    height: 300px;
    border: 1px solid black;
  }
  .box {
    width: 100px;
    height: 100px;
    background-color: #f5f5f5;
    border: 1px solid #ccc;
  }
</style>

☆Floats and Clears(浮动与清除):

浮动也是一种传统的布局方法,主要用于让文本环绕图片或者其他元素。虽然CSS3带来了更多先进的布局技术,但在某些情况下,浮动仍然有用。

使用float属性可以将元素向左或向右移动,然后用clear属性来防止其他元素围绕浮动元素。

<div class="container">
  <div class="box" style="float: left;">Box 1</div>
  <div class="box" style="float: right;">Box 2</div>
  <div class="clear"></div>
  <div class="box">Box 3</div>
</div>

<style>
  .container {
    width: 300px;
    border: 1px solid black;
  }
  .box {
    width: 100px;
    height: 100px;
    background-color: #f5f5f5;
    border: 1px solid #ccc;
    margin: 10px;
  }
  .clear {
    clear: both;
  }
</style>

现代布局方式Flexbox和CSS Grid

现代布局方式Flexbox和CSS Grid通常更强大、更灵活,下面介绍。

1. Flexbox(弹性盒子布局)

Flexbox是一种一维布局系统,主要用于在行或列中排列元素。它通过display: flex应用于父容器,使子元素能够根据容器的大小自动调整宽度或高度。

基本使用:首先需要定义一个容器元素,并设置其display属性为flex或inline-flex。例如:

.container {
    display: flex;
}

核心特点:

  • 方向自由:支持水平(row)或垂直(column)排列,通过 flex-direction 控制。
  • 动态伸缩:元素可自动填充剩余空间(flex-grow)或收缩避免溢出(flex-shrink)。
  • 精准对齐:通过 justify-content(主轴对齐)和 align-items(交叉轴对齐)实现复杂对齐逻辑。
  • 简化响应式:无需浮动或定位即可实现自适应布局。

典型应用场景:

  • 导航栏、按钮组、卡片列表等线性排列的组件。
  • 元素垂直居中(告别 margin: auto 的 Hack)。
  • 动态分配空间,如侧边栏与主内容区的比例布局。

Flexbox布局示例:

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Flexbox Layout Example</title>
    <!-- <link rel="stylesheet" href="styles.css">  -->
    <style>
        /* 基础样式重置 */
        * { margin: 0; padding: 0; box-sizing: border-box; }

        /* 示例1:经典导航栏(主轴方向 + 空间分配) */
        .nav-container {
            display: flex;
            justify-content: space-between; /* 主轴两端对齐 */
            align-items: center;            /* 交叉轴居中对齐 */
            padding: 1rem;
            background: #333;
        }
        .logo { color: white; font-size: 1.5rem; }
        .nav-links {
            display: flex;
            gap: 2rem;       /* 元素间距 */
            list-style: none;
        }
        .nav-links a {
            color: white;
            text-decoration: none;
            transition: color 0.3s;
        }
        .nav-links a:hover { color: #00ff88; }

        /* 示例2:等高卡片布局(交叉轴拉伸 + 动态换行) */
        .card-container {
            display: flex;
            flex-wrap: wrap;    /* 允许换行 */
            gap: 1rem;
            padding: 2rem;
        }
        .card {
            flex: 1;            /* 动态填充剩余空间 */
            min-width: 250px;   /* 最小宽度约束 */
            background: #f5f5f5;
            padding: 1.5rem;
            border-radius: 8px;
        }

        /* 示例3:垂直居中圣杯布局(嵌套 Flex + 自动边距) */
        .centered-section {
            display: flex;
            min-height: 300px;  /* 需要高度才能垂直居中 */
            background: #e0e0e0;
            margin: 2rem;
        }
        .centered-content {
            margin: auto;       /* 水平和垂直居中 */
            text-align: center;
        }

        /* 示例4:响应式布局调整(媒体查询 + 方向切换) */
        @media (max-width: 768px) {
            .nav-container {
                flex-direction: column; /* 小屏切换为垂直排列 */
                gap: 1rem;
            }
            .card {
                flex: 1 0 100%; /* 移动端卡片占满宽度 */
            }
        }
    </style>
</head>
<body>
    <!-- 示例1:导航栏 -->
    <nav class="nav-container">
        <div class="logo">FlexBox Demo</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>

    <!-- 示例2:卡片布局 -->
    <div class="card-container">
        <div class="card">
            <h3>卡片1</h3>
            <p>动态宽度卡片,内容高度不同但容器等高</p>
        </div>
        <div class="card">
            <h3>卡片2</h3>
            <p>通过 flex:1 实现等宽效果,自动换行响应屏幕尺寸</p>
            <p>额外的段落用于展示高度差异</p>
        </div>
        <div class="card">
            <h3>卡片3</h3>
            <p>最小宽度约束保证可读性</p>
        </div>
    </div>

    <!-- 示例3:垂直居中 -->
    <section class="centered-section">
        <div class="centered-content">
            <h2>完美居中</h2>
            <p>无需计算 margin,一行代码实现居中</p>
        </div>
    </section>
</body>
</html>

运行效果:

2. CSS Grid(网格布局)

CSS Grid是一种二维布局系统,允许开发者同时控制行和列,创建复杂的网格结构。

基本使用:同样先定义一个容器,并设置其display属性为grid或inline-grid。例如:

.container {
    display: grid;
    grid-template-columns: 100px 100px 100px; /* 定义三列,每列宽度100px */
    grid-template-rows: auto; /* 自动调整行高 */
}
 

核心特点:

  • 网格定义:通过 grid-template-columns 和 grid-template-rows 显式定义行与列。
  • 精确占位:元素可跨行/列(grid-column、grid-row),实现复杂布局结构。
  • 自适应网格:结合 auto-fit、minmax() 实现响应式网格,无需媒体查询。
  • 间距控制:gap 属性统一管理行列间距(替代 margin 的繁琐计算)。
  • 对齐属性:有更复杂的对齐属性,如justify-items和align-content

典型应用场景:

  • 整体页面布局(页眉、侧边栏、主内容区、页脚)。
  • 杂志式多列布局或图库网格。
  • 不规则布局(如重叠元素、自由定位区域)。

CSS Grid布局示例

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CSS Grid Layou </title>
    <!-- <link rel="stylesheet" href="styles.css">  -->
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 0;
            padding: 0;
                display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            background-color: #f5f5f5;
        }

        .dashboard {
            display: grid;
            grid-template-columns: repeat(3, 1fr); /* 定义三列,每列宽度相等 */
            grid-template-rows: repeat(2, 100px) 200px; /* 定义三行,前两行高度为100px,最后一行高度为200px */
            gap: 10px; /* 网格间隔 */
            width: 80%;
            max-width: 900px;
            background-color: #fff;
            padding: 10px;
            border-radius: 8px;
            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
        }

        .item {
            background-color: #e0e0e0;
            display: flex;
            justify-content: center;
            align-items: center;
            font-size: 1.2em;
            color: #333;
            border-radius: 4px;
        }

        /* 调整特定模块的大小和位置 */
        .item-1 {
            grid-column: 1 / 3; /* 跨越第1列到第2列 */
            grid-row: 1 / 2; /* 占据第1行 */
            background-color: #ffcccb;
        }

        .item-2 {
            grid-column: 3 / 4;
            grid-row: 1 / 3; /* 跨越第1行到第2行 */
            background-color: #d4edda;
        }

        .item-3 {
            grid-column: 1 / 2;
            grid-row: 2 / 3;
            background-color: #d1ecf1;
        }

        .item-4 {
            grid-column: 2 / 3;
            grid-row: 2 / 3;
            background-color: #fff3cd;
        }

        .item-5 {
            grid-column: 3 / 4;
            grid-row: 3 / 4;
            background-color: #d4edda;
        }

        .item-6 {
            grid-column: 1 / 4; /* 跨越所有列 */
            grid-row: 3 / 4;
            background-color: #f8d7da;
        }

    </style>
</head>
<body>
    <div class="dashboard">
        <div class="item item-1">Item 1</div>
        <div class="item item-2">Item 2</div>
        <div class="item item-3">Item 3</div>
        <div class="item item-4">Item 4</div>
        <div class="item item-5">Item 5</div>
        <div class="item item-6">Item 6</div>
    </div>
</body>
</html>

运行效果:

在 Grid 单元格内嵌套 Flexbox

可以在 CSS Grid 的单元格内嵌套 Flexbox 布局,这种组合是构建复杂布局的最佳实践之一。

Grid:擅长宏观布局(整体页面结构、二维行列控制)

Flexbox:擅长微观布局(组件内部元素排列、动态对齐)

组合优势:通过 Grid 定义整体框架,再用 Flexbox 精细控制单元格内容。

以下是一个简单的示例

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Grid with Nested Flexbox</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 0;
            padding: 20px;
        }

        .grid-container {
            display: grid;
            grid-template-columns: repeat(3, 1fr);
            grid-gap: 20px;
        }

        .grid-item {
            background-color: #f0f0f0;
            padding: 20px;
            border-radius: 5px;
        }

        .flex-container {
            display: flex;
            flex-direction: column;
            height: 200px;
        }

        .flex-item {
            flex: 1;
            display: flex;
            justify-content: center;
            align-items: center;
            background-color: #ddd;
            margin: 5px;
            border-radius: 3px;
        }
    </style>
</head>
<body>
    <div class="grid-container">
        <div class="grid-item">
            <h2>Grid Item 1</h2>
            <div class="flex-container">
                <div class="flex-item">Flex 1</div>
                <div class="flex-item">Flex 2</div>
                <div class="flex-item">Flex 3</div>
            </div>
        </div>
        <div class="grid-item">
            <h2>Grid Item 2</h2>
            <div class="flex-container">
                <div class="flex-item">Flex 1</div>
                <div class="flex-item">Flex 2</div>
            </div>
        </div>
        <div class="grid-item">
            <h2>Grid Item 3</h2>
            <div class="flex-container">
                <div class="flex-item">Flex 1</div>
                <div class="flex-item">Flex 2</div>
                <div class="flex-item">Flex 3</div>
                <div class="flex-item">Flex 4</div>
            </div>
        </div>
    </div>
</body>
</html>

运行效果:

这个例子中:

  1. 使用Grid创建了一个3列的主布局结构。
  2. 每个Grid单元格内部使用Flexbox来排列内容。
  3. Flexbox容器设置为列方向(flex-direction: column),使子元素垂直排列。

每个Flex项目都设置了居中对齐。

 Flexbox vs. CSS Grid:如何选择?

Flexbox

Grid

维度

一维(单行或单列)

二维(行与列同时控制)

适用场景

组件内部布局

页面整体结构或复杂组件

驱动

布局由内容动态调整

布局由容器显式定义

组合使用

可在 Grid 单元格内嵌套 Flexbox

可作为 Flex 容器的子项

关于Flexbox和CSS Grid更多情况,可见

中文 https://www.w3ccoo.com/css/css3_flexbox.html

英文 https://www.w3schools.com/css/css3_flexbox.asp

中文 https://www.w3ccoo.com/css/css_grid.html

英文 https://www.w3schools.com/css/css_grid.asp

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2344034.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FPGA设计 时空变换

1、时空变换基本概念 1.1、时空概念简介 时钟速度决定完成任务需要的时间&#xff0c;规模的大小决定完成任务所需要的空间&#xff08;资源&#xff09;&#xff0c;因此速度和规模就是FPGA中时间和空间的体现。 如果要提高FPGA的时钟&#xff0c;每个clk内组合逻辑所能做的事…

《AI大模型趣味实战》智能Agent和MCP协议的应用实例:搭建一个能阅读DOC文件并实时显示润色改写过程的Python Flask应用

智能Agent和MCP协议的应用实例&#xff1a;搭建一个能阅读DOC文件并实时显示润色改写过程的Python Flask应用 引言 随着人工智能技术的飞速发展&#xff0c;智能Agent与模型上下文协议(MCP)的应用场景越来越广泛。本报告将详细介绍如何基于Python Flask框架构建一个智能应用&…

uniapp开发03-轮播图组件swiper的简单使用案例

uniapp开发03-轮播图组件swiper的简单使用案例&#xff01;这个仅仅是官方提供的一个轮播图组件啊。实际上我们项目开发的时候&#xff0c;会应用到其他第三方公司的轮播图组件资源&#xff01;效果更强大。兼容性更强。 废话不多说&#xff0c;我们直接上代码。分析代码。 &l…

【Android】四大组件之Service

目录 一、什么是Service 二、启停 Service 三、绑定 Service 四、前台服务 五、远程服务扩展 六、服务保活 七、服务启动方法混用 你可以把Service想象成一个“后台默默打工的工人”。它没有UI界面&#xff0c;默默地在后台干活&#xff0c;比如播放音乐、下载文件、处理…

TRO再添新案 TME再拿下一热门IP,涉及Paddington多个商标

4月2日和4月8日&#xff0c;TME律所代理Paddington & Company Ltd.对热门IP Paddington Bear帕丁顿熊的多类商标发起维权&#xff0c;覆盖文具、家居用品、毛绒玩具、纺织用品、游戏、电影、咖啡、填充玩具等领域。跨境卖家需立即排查店铺内的相关产品&#xff01; 案件基…

WPF之项目创建

文章目录 引言先决条件创建 WPF 项目步骤理解项目结构XAML 与 C# 代码隐藏第一个 "Hello, WPF!" 示例构建和运行应用程序总结相关学习资源 引言 Windows Presentation Foundation (WPF) 是 Microsoft 用于构建具有丰富用户界面的 Windows 桌面应用程序的现代框架。它…

AI数字人:未来职业的重塑(9/10)

摘要&#xff1a;AI 数字人凭借计算机视觉、自然语言处理与深度学习技术&#xff0c;从虚拟形象进化为智能交互个体&#xff0c;广泛渗透金融、教育、电商等多领域&#xff0c;重构职业生态。其通过降本提效、场景拓展与体验升级机制&#xff0c;替代重复岗位工作&#xff0c;催…

深入解析Mlivus Cloud中的etcd配置:最佳实践与高级调优指南

作为大禹智库的向量数据库高级研究员,我在《向量数据库指南》一书中详细阐述了向量数据库的核心组件及其优化策略。今天,我将基于30余年的实战经验,深入剖析Mlivus Cloud中etcd这一关键依赖的配置细节与优化方法。对于希望深入掌握Mlivus Cloud的读者,我强烈建议参考《向量…

前端面试宝典---vue原理

vue的Observer简化版 class Observer {constructor(value) {if (!value || typeof value ! object) returnthis.walk(value) // 对对象的所有属性进行遍历并定义响应式}walk (obj) {Object.keys(obj).forEach(key > defineReactive(obj, key, obj[key]))} } // 定义核心方法…

PyTorch卷积层填充(Padding)与步幅(Stride)详解及代码示例

本文通过具体代码示例讲解PyTorch中卷积操作的填充&#xff08;Padding&#xff09;和步幅&#xff08;Stride&#xff09;对输出形状的影响&#xff0c;帮助读者掌握卷积层的参数配置技巧。 一、填充与步幅基础 填充&#xff08;Padding&#xff09;&#xff1a;在输入数据边缘…

用go从零构建写一个RPC(仿gRPC,tRPC)--- 版本1

希望借助手写这个go的中间件项目&#xff0c;能够理解go语言的特性以及用go写中间件的优势之处&#xff0c;同时也是为了更好的使用和优化公司用到的trpc&#xff0c;并且作者之前也使用过grpc并有一定的兴趣&#xff0c;所以打算从0构建一个rpc系统&#xff0c;对于生产环境已…

django之账号管理功能

账号管理功能 目录 1.账号管理页面 2.新增账号 3.修改账号 4.账号重置密码 5.删除账号功能 6.所有代码展示集合 7.运行结果 这一片文章, 我们需要新增账号管理功能, 今天我们写到的代码, 基本上都是用到以前所过的知识, 不过也有需要注意的细节。 一、账号管理界面 …

月之暗面开源 Kimi-Audio-7B-Instruct,同时支持语音识别和语音生成

我们向您介绍在音频理解、生成和对话方面表现出色的开源音频基础模型–Kimi-Audio。该资源库托管了 Kimi-Audio-7B-Instruct 的模型检查点。 Kimi-Audio 被设计为通用的音频基础模型&#xff0c;能够在单一的统一框架内处理各种音频处理任务。主要功能包括&#xff1a; 通用功…

IDEA配置将Servlet真正布署到Tomcat

刚开始只能IDEA运行完Servlet web application 并保持IDEA运行才能通过浏览器访问到我的Servlet&#xff0c;跟想象中的不一样&#xff0c;不应该是IDEA运行完项目以后只要打开Tomcat就能访问吗&#xff1f;事实时运行完项目只要关掉IDEA就不能再访问到应用了&#xff0c;而且T…

刚体运动 (位置向量 - 旋转矩阵) 笔记 1.1~1.3 (台大机器人学-林沛群)

目录 1. 理解刚体的“自由度”&#xff08;Degrees of Freedom, DOF&#xff09; 1.1 平面运动 (2D) 1.2 空间运动 (3D) 2. 统一描述&#xff1a;引入“体坐标系”&#xff08;Body Frame&#xff09; 3. 从“状态”到“运动”&#xff1a;引入微分 3.1 补充&#xff1a;…

openAICEO山姆奥特曼未来预测雄文之三个观察

《三个观察》 山姆奥特曼 这篇文章主要讲的是关于AGI&#xff08;人工通用智能&#xff09;的未来发展及其对社会的影响&#xff0c;用大白话总结如下&#xff1a; 核心观点&#xff1a; AGI是什么&#xff1f; AGI是一种能像人类一样解决各种复杂问题的智能系统&#xff0c;比…

比象AI创作系统,多模态大模型:问答分析+AI绘画+管理后台系统

比象AI创作系统是新一代集智能问答、内容创作与商业运营于一体的综合型AI平台。本系统深度融合GPT-4.0/GPT-4o多模态大模型技术&#xff0c;结合实时联网搜索与智能分析能力&#xff0c;打造了从内容生产到商业变现的完整闭环解决方案。 智能问答中枢 系统搭载行业领先的对话…

Docker-高级使用

前言 书接上文Docker-初级安装及使用_用docker安装doccano-CSDN博客&#xff0c;我们讲解了Docker的基本操作&#xff0c;下面我们讲解的是高级使用&#xff0c;请大家做好准备&#xff01; 大家如果是从初级安装使用过来的话&#xff0c;建议把之前镜像和搭载的容器数据卷里面…

计算机网络 | Chapter1 计算机网络和因特网

&#x1f493;个人主页&#xff1a;mooridy-CSDN博客 &#x1f493;文章专栏&#xff1a;《计算机网络&#xff1a;自定向下方法》 大纲式阅读笔记_mooridy的博客-CSDN博客 &#x1f339;关注我&#xff0c;和我一起学习更多计算机网络的知识 &#x1f51d;&#x1f51d; 目录 …

开源项目实战学习之YOLO11:ultralytics-cfg-datasets-Objects365、open-images-v7.yaml文件(六)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 medical - pills.yaml 通常用于配置与医学药丸检测任务相关的参数和信息 Objects365.yaml 用于配置与 Objects365 数据集相关信息的文件。Objects365 数据集包含 365 个不同的物体类别…