当前位置: 首页 > news >正文

CSS——网格布局(display: grid)之下篇

CSS——网格布局(display: grid)之下篇

前面我们介绍了网格布局的基础的创建以及一些比较基础的属性,下面我们将介绍网格布局的剩余部分,还将结合实例来进行细致的讲解(图文并茂,生动形象有内涵)。

显式网格和隐式网格

显式网格:是指在CSS中明确定义的网格轨道。包括在 grid-template-rowsgrid-template-columns 属性中指定的行和列。显示网格的大小和位置是固定的,由开发者在CSS中明确指定。

隐式网格:指在显示网格之外自动创建的网格轨道。当网格项没有足够的显示网格轨道来容纳时,浏览器会自动创建额外的轨道来放置这些网格项。隐式网格的大小和位置是自动计算的,基于网格项的需求和网格容器的尺寸。

如果网格元素放在声明的网格轨道之外,就会创建隐式轨道,直到包含该元素
如果网格元素放在声明的网格轨道之外,就会创建隐式轨道,直到包含该元素(如上图所示),同时在指定网格线的时候,隐式网格轨道不会改变负数的含义。负的网格线编号仍然是从显式网格的右下开始的。
隐式网格轨道默认的大小为auto,也就是它们会扩展到能容纳自身的宽度(包含内容、内边距、边框和外边距)。下面介绍三个与之相关的属性。

grid-auto-flow 属性

首先来看取值吧:

grid-auto-flow: row;
grid-auto-flow: column;
grid-auto-flow: dense;
grid-auto-flow: row dense;
grid-auto-flow: column dense; 

其中:

  • row
    多的格子一行一行陈列。默认值。
  • column
    多的格子一列一列排列。
  • dense
    多的格子空白填充。

row 与 column 之分

如果我们创建一个网格布局,可以看到,网格元素之间是默认占满一行,然后一个挨着一个地向下排列的。

 <style>.container {display: grid;}.item {background-color: #ccc;}</style><body><main 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></main>
</body>

在这里插入图片描述
如果此时我们为网格容器添加grid-template-columns: 1fr 1fr,使之分为两列,可以看到:这些盒子在填满本行之后,才去换行显示。那你可能会说了:“这不是理所当然的吗?”,嘿嘿,这可没有那么简单,这是因为grid-auto-flow属性默认设置为row,即默认先填充横向,再填充纵向
在这里插入图片描述
如果我们修改grid-auto-flow: column

 <style>.container {display: grid;grid-template-columns: 1fr 1fr;grid-auto-flow: column;}.item{background-color: #ccc;}</style><body><main 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></main>
</body>

那么会产生如下的效果:
在这里插入图片描述
原因是:我们设置了grid-auto-flow: column,故就先纵向填满,然而我们没有明确的划分出行数,所以就默认仅有初始元素所在的第一行,这就导致所有的子元素会横向排列成一行,后面的第3、4、5列没有划分大小,所以他们就fit-content,然后剩下的第1、2列平分剩下的空间( fr单位的优先级是最低的,优先级顺序以及fit-content的解释可以看CSS——网格布局(display: grid)之上篇)。

dense 的作用

dense 翻译为稠密的,我们打个比方,如果有一片四四方方的农田,每家每户都各自分有一块,一开始大家都在种。如下图:
在这里插入图片描述
直到有一天,中间的一块田的主人王老二进城打工了,这片田就荒废了,远远望去,中间秃了一块。如下图:
在这里插入图片描述

村里人看到王老二进城打工赚大钱了,也就纷纷效仿,渐渐的,原本整整齐齐的一大块地,变得稀稀拉拉的。如下图:
在这里插入图片描述

这时候村长说了,“现在的地太分散了,为了方便管理,我们重新规划一下地块”。经过又一年的种植,如下图:
在这里插入图片描述

大家发现,村长让原本分散的地块变得稠密了,于是就给村长起了个外号“dense”。

我们再用代码演示:我们设置第一个元素在第二列的位置

 <style>.container {display: grid;grid-template-columns: 1fr 1fr;grid-template-rows: 1fr 1fr;}.item{background-color: #ccc;}.item:nth-child(1) {grid-column: 2 / 3;}</style><body><main 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></main>
</body>

可以看到,左上角的位置空出来了(变得稀疏了)
在这里插入图片描述
这时,我们添加grid-auto-flow: dense(row是默认的),会看到:2号盒子填补了空缺的位置
在这里插入图片描述
如果我们设置了 grid-auto-flow: column dense,那么就会是以下的效果:
在这里插入图片描述
嗯,dense就是这样的,稍后实例中会用到。

P.S. 貌似有一个bug,如果在明确指定了某个子元素不在其默认位置时,浏览器渲染时会默认产生dense的效果。何为明确与不明确呢?比如刚才grid-column: 2 / 3仅指定了子元素的列的位置,没指定行的位置,那么这就算不明确指定;如果grid-column: 2 / 3 & grid-row: 1 /2或者 gird-area: A,这个元素的位置是确定的,那么这就算明确指定,在此时,浏览器渲染时会默认产生 dense 的效果。

grid-auto-columns & grid-auto-rows 属性

前面我们看到,在仅规定两列的情况下,隐式网格轨道的大小是 fit-content的,grid-auto-columns & grid-auto-rows 两个属性就是规定了隐式轨道的大小。
在这里插入图片描述

实战强化

注意:下面的部分会用到Flexbox(弹性盒子)布局部分的知识,该部分内容可以参考本人的另一篇文章CSS——弹性盒子布局(display: flex)

目标效果

下面我们要实现一个如下图的效果
在这里插入图片描述
我们可以看到图片有大有小,但是它们却能够网格对齐,仔细看还会发现,它们的顺序不是按照从左到右排序的,这个可以先联系一下 grid-auto-flow: dense

步骤

创建网格布局
<style>body {background-color: rgb(254, 226, 181);font-family: Helvetica, Arial, sans-serif;}.portfolio {display: grid;grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));grid-gap: 1em;}.portfolio>figure {margin: 0;}.portfolio img {max-width: 100%;}.portfolio figcaption {padding: 0.3em 0.8em;background-color: rgba(0, 0, 0, 0.5);color: #fff;text-align: right;}.portfolio .featured {grid-row: span 2;grid-column: span 2;}</style><body><div class="portfolio"><figure class="featured"><img src="./images/pic1.jpg" alt=""><figcaption>1</figcaption></figure><figure><img src="./images/pic2.jpg" alt="" /><figcaption>2</figcaption></figure><figure><img src="./images/pic3.jpg" alt="" /><figcaption>3</figcaption></figure><figure class="featured"><img src="./images/pic4.jpg" alt="" /><figcaption>4</figcaption></figure><figure><img src="./images/pic5.jpg" alt="" /><figcaption>5</figcaption></figure><figure class="featured"><img src="./images/pic6.jpg" alt="" /><figcaption>6</figcaption></figure><figure><img src="./images/pic7.jpg" alt="" /><figcaption>7</figcaption></figure><figure class="featured"><img src="./images/pic8.jpg" alt="" /><figcaption>8</figcaption></figure></div>
</body>

我们创建以上的网格布局是这样的:
在这里插入图片描述
其中,我们通过grid-template-columns: repeat(auto-fit, minmax(200px, 1fr))创建了自适应布局,会根据视口的大小自动分配列数,但是每列的最小宽度不会低于200px。

这时候我们发现,容器内部比较稀疏,所以我们想到了grid-auto-flow: dense,为网格容器添加了以上属性之后的效果如下:
在这里插入图片描述
我们会发现2、3号是对齐的,但是5、7号以及6、8号是没有对齐的,这是因为在默认情况下,网格元素会扩展到网格单元的大小,但是其子元素不会自动扩展,在这里,网格元素是 <figure>元素,它会自动扩展,但是它的子元素<img><figcaption>不会扩展,网格肯定是对齐的,但是由于以上原因,导致网格单元内部出现了空余部分,如下图:
在这里插入图片描述

使网格单元内部所有元素拉伸

这时候我们想到了前面的 Flexbox(弹性盒子)布局,它能够实现其直接子元素自动扩展(与网格布局类似)。所以我们添加以下代码:

.portfolio>figure {margin: 0;display: flex;flex-direction: column;
}

我们首先将<figure>设置成弹性盒子,让其主轴方向为竖直,那么其子元素就可以实现在竖直方向上的扩展。效果如下:
在这里插入图片描述
我们发现,这里除了<figcaption><img> 元素之间的间距没了,其余的还是没有变化,嘿嘿,这是为什么呢?
当然是我们忘记给子元素设置flex属性了,可以看到,flex-grow默认值是 0即默认不会放大。
在这里插入图片描述
所以我们为子元素设置该属性(建议使用简写,原因见本人的 flex文章,链接在本节开始部分):flex: 1,我们不希望<figcaption>也随之放大,所以我们只为<img>添加该属性。

figure>img{flex: 1;
}

效果如下:
在这里插入图片描述
以上看起来以上效果很好了(嗯,我也觉得),前面消失的<img>元素与<figcaption>之间间距我就不追加了,不过有时候要考虑<img>图片的缩放问题。

一个被拉伸的<img>元素的小细节

在前面我们将<img>元素拉伸以填充满父元素,但是这样这会改变图片的宽高比,导致图片变形。好在 CSS 为控制这一行为提供了一个特殊属性 object-fit。默认情况下,一个<img>object-fit 属性值为 fill,也就是说整个图片会缩放,以填满<img>元素。我们也可以设置其他值改变默认行为。
比如,object-fit 属性的值还可以是 covercontain。这些值告诉浏览器,在渲染盒子里改变图片的大小,但是不要让图片变形。

  • cover:扩展图片,让它填满盒子(导致图片一部分被裁剪)。
  • contain:缩放图片,让它完整地填充盒子(导致盒子里出现空白)。
    在这里插入图片描述

这里,我为了保持画面的整体性,默认采用了 object-fit: fill。可以根据需求和具体情况,选择适合的值。

这里有两个概念要区分清楚:盒子(由<img>元素的宽和高决定)和渲染的图片。默认情况下,这二者大小相等。object-fit 属性让我们能在盒子内部控制渲染图片的大小,同时保持盒子的大小不变。

完整代码如下:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>网格布局的实战</title><style>body {background-color: rgb(254, 226, 181);font-family: Helvetica, Arial, sans-serif;}.portfolio {display: grid;grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));grid-auto-flow: row dense;grid-gap: 1em;}.portfolio>figure {margin: 0;display: flex;flex-direction: column;}figure>img {flex: 1;object-fit: fill;}.portfolio img {max-width: 100%;}.portfolio figcaption {padding: 0.3em 0.8em;background-color: rgba(0, 0, 0, 0.5);color: #fff;text-align: right;}.portfolio .featured {grid-row: span 2;grid-column: span 2;}</style>
</head><body><div class="portfolio"><figure class="featured"><img src="./images/pic1.jpg" alt=""><figcaption>1</figcaption></figure><figure><img src="./images/pic2.jpg" alt="" /><figcaption>2</figcaption></figure><figure><img src="./images/pic3.jpg" alt="" /><figcaption>3</figcaption></figure><figure class="featured"><img src="./images/pic4.jpg" alt="" /><figcaption>4</figcaption></figure><figure><img src="./images/pic5.jpg" alt="" /><figcaption>5</figcaption></figure><figure class="featured"><img src="./images/pic6.jpg" alt="" /><figcaption>6</figcaption></figure><figure><img src="./images/pic7.jpg" alt="" /><figcaption>7</figcaption></figure><figure class="featured"><img src="./images/pic8.jpg" alt="" /><figcaption>8</figcaption></figure></div>
</body></html>

结尾

创作不易,感谢喜欢和支持,如有错误,恳请指出,希望与大家共同进步。

相关文章:

CSS——网格布局(display: grid)之下篇

CSS——网格布局&#xff08;display: grid&#xff09;之下篇 前面我们介绍了网格布局的基础的创建以及一些比较基础的属性&#xff0c;下面我们将介绍网格布局的剩余部分&#xff0c;还将结合实例来进行细致的讲解&#xff08;图文并茂&#xff0c;生动形象有内涵&#xff0…...

低势期操作

《周易》讲事务发展有六个阶段&#xff1a; 第一阶段&#xff1a;潜龙勿用。 第二阶段&#xff1a;见龙在田。 第三阶段&#xff1a;终日乾乾。 第四阶段&#xff1a;或跃在渊。 第五阶段&#xff1a;飞龙在天。 第六阶段&#xff1a;亢龙有悔。 现在大环境不好&#xff…...

IMS 呼叫流程(详细)

目录 业务模型 典型组网如图1所示 信令流程 具体的语音流程如图2所示 主叫信令面流程 01:UE_A->P-CSCF/ATCF 02:P-CSCF/ATCF_A->PCRF_A 03:PCRF_A->PCSCF/ATCF_A 04:P-CSCF/ATCF_A 处理(把S-CSCF加到Route) 05:S-CSCF_A->MMTel AS/SCC AS_A 06:MM…...

系统架构设计师:系统架构设计

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 系统架构设计师:系统架构设计前言软件架构设计与生命周期SA 实现阶段主要关注的内容A…...

win11不显示已经打开的窗口

...

数学建模常用模型全面总结(含适用条件、优点、局限性和应用场景)

目录 1. 代数模型&#xff08;Algebraic Models&#xff09;2. 微分方程模型&#xff08;Differential Equation Models&#xff09;3. 概率模型&#xff08;Probabilistic Models&#xff09;4. 优化模型&#xff08;Optimization Models&#xff09;5. 统计模型&#xff08;S…...

RabbitMQ消费者确认和重复机制

消费者确认机制 为了确认消费者是否成功处理消息&#xff0c;RabbitMQ提供了消费者确认机制&#xff08;Consumer Acknowledgement&#xff09;。即&#xff1a;当消费者处理消息结束后&#xff0c;应该向RabbitMQ发送一个回执&#xff0c;告知RabbitMQ自己消息处理状态。回执…...

【Verilog学习日常】—牛客网刷题—Verilog企业真题—VL77

编写乘法器求解算法表达式 描述 编写一个4bit乘法器模块&#xff0c;并例化该乘法器求解c12*a5*b&#xff0c;其中输入信号a,b为4bit无符号数&#xff0c;c为输出。注意请不要直接使用*符号实现乘法功能。 模块的信号接口图如下&#xff1a; 要求使用Verilog HDL语言实现以上…...

thinkPHP 8.0.4 安装

windows 上安装最新版 thinkPHP8.0.4 下载phpStudy V8.1&#xff1a;小皮面板安装Composer2.x&#xff0c;Composer是PHP的一个依赖管理工具&#xff0c;主要功能包括依赖管理、版本控制、自动加载、扩展开发以及集成其他工具。安装 php8.0.2 4. 网站-管理-compose&#xff0c…...

在k8s中,客户端访问服务的链路流程,ingress--->service--->deployment--->pod--->container

ingress是一个API资源。 其核心作用是nginx网页服务器。 当客户端访问服务器不同的url时, 用不同的location提供服务。 在k8s之外&#xff0c;nginx的配置一般如下&#xff1a; http {server {listen 80;server_name localhost;location / {root html; …...

寄存器二分频电路

verilog代码 module div2_clk ( input clk, input rst,output clk_div);reg clk_div_r; assign clk_div clk_div_r;always(posedge clk) beginif(rst)beginclk_div_r < 1b0;endelsebeginclk_di…...

Kafka3.8.0+Centos7.9的安装参考

Kafka3.8.0Centos7.9的安装参考 环境准备 操作系统版本&#xff1a;centos7.9 用户/密码&#xff1a;root/1qazXSW 主机名 IP地址 安装软件 下载地址 k1 192.168.207.131 jdk1.8zookeeper3.9.2kafka_2.13-3.8.0efak-web-3.0.1 1&#xff09; Java Downloads | Oracle …...

Redis——持久化策略

Redis持久化 Redis的读写操作都是在内存上&#xff0c;所以Redis性能高。 但是当重启的时候&#xff0c;或者因为特殊情况导致Redis崩了&#xff0c;就可能导致数据的丢失。 所以Redis采取了持久化的机制&#xff0c;重启的时候利用之间持久化的文件实现数据的恢复。 Redis提…...

并查集LRU cache

并查集的定义 将n个不同的元素划分成一些不相交的集合。开始时&#xff0c;每个元素自成一个单元素集合&#xff0c;然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这类问题的抽象数据类型称为并查集(unio…...

SpringCloud的学习(三),Resilience4j

CircuitBreaker断路器 “断路器”本身是一种开关装置&#xff0c;当某个服务单元发生故障之后&#xff0c;通过断路器的故障监控&#xff08;类似熔断保险丝&#xff09;&#xff0c;向调用方返回一个符合预期的、可处理的备选响应(FallBack)&#xff0c;而不是长时间的等待或…...

【计算机网络篇】计算机网络概述

本文主要介绍计算机网络第一章节的内容&#xff0c;文中的内容是我认为的重点内容&#xff0c;并非所有。参考的教材是谢希仁老师编著的《计算机网络》第8版。跟学视频课为河南科技大学郑瑞娟老师所讲计网。 文章目录 &#x1f3af;一.计算机网络的组成 ✨主要内容 1.边缘部…...

UDS诊断-面试题2

bilibili视频推荐&#xff1a; 车载测试面试题UDS诊断协议&#xff0c;你知道什么是UDS诊断&#xff1f;ECU是什么&#xff1f;刷写ECU_哔哩哔哩_bilibili 总结&#xff1a; 1.汽车诊断UDS含义&#xff1a; 一套统一的诊断服务命令。 2.具体操作流程&#xff1a; 使用电脑…...

ovirt error: Network not found: no network with matching name ‘vdsm-ovirtmgmt‘

Ovirt Node节点启动vm出现 error: Network not found: no network with matching name ‘vdsm-ovirtmgmt’ 错误的常见情况有以下几种&#xff1a;常见情况有以下几种&#xff1a; 网络配置丢失或未正确配置&#xff1a; ○ 在 oVirt 或 libvirt 环境中&#xff0c;如果网络配…...

2024百度的组织架构和产品分布

百度2024年的组织架构主要分为以下几个事业群组&#xff0c;每个事业群组负责不同的产品和服务&#xff1a; 一、智能云事业群组&#xff08;ACG&#xff09; 主要产品与服务&#xff1a; 百度云&#xff1a;提供云计算、存储、大数据处理等服务。AI云服务&#xff1a;包括语…...

Java中List、ArrayList与顺序表

List、ArrayList与顺序表 List什么是List常用方法介绍List的使用 ArrayList与顺序表线性表顺序表接口的实现 ArrayList简介ArrayList的使用ArrayList的构造ArrayList的常见操作ArrayList的遍历ArrayList的扩容机制 ArrayList的具体使用杨辉三角简单的洗牌算法 ArrayList的问题及…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...

Modbus RTU与Modbus TCP详解指南

目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...

AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)

Name&#xff1a;3ddown Serial&#xff1a;FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名&#xff1a;Axure 序列号&#xff1a;8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...