百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 文章教程 > 正文

基于 CSS Grid 实现跨行跨列布局

xsobi 2024-11-23 10:47 1 浏览

CSS Grid 是一种强大的布局系统,允许开发者通过简单的规则定义复杂的网格布局。在开发中,使用 CSS Grid 可以轻松实现元素的跨行跨列功能,这对于创建灵活、响应式的布局非常有用。本篇博客将详细讲解如何通过 CSS Grid 实现跨行跨列布局,包括基本概念、常见场景、实现方式以及一些注意事项。


一、CSS Grid 基本概念

CSS Grid 布局是一种二维的网格系统,允许我们同时在行和列方向上控制元素的布局。网格由 行(rows)列(columns) 组成,每个网格项(grid item)都可以被放置在网格中的特定位置上。

  • 网格容器(Grid Container): 包含所有网格项的父容器。
  • 网格项(Grid Item): 容器内的子元素,布局时可以指定其在网格中的位置和跨越的行、列数。

使用 display: grid; 可以创建一个网格容器,随后通过定义 grid-template-columns 和 grid-template-rows 来控制列宽和行高。

二、跨行跨列的原理

在 CSS Grid 中,可以通过以下属性来实现元素的跨行和跨列:

  • 跨列:使用 grid-column 属性,它指定网格项从哪个列开始、跨越多少列。
    • grid-column-start:元素在哪一列开始。
    • grid-column-end:元素在哪一列结束。
  • 跨行:使用 grid-row 属性,它指定网格项从哪一行开始、跨越多少行。
    • grid-row-start:元素在哪一行开始。
    • grid-row-end:元素在哪一行结束。

属性 grid-column 和 grid-row 允许我们指定开始和结束值,从而实现跨越多行或多列的布局。


三、跨行跨列的实现

1. 创建基础的 Grid 布局

首先,我们创建一个 3 列 3 行的网格布局,定义列宽和行高。

.container {
  display: grid;
  grid-template-columns: repeat(3, 1fr); /* 3 列,等宽 */
  grid-template-rows: repeat(3, 100px); /* 3 行,每行 100px */
  gap: 10px; /* 设置网格项之间的间距 */
}

.item {
  background-color: lightblue;
  border: 1px solid #333;
  display: flex;
  justify-content: center;
  align-items: center;
  font-size: 18px;
}

HTML 结构如下:

<div class="container">
  <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 class="item">7</div>
  <div class="item">8</div>
  <div class="item">9</div>
</div>

此时每个 .item 将按顺序占据 3x3 网格中的一个格子。

2. 跨列布局

假设我们希望第 1 个网格项(item 1)占据第一行的两列。我们可以通过 grid-column 属性来实现:

.item:nth-child(1) {
  grid-column: span 2; /* 跨越 2 列 */
}

此时,item 1 将跨越第 1 列和第 2 列,横跨两个列宽。

3. 跨行布局

同样,如果希望 item 4 跨越两行,可以使用 grid-row 属性:

.item:nth-child(4) {
  grid-row: span 2; /* 跨越 2 行 */
}

此时,item 4 将占据第 2 列和第 3 列,并向下扩展到第 3 行。

4. 同时跨行跨列

我们还可以同时让一个网格项跨越多行和多列。比如让 item 7 同时跨越两行和两列:

.item:nth-child(7) {
  grid-column: span 2; /* 跨越 2 列 */
  grid-row: span 2;    /* 跨越 2 行 */
}

此时,item 7 将占据左下角的四个格子。

四、具体示例

我们可以通过一个综合示例来展示跨行跨列布局的效果。

:root {
            --bg-color: #646cff;
        }
        .container {
            display: grid;
            grid-template-columns: repeat(4, 1fr); /* 4 列 */
            grid-template-rows: repeat(5, 100px);  /* 5 行 */
            gap: 10px;
            color: #f0f0f0;
        }

        .item {
            background-color: var(--bg-color);
            border: 1px dotted red;
            display: flex;
            justify-content: center;
            align-items: center;
            font-size: 18px;
        }

        .item:nth-child(1) {
            grid-column: span 2; /* 跨 2 列 */
        }

        .item:nth-child(3) {
            grid-column: 3 / 5;  /* 从第 3 列开始,跨到第 5 列 */
        }

        .item:nth-child(5) {
            grid-row: span 2;    /* 跨 2 行 */
        }

        .item:nth-child(7) {
            grid-column: span 2; /* 跨 2 列 */
            grid-row: span 2;    /* 跨 2 行 */
        }

HTML:

<div class="container">
  <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 class="item">7</div>
  <div class="item">8</div>
</div>

结果展示:


  • item 1 将跨越第一行的前两列。
  • item 3 将从第三列跨到第四列。
  • item 5 将从第二行开始,跨越两行。
  • item 7 将占据最右下角的四个格子。

五、注意事项

  1. 轨道系统:CSS Grid 使用的是轨道系统(grid lines),grid-column 和 grid-row 的值是基于网格线的索引(从 1 开始)。例如 grid-column: 1 / 3; 表示从第 1 列开始到第 3 列结束(不含第 3 列)。
  2. 自动填充:在某些场景下,未指定具体位置的网格项会根据剩余的空间自动排列。跨行或跨列时,要确保网格项的位置不会和其他项目冲突。
  3. 响应式布局:利用 auto 和 fr 等单位可以实现响应式网格布局,使得跨行跨列的项目在不同屏幕下仍然保持良好的布局效果。

六、总结

CSS Grid 提供了一种直观且强大的跨行跨列布局方式,通过简单的 grid-column 和 grid-row 属性,可以实现复杂的网页布局。无论是在静态网页还是响应式设计中,CSS Grid 都是一种非常灵活的布局工具。

相关推荐

js向对象中添加元素(对象,数组) js对象里面添加元素

一、添加一个元素对象名["属性名"]=值(值:可以是一个值,可以是一个对象,也可以是一个数组)这样添加进去的元素,就是一个值或对象或数组...

JS小技巧,如何去重对象数组?(一)

大家好,关于数组对象去重的业务场景,想必大家都遇到过类似的需求吧,这对这样的需求你是怎么做的呢。下面我就先和大家分享下如果是基于对象的1个属性是怎么去重实现的。方法一:使用.filter()和....

「C/C++」之数组、vector对象和array对象的比较

数组学习过C语言的,对数组应该都不会陌生,于是这里就不再对数组进行展开介绍。模板类vector模板类vector类似于string,也是一种动态数组。能够在运行阶段设置vector对象的长度,可以在末...

如何用sessionStorage保存对象和数组

背景:在工作中,我将[{},{}]对象数组形式,存储到sessionStorage,然后ta变成了我看不懂的形式,然后我想取之用之,发现不可能了~记录这次深刻的教训。$clickCouponIndex...

JavaScript Array 对象 javascript的array对象

Array对象Array对象用于在变量中存储多个值:varcars=["Saab","Volvo","BMW"];第一个数组元素的索引值为0,第二个索引值为1,以此类推。更多有...

JavaScript中的数组Array(对象) js array数组

1:数组Array:-数组也是一个对象-数组也是用来存储数据的-和object不同,数组中可以存储一组有序的数据,-数组中存储的数据我们称其为元素(element)-数组中的每一个元素都有一...

数组和对象方法&amp;数组去重 数组去重的5种方法前端

列举一下JavaScript数组和对象有哪些原生方法?数组:arr.concat(arr1,arr2,arrn);--合并两个或多个数组。此方法不会修改原有数组,而是返回一个新数组...

C++ 类如何定义对象数组?初始化数组?linux C++第43讲

对象数组学过C语言的读者对数组的概念应该很熟悉了。数组的元素可以是int类型的变量,例如int...

ElasticSearch第六篇:复合数据类型-数组,对象

在ElasticSearch中,使用JSON结构来存储数据,一个Key/Value对是JSON的一个字段,而Value可以是基础数据类型,也可以是数组,文档(也叫对象),或文档数组,因此,每个JSON...

第58条:区分数组对象和类数组对象

示例设想有两个不同类的API。第一个是位向量:有序的位集合varbits=newBitVector;bits.enable(4);bits.enable([1,3,8,17]);b...

八皇后问题解法(Common Lisp实现)

如何才能在一张国际象棋的棋盘上摆上八个皇后而不致使她们互相威胁呢?这个著名的问题可以方便地通过一种树搜索方法来解决。首先,我们需要写一个函数来判断棋盘上的两个皇后是否互相威协。在国际象棋中,皇后可以沿...

visual lisp修改颜色的模板函数 怎么更改visual studio的配色

(defunBF-yansemokuai(tuyuanyanse/ss)...

用中望CAD加载LISP程序技巧 中望cad2015怎么加载燕秀

1、首先请加载lisp程序,加载方法如下:在菜单栏选择工具——加载应用程序——添加,选择lisp程序然后加载,然后选择添加到启动组。2、然后是添加自定义栏以及图标,方法如下(以...

图的深度优先搜索和广度优先搜索(Common Lisp实现)

为了便于描述,本文中的图指的是下图所示的无向图。搜索指:搜索从S到F的一条路径。若存在,则以表的形式返回路径;若不存在,则返回nil。...

两个有助于理解Common Lisp宏的例子

在Lisp中,函数和数据具有相同的形式。这是Lisp语言的一个重大特色。一个Lisp函数可以分析另一个Lisp函数;甚至可以和另一个Lisp函数组成一个整体,并加以利用。Lisp的宏,是实现上述特色的...