CSS网格布局Grid

news2025/7/13 9:50:28

目录

一、Grid 网格布局

1.Grid 布局基础

2.网格容器属性

3.网格项目属性

4.高级功能

5.典型应用场景

6.最佳实践

二、Flex和Grid对比

示例:


一、Grid 网格布局

CSS Grid 是一种强大的二维布局系统,能够以行和列的方式精确控制网页布局。它比传统的布局方式(如浮动、定位)更灵活、更强大,适合构建复杂的响应式网页。


1.Grid 布局基础

1. 核心概念

  • 网格容器(Grid Container):设置 display: grid 的元素。

  • 网格项目(Grid Item):容器的直接子元素。

  • 网格线(Grid Line):划分网格的垂直线和水平线。

  • 网格轨道(Grid Track):行或列的集合。

  • 网格单元格(Grid Cell):行和列的交叉区域。

  • 网格区域(Grid Area):一个或多个单元格组成的矩形区域。

2. 创建网格容器

.container {
  display: grid;  /* 或 inline-grid */
}

2.网格容器属性

1. 定义网格轨道

  • grid-template-columns:定义列宽和列数。

  • grid-template-rows:定义行高和行数。

  • 常用值

    • 固定值:200px20%

    • 弹性单位:1fr(剩余空间的分配比例)。

    • 函数:repeat(3, 1fr)(重复 3 列,每列宽度相等)。

    • 范围:minmax(100px, 1fr)(最小 100px,最大 1fr)。

示例

.container {
  display: grid;
  grid-template-columns: 1fr 300px;  /* 两列:第一列弹性,第二列固定 */
  grid-template-rows: 100px auto;     /* 两行:第一行固定,第二行自适应 */
}

2. 定义网格区域

  • grid-template-areas:通过命名区域定义布局。

  • 语法

    • 每行用引号括起来,列之间用空格分隔。

    • 使用 . 表示空白区域。

示例

.container {
  display: grid;
  grid-template-areas:
    "header header"
    "sidebar main"
    "footer footer";
}
.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }
.footer { grid-area: footer; }

3. 网格间距

  • gap:定义行和列之间的间距(替代 grid-gap)。

  • 语法

    • gap: 10px;(行和列间距均为 10px)。

    • gap: 20px 30px;(行间距 20px,列间距 30px)。

示例

.container {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 20px;  /* 行和列间距均为 20px */
}

4. 对齐方式

  • justify-items:所有项目的水平对齐方式(startendcenterstretch)。

  • align-items:所有项目的垂直对齐方式(startendcenterstretch)。

  • justify-content:整个网格的水平对齐方式(startendcenterspace-between 等)。

  • align-content:整个网格的垂直对齐方式(startendcenterspace-between 等)。

示例

.container {
  display: grid;
  justify-items: center;  /* 所有项目水平居中 */
  align-items: end;       /* 所有项目垂直底部对齐 */
}

3.网格项目属性

1. 项目定位

  • grid-column-start:定义项目起始列位置。

  • grid-column-end:定义项目结束列位置。

  • grid-row-start:定义项目起始行位置。

  • grid-row-end:定义项目结束行位置。

  • 简写

    • grid-column: 1 / 3;(从第 1 列到第 3 列)。

    • grid-row: span 2;(占据两行高度)。

示例

2. 项目对齐

  • justify-self:单个项目的水平对齐方式(startendcenterstretch)。

  • align-self:单个项目的垂直对齐方式(startendcenterstretch)。

示例

.item {
  justify-self: center;  /* 水平居中 */
  align-self: start;     /* 垂直顶部对齐 */
}

3. 项目区域

  • grid-area:将项目放入指定区域(对应 grid-template-areas 中的命名区域)。

示例

.item {
  grid-area: header;  /* 放入名为 header 的区域 */
}

4.高级功能

1. 隐式网格

  • 当项目超出定义的网格范围时,浏览器会自动创建隐式网格。

  • 控制隐式网格

    • grid-auto-rows:定义隐式行的高度。

    • grid-auto-columns:定义隐式列的宽度。

    • grid-auto-flow:定义项目的排列方向(rowcolumndense)。

示例

.container {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  grid-auto-rows: 100px;  /* 隐式行高为 100px */
  grid-auto-flow: dense;  /* 密集排列 */
}

2. 响应式布局

  • auto-fit 和 auto-fill:自动适应列数。

  • minmax():定义列宽或行高的范围。

示例

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

5.典型应用场景

  1. 网页整体布局

    .container {
      display: grid;
      grid-template-areas:
        "header header"
        "sidebar main"
        "footer footer";
      grid-template-rows: 80px auto 100px;
      grid-template-columns: 200px 1fr;
    }
  2. 卡片网格布局

    .container {
      display: grid;
      grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
      gap: 20px;
    }
  3. 复杂报表布局

    .container {
      display: grid;
      grid-template-columns: repeat(4, 1fr);
      grid-template-rows: repeat(3, 100px);
    }

6.最佳实践

  1. 命名网格线

    .container {
      display: grid;
      grid-template-columns: [start] 1fr [middle] 1fr [end];
    }
    .item {
      grid-column: start / middle;
    }
  2. 渐进增强

    @supports (display: grid) {
      .container { display: grid; }
    }
  3. 性能优化

    • 避免过度嵌套网格。

    • 使用 fr 单位代替百分比实现弹性布局。


二、Flex和Grid对比

对比维度FlexGrid
维度一维布局(主轴方向)二维布局(行+列)
定位能力只能控制单行/列精确控制行和列的交叉定位
内容驱动内容优先(根据内容调整布局)容器优先(先定义网格再填充内容)
嵌套需求需要多层嵌套实现复杂布局单层容器即可实现复杂布局
响应式支持需要媒体查询辅助内置 auto-fit/minmax() 等响应式功能
浏览器支持IE10+IE11+(部分属性不支持)
最佳适用场景线性排列、组件内部布局整体页面布局、复杂网格系统
  1. 组合使用原则

    • 使用 Grid 构建宏观布局(页面整体结构)

    • 使用 Flex 处理微观布局(组件内部排列)

  2. 响应式设计技巧

    /* Grid 自动适应列数 */
    .container {
      grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
    }
    
    /* Flex 换行布局 */
    .container {
      display: flex;
      flex-wrap: wrap;
      gap: 20px;
    }
  3. 性能优化

    • 避免过度嵌套布局

    • 优先使用 gap 替代 margin 控制间距

    • 使用 fr 单位代替百分比实现弹性布局

  4. 兼容性处理

    /* Flex 兼容旧版语法 */
    .container {
      display: -webkit-flex;
      display: flex;
    }
    
    /* Grid 渐进增强方案 */
    @supports (display: grid) {
      .container { display: grid; }
    }
  • Flex 是线性布局的终极解决方案,擅长处理单方向的排列对齐。

  • Grid 是二维布局的革命性工具,擅长构建复杂网格系统

  • 现代 Web 开发推荐组合:Grid 搭建骨架,Flex 填充细节


示例:

<!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>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        /* 网格容器定义 */
        .container {
            min-height: 100vh;
            display: grid;
            grid-template-columns: 1fr; /* 移动端默认单列 */
            grid-template-rows: auto auto 1fr auto; /* 行定义:header nav main footer */
            grid-template-areas: 
                "header"
                "nav"
                "main"
                "footer";
        }

        /* 公共样式 */
        .header, .nav, .main, .sidebar, .footer {
            padding: 20px;
            border: 1px solid #ddd;
        }

        /* 各区域定位 */
        .header {
            grid-area: header;
            background: #f8f9fa;
        }

        .nav {
            grid-area: nav;
            background: #e9ecef;
        }

        .main {
            grid-area: main;
            background: #fff;
        }

        .sidebar {
            display: none; /* 移动端默认隐藏侧边栏 */
            background: #f1f3f5;
        }

        .footer {
            grid-area: footer;
            background: #212529;
            color: white;
        }

        /* 导航链接布局 */
        .nav ul {
            list-style: none;
            display: flex;
            gap: 20px;
            justify-content: center;
        }

        /* 平板及以上设备 */
        @media (min-width: 768px) {
            .container {
                grid-template-columns: 250px 1fr; /* 侧边栏 + 主内容 */
                grid-template-rows: auto auto 1fr auto;
                grid-template-areas: 
                    "header header"
                    "nav nav"
                    "sidebar main"
                    "footer footer";
            }

            .sidebar {
                display: block; /* 显示侧边栏 */
            }
        }

        /* 桌面设备 */
        @media (min-width: 1024px) {
            .container {
                grid-template-columns: 300px 1fr 300px; /* 增加侧边栏宽度 */
                grid-template-areas: 
                    "header header header"
                    "nav nav nav"
                    "sidebar main main"
                    "footer footer footer";
            }
        }
    </style>
</head>
<body>
    <div class="container">
        <header class="header">
            <h1>网站标题</h1>
            <p>欢迎来到我的网站</p>
        </header>

        <nav class="nav">
            <ul>
                <li><a href="#">首页</a></li>
                <li><a href="#">产品</a></li>
                <li><a href="#">关于</a></li>
                <li><a href="#">联系</a></li>
            </ul>
        </nav>

        <aside class="sidebar">
            <h3>侧边栏</h3>
            <p>相关链接或广告内容...</p>
        </aside>

        <main class="main">
            <article>
                <h2>文章标题</h2>
                <p>这里是网页的主要内容区域...</p>
                <!-- 更多内容 -->
            </article>
        </main>

        <footer class="footer">
            <p>&copy; 2024 版权所有</p>
        </footer>
    </div>
</body>
</html>

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

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

相关文章

医院挂号预约小程序|基于微信小程序的医院挂号预约系统设计与实现(源码+数据库+文档)

医院挂号预约小程序 目录 基于微信小程序的医院挂号预约系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、小程序用户端 2、系统服务端 &#xff08;1&#xff09; 用户管理 &#xff08;2&#xff09;医院管理 &#xff08;3&#xff09;医生管理 &#xf…

蓝桥杯第十届 特别的数

题目描述 小明对数位中含有 2、0、1、9 的数字很感兴趣&#xff08;不包括前导 0&#xff09;&#xff0c;在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40&#xff0c;共 28 个&#xff0c;他们的和是 574。 请问&#xff0c;在 1 到 n 中&#xff0c;所有这样的数的…

Qt开发:QInputDialog的使用

文章目录 一、QInputDialog的介绍二、 QInputDialog的基本用法三、使用 QInputDialog的实例四、QInputDialog的信号与槽 一、QInputDialog的介绍 QInputDialog 是 Qt 提供的一个对话框类&#xff0c;用于获取用户输入的文本、整数或浮点数。它提供了简单易用的静态方法和可定制…

redis--JavaSpring客户端

目录 一、引言 二、配置 三、相关操作 四、总结 一、引言 本篇文章会将redis与spring项目进行结合&#xff0c;看看再spring项目中&#xff0c;redis是如何使用的 二、配置 三、相关操作 四、总结 在spring项目中的使用和在基础项目上的使用有差异&#xff0c;但是差异并不大…

2、二分和贪心

一、二分 这里有个小技巧&#xff0c;你会发现&#xff0c;只要是求最大最小最多等等的贪心过程&#xff0c;我们就有3种方法&#xff1a;①二分②贪心算法③动态规划 我们先讲二分和贪心&#xff0c;动态规划比较麻烦&#xff0c;留到后期。 1、了解 2、模版 class Solution …

QuecPython 网络协议之TCP/UDP协议最祥解析

概述 IP 地址与域名 IP 地址是网络中的主机地址&#xff0c;用于两台网络主机能够互相找到彼此&#xff0c;这也是网络通信能够成功进行的基础。IP 地址一般以点分十进制的字符串来表示&#xff0c;如192.168.1.1。 ​ 我们日常访问的网站&#xff0c;其所在的服务器主机都有…

ISIS-2 邻居建立关系

上一章我们介绍了ISIS的基础概念以及报文内容和作用在什么样的场景下面的 这一章我们来介绍IS-IS的邻居建立关系 一、概念 IS-IS中路由器的角色可分为L1、L2、L1/2这三种类型其中的L1/L2有点类似与我们OSPF中的ABR IS-IS中的邻居关系分为L1与L2邻居关系,其中所有建立L2邻居关…

Nature Machine Intelligence 嵌入式大语言模型使机器人能够在不可预测的环境中完成复杂的任务

近期英国爱丁堡大学发表Nature Machine Intelligence研究工作&#xff0c;提出了一种名为ELLMER&#xff08;具身大型语言模型支持机器人&#xff09;的创新框架&#xff0c;通过整合大型语言模型&#xff08;如GPT-4&#xff09;、检索增强生成&#xff08;RAG&#xff09;、视…

Springboot整合elasticsearch详解 封装模版 仓库方法 如何在linux里安装elasticsearch

目录 版本 下载地址 ElasticSearch频繁报503错误 开放 9300 和 9200 两个端口 测试联通性 改动包装类 elasticsearchTemplate getAllRespRepository 封装elasticsearchService 业务逻辑 版本 首先要对应版本 这是我在官网找到的版本信息 一定要 springboot 和 es 相…

【矩阵快速幂】P6601 「EZEC-2」机器|普及+

本文涉及知识点 【矩阵快速幂】封装类及测试用例及样例 P6601 「EZEC-2」机器 题目背景 tlx 喜欢科幻小说。 小宇宙中只剩下漂流瓶和生态球。漂流瓶隐没于黑暗里,在一千米见方的宇宙中,只有生态球里的小太阳发出一点光芒。在这个小小的生命世界中,几只清澈的水球在零重力环…

FPGA助力智能机器人应用

今年开年AI机器人引爆科技圈&#xff0c;都说FPGA是“万能芯”&#xff0c;在AI方向上已经挣扎了几年&#xff0c;仍旧不能“破圈”&#xff0c;那么在机器人方向呢&#xff1f; 个人观点我是不太看好目前FPGA能在机器人方面能“破圈”&#xff0c;但是一切皆有可能&#xff0c…

如何在jupyter notebook中使用django框架

(最好以管理员身份进入&#xff0c;否则在安装某些内容时会报错) 一.创建一个名为new_env虚拟环境 输入以下指令创建名为new_env的虚拟环境&#xff1a; conda create -n new_env python3.8 回车&#xff0c;出现以下内容&#xff0c;输入y确认安装&#xff0c;等待安装完毕…

Axure RP9.0教程: 多级联动【设置选项改变时->情形->面板状态】(给动态面板元件设置相关交互事件的情形,来控制其他面板不同的状态。)

文章目录 引言I 多级联动(省、市、区)实现思路添加三省、市、区下拉列表给省下拉框添加数据源将市、区下拉框添加不同状态,分别以省、市命名给省下拉控件设置选项改变时的交互事件省下拉控件的交互事件情形市下拉交互事件的配置II 知识扩展: 展示省 → 地级市 → 区县的多级…

Rabbitmq消息被消费时抛异常,进入Unacked 状态,进而导致消费者不断尝试消费(下)

一、消费流程图 消息在消费出现异常的时候&#xff0c;将一直保留在消息队列&#xff0c;所以你会看到以下奇怪的现象&#xff1a; 消息队列仅有5个消息&#xff0c; 投递速度也非常快&#xff0c;结果却一直无法消费掉。 二、重试策略 重试机制的使用场景&#xff1a;重试机制…

AI 的“幻觉”现象:深入解析 Hallucination 的成因与应对之道

文章目录 一、啥是 AI 的 Hallucination&#xff1f;二、啥时候容易出现幻觉&#xff1f;1. 知识边界之外的问题2. 模糊或不明确的输入3. 生成长篇内容4. 多模态任务中的误解5. 过度自信的语气要求 三、幻觉为啥会出现&#xff1f;原理是啥&#xff1f;1. 概率预测的本质2. 训练…

核心知识——论文详解

引入 在2010年&#xff0c;来自Berkeley的博士生 Matei Zaharia 发表了一篇论文《Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing》。伴随着这篇论文的&#xff0c;是一个开源系统&#xff0c;也就是 Spark。在之后的几年里&…

LeetCode hot 100 每日一题(15)——48.旋转图像

这是一道难度为中等的题目&#xff0c;让我们来看看题目描述&#xff1a; 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 提示…

屏幕后处理Post-Processing安装及使用

一、安装Post-Processing插件 在 Window --- PackageManager 中搜索并安装 Post-Processing 二、添加后处理效果步骤 给场景中的相机Camera添加 Post - process Layer&#xff0c;只有添加了该组件的相机才会进行相应的后处理&#xff0c;此组件允许您为该后处理层配置抗锯齿…

探索Halo:不止是博客,更是创作新宇宙

开篇&#xff1a;邂逅 Halo 作为一名热爱写作与分享的博主&#xff0c;拥有一个称手的博客系统一直是我的追求。在探索博客系统的旅程中&#xff0c;我尝试过不少平台&#xff0c;从 WordPress 到 Hexo &#xff0c;每一次转换都是为了寻找那个最完美的 “写作伴侣”。 WordP…

吐血整理:Air8201如何使用LuatOS进行电源管理功能!

在物联网应用场景中&#xff0c;设备续航能力直接影响其部署成本与运维效率。LuatOS操作系统通过软件层面的精细化控制&#xff0c;为Air8201提供了灵活且高效的电源管理策略。本文将从系统架构、API接口、实战配置三个维度&#xff0c;解析如何利用LuatOS实现Air8201的智能电源…