搜索

CSS 教学

基本介绍

认识 CSS 开始使用 CSS CSS 语法规则 CSS 命名原则 CSS 常用样式属性

CSS 选择器

认识 CSS 选择器 优先级 ( 权重 ) 样式继承与联集 使用巢状结构语法 元素选择器 ID 和 Class 选择器 属性选择器 文件结构选择器 虚拟类别选择器 ( 结构 ) 虚拟类别选择器 ( 类型 ) 虚拟类别选择器 ( 输入 ) 虚拟类别选择器 ( 行为 ) 虚拟类别选择器 ( 超链接 ) 虚拟类别选择器 ( 逻辑 ) 虚拟类别选择器 ( 其他 ) 虚拟元素选择器 群组与组合选择器

数值与单位

全域关键字与文字数值 长度与角度单位 位置名称与时间单位 特殊样式属性 ( all、appearance)

规则与定义

变数 ( Variables ) 媒体查询 ( @media ) 容器查询 ( @container ) 自订属性值 ( @property ) 导入样式 ( @import ) 分层优先级 ( @layer ) 选择器作用域 ( @scope ) 定义字型 ( @font-face ) 计数规则 ( @counter-style ) 打印网页 ( @page )

函数类型

数学计算 文字与清单计数 形状与线段 路径 ( path )

颜色与滤镜

颜色单位 色彩模型 相对颜色 渐层色 图像滤镜 ( filter ) 背景滤镜 ( backdrop-filter ) 混合模式 ( mix-blend-mode )

文字与段落

设定字型 ( font-family ) 使用外部字型 文字尺寸 文字样式 ( 常用 ) 文字样式 ( 其他实用 ) 文字样式 ( 特殊用途 ) 文字换行 文字空白与 Tab 大小 文字行高与缩排 文字水平与垂直对齐 文字书写方向 文字自动分栏 使用 Color Font ( 彩色字型 ) 使用 Icon Font ( 图示文字 ) 制作自己的 Icon Font 显示生成内容与引号

元素容器

容器显示类型 ( display ) 元素 display 对照表 盒子模型 ( Box Model ) 宽高尺寸 ( width、height ) 显示与比例 ( box-sizing、aspect-ratio ) 内边距 ( padding ) 外边界 ( margin ) 边框 ( border ) 边框圆角 ( border-radius ) 图像边框 ( border-image ) 轮廓 ( outline ) 内容溢出与裁切 ( overflow ) 内容范围 ( contain ) 可见性与透明度 缩放与调整 ( zoom、resize )

背景与阴影

背景 ( 背景色、背景裁切 ) 背景图 ( 定位、尺寸 ) 背景图 ( 固定、重复 ) 背景图 ( 多重背景、混合 ) 背景缩写 ( background ) 容器阴影 ( box-shadow )

清单与表格

清单样式 清单计数器 表格基本样式 表格边框重叠与间距 表格内容宽度与对齐

基本排版与定位

元素排版方式 浮动 ( float ) 浮动形状 ( shape-* ) 定位 ( position ) 逻辑属性 ( logical properties ) 重置 CSS ( Reset CSS ) 水平置中技巧 垂直置中技巧

Flex 弹性排版

Flexbox 弹性盒子 Flex 对齐方式 Flex 弹性伸缩

Grid 网格排版

Grid 网格容器与格线 Grid 网格空间与命名 Grid 网格流向与间距 Grid 排列网格项目 Grid 项目对齐与顺序

转场与动画

转场 ( transition ) 转场触发事件 动画 ( animation ) 自订动画路径 ( offset ) 动画触发事件 多重动画的权重与顺序 动画进度控制 ( timeline )

变形、裁切与遮罩

裁切路径 ( clip-path ) 图像遮罩 ( mask ) 对象填满方式与定位 转换函数 ( transform ) 平移、旋转与缩放 3D 转换与透视

视窗与用户行为

卷轴样式 ( scrollbar ) 拉霸、滑杆样式 ( slider ) 鼠标光标图示 ( cursor ) 鼠标事件 ( pointer-events ) 用户选取 ( user-select ) 卷动行为 ( scroll、overscroll ) 打印换页 ( break-* )

CSS 预处理器

认识 CSS 预处理器 Less ( 安装、开始使用 ) Less ( 巢状结构、选择器 ) Less ( 变数、import ) Less ( Extend、Mixin ) Less ( 逻辑、循环、函数 )

范例效果

CSS 多重绕圈 3D 动画 CSS 圆饼图 CSS 跑马灯 Google 加载动画 电子时钟数字 渐层色的转场与动画 渐层色制作星空背景 渐层色边框 渐层色制作图案背景 不规则形状动画 弹跳的正方形动画 3D 正多面体 超链接底线动画效果 恶心黏黏球效果 CSS 视差滚动效果 卷轴控制放射形选单 卷轴改变文字背景色 CSS 页面卷动进度条 CSS 水波效果 圆点加载动画 ( 阴影动画 ) 字母翻牌效果 探照灯动画 立体双色跑马灯 楼梯文字动态效果 渐层色文字、双色文字 流动色彩文字 空心文字、文字水波背景 左右倾斜的背景效果 Icon 图示形状变换 故障文字效果 按钮的多种 hover 效果 点击展开或收折的选单 点击爱心图案放射效果 纯 CSS 数字加载进度条 纯 CSS 码表 ( 可计时 )

Grid 网格容器与格线

Grid 网格排版是一种相当强大又具有弹性的排版系统,不仅可产生类似表格的排版机制,也具有延展或重复的功能,当网页元素转换为“Grid 网格容器”之后,就能借由各种 Grid 相关样式属性进行排版,这篇教学会介绍什么是 Grid 网格容器,以及构成网格的 grid-template-columns、grid-template-rows 等格线样式属性。

相关文章:Grid 网格空间与命名、Grid 网格流向与间距、Grid 排列网格项目、Grid 网格项目对齐、顺序与对齐

快速导览:

CSS 教学 - 使用 Grid 网格容器

认识网格容器 Grid

当元素的 display 显示类型设定为 Grid 或 inline-grid 时,该元素就变成了“网格容器 Grid container”,网格容器里的所有子元素都会变成“网格项目 Grid item”( 子元素里的子元素不会变成网格项目 ),将整个网格容器和网格项目组合起来,就会形成类似“表格”的排版方式,相关说明如下:

网格元素 元素 说明
网格容器 设定 grid 的元素 表现和 block 相同,强制换行。
网格容器 设定 inline-grid 的元素 表现和 inline-block 相同,不换行。
网格项目 网格容器的子元素 ( 不包含子元素的子元素 ) 按照网格的设定进行排列。

下方范例将五个 div 分别设定成不同的显示类型,可以看见 inline 显示类型不会换行也无法调整宽高,inline-grid 元素表现和 inline-block 相同,grid 元素表现和 block 相同。

线上展示:https://codepen.io/oxxo/pen/KKOgYOO

<!-- HTML 程式碼-->
<div class="i">inline</div>
<div class="ib">inline</div>
<div class="gi">inline-grid</div>
<div class="b">block</div>
<div class="gb">grid</div>

<!-- CSS 程式碼 -->
<style>
  div {
    border: 1px solid #000;
    width: 100px;
    height: 50px;
    margin: 5px;
  }
  .i {display: inline;}
  .ib {display: inline-block;}
  .gi {display: inline-grid;}
  .gb {display: grid;}
</style>

CSS 教学 - 使用 Grid 网格容器 - Grid 与 inline-grid 元素

当元素变成网格容器后,网格项目“不支援”下列 CSS 样式属性:float、clear、vertical-align、column-*,同时如果元素“没有标签”包覆,也会自动使用“虚拟标签”替代 ( 不建议出现这种网页内容,因不符合该元素的型态 ),下方范例使用两组 div,第一组 div 的子元素有设定不支援的样式属性,第二组则展示没有标签包覆的内容会使用虚拟标签包覆,而使用 i 和 div 标签包覆的元素会被转换成网格项目,最后就会按照设定呈现三栏。

线上展示:https://codepen.io/oxxo/pen/XWvjwrd

<!-- HTML 程式碼-->
<div class="gb">
<div class="g1">apple</div>
<div class="g2">banana <br>banana</div>
<div class="g3">oxxo</div>
</div>
<div class="gb g2">
  apple <br> banana <i>oxxo</i>
  <div>coconut</div>
</div>

<!-- CSS 程式碼 -->
<style>
  div {
    border: 1px solid #000;
    margin: 20px;
  }
  .gb {
    width: 300px;
    display: grid;
    grid-template-columns: 100px 100px 100px; /* 設定三欄,每一欄寬度 100px */
  }
  .g1 {float: right;}                 /* 這個樣式會被忽略 */
  .g2, .g3 {vertical-align: bottom;}  /* 這個樣式會被忽略 */
</style>

CSS 教学 - 使用 Grid 网格容器 - Grid 网格项目规律

网格容器基本架构

使用网格排版最重要的就是“网格线”,由水平和垂直网格线会构成“网格”,这些网格会组成网格容器的“基本架构”,基本架构和网格项目 ( 子元素 ) 没有直接关系,而是提供网格项目放置位置和大小的参考依据,网格容器基本架构如下:

  • grid line ( 网格线 ):垂直或水平的格线。
  • grid track ( 轨道 ):网格线左右或上下的垂直或水平连续空间。
  • grid cell ( 单元格 ):由网格线构成的 1x1 空间。
  • grid area ( 网格区域 ):由网格线构成大于 1x1 的空间。

CSS 教学 - 使用 Grid 网格容器 - 网格容器的基本架构

grid-template-columns、grid-template-rows 网格线

网格线由水平的“colume 栏”和垂直的“row 列”所组成,colume 对应的样式属性为 grid-template-columns,row 对应的样式属性为 grid-template-rows,这两个样式属性都没有继承特性,默认值为 none,属性值使用“track-list”语法计算“网格的数量与宽度”,撰写格式如下:

  • 使用“空白”分隔多个数值。
  • 每个数值代表“网格的宽度”,也可当作“相对”前一个数值的“网格线的位置”。

如果分不清楚中文的“列”究竟是垂直还是水平,但只要打开 Word、Excel 或 Google 试算表,所有表格的中文翻译,垂直方向都是“列”,因此 row 的翻译也就对应到“列”。

CSS 教学 - 使用 Grid 网格容器 - grid-template-columns、grid-template-rows

了解撰写格式后,可以使用下列几种写法设定网格的数量和宽度:

写法 范例
固定网格尺寸 200px 50% 100px
弹性网格尺寸 1fr 1fr 2fr
根据内容改变网格尺寸 max-content max-content
网格尺寸自动符合内容 fit-content(100px) fit-content(100px)
重复产生指定尺寸的网格 repeat(3, 1fr 2fr)
自动填满网格 repeat(auto-fill, 30px)

当网格线设定完成,网格项目默认会按照“左到右、上到下”的顺序放入网格中,下方使用“固定格线位置”写法,可以看出虽然内容元素都是“九个”,但会按照网格设定的不同,产生不同的排版方式。

线上展示:https://codepen.io/oxxo/pen/YzmGbKY

<!-- HTML 程式碼-->
<div class="g g1">
  <div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div>
</div>
<div class="g g2">
  <div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div>
</div>
<div class="g g3">
  <div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div>
</div>

<!-- CSS 程式碼 -->
<style>
  div {border: 1px dotted #666;}
  .g {
    width: max-content;
    border: 1px solid #000;
    display: grid;
    margin: 10px;
    float: left;
  }
  /* 3x3 */
  .g1 {
    grid-template-columns: 50px 50px 50px;
    grid-template-rows: 50px 50px 50px;
  }
  /* 5x2 */
  .g2 {
    grid-template-columns: 20px 30px 40px 50px 60px;
    grid-template-rows: 25px 50px;
  }
  /* 2x5 */
  .g3 {
    grid-template-columns: 25px 50px;
    grid-template-rows: 20px 30px 40px 50px 60px;
  }
</style>

CSS 教学 - 使用 Grid 网格容器 - Grid 网格项目默认按照“左到右、上到下”的顺序排列

固定网格尺寸

“固定网格尺寸”是最基本的网格设定方式,只需要使用具有“长度单位”的数值标记“网格尺寸”,支援绝对长度和相对长度单位,相对长度的百分比单位会参考网格容器的宽度或高度,下方列出相关写法 ( 前三个 div 宽度为 300px,后三个 div 高度为 100px ):

线上展示:https://codepen.io/oxxo/pen/PoMGvYd

<!-- HTML 程式碼-->
grid-template-columns: 150px 150px;
<div class="g g1"><div>150px</div><div>150px</div></div>
grid-template-columns: 50% 50%;
<div class="g g2"><div>50%</div><div>50%</div></div>
grid-template-columns: 100px 50px 50%;
<div class="g g3"><div>100px</div><div>50px</div><div>50%</div></div>
grid-template-rows: 50px 50px;
<div class="g r g4"><div>50px</div><div>50px</div></div>
grid-template-rows: 50% 50%;
<div class="g r g5"><div>50%</div><div>50%</div></div>
grid-template-rows: 25px 25px 50%;
<div class="g r g6"><div>25px</div><div>25px</div><div>50%</div></div>

<!-- CSS 程式碼 -->
<style>
  .g {
    width: 300px;
    display: grid;
    border: 1px solid #000;
    margin: 5px 0 15px;
  }
  .g1 {grid-template-columns: 150px 150px;}
  .g2 {grid-template-columns: 50% 50%;}
  .g3 {grid-template-columns: 100px 50px 50%;}

  .r {
    width: 60px;
    height: 100px;
  }
  .g4 {grid-template-rows: 50px 50px;}
  .g5 {grid-template-rows: 50% 50%;}
  .g6 {grid-template-rows: 25px 25px 50%;}

  .g div:nth-child(1) {background: #f33a;}
  .g div:nth-child(2) {background: #0f0a;}
  .g div:nth-child(3) {background: #09fa;}
</style>

CSS 教学 - 使用 Grid 网格容器 - Grid 固定网格宽高

使用固定网格尺寸的方式设定网格时,如果身为父元素的网格容器也有设定宽高,则可能会发生空间不足而“溢出空间”或空间太多“无法填满空间”的状况,除非有确定非得是这种尺寸,通常不太会使用固定网格尺寸的方式进行排版,下方范例会展示这些溢出或不足的情形。

线上展示:https://codepen.io/oxxo/pen/oNKzRNe

<!-- HTML 程式碼-->
寬度剛剛好
<div class="g g1"><div class="a1">100px</div><div class="a2">100px</div><div class="a3">100px</div></div>
溢出網格容器
<div class="g g2"><div class="a1">100px</div><div class="a2">150px</div><div class="a3">100px</div></div>
網格容器寬度太大
<div class="g g3"><div class="a1">100px</div><div class="a2">50px</div><div class="a3">100px</div></div>
溢出網格容器
<div class="g g4"><div class="a1">25%</div><div class="a2">25%</div><div class="a3">50%</div></div>
網格容器寬度太大
<div class="g g5"><div class="a1">25%</div><div class="a2">25%</div><div class="a3">60%</div></div>

<!-- CSS 程式碼 -->
<style>
  .g {
    width: 300px;
    display: grid;
    border: 1px solid #000;
    margin: 5px 0 15px;
  }
  .g1 {grid-template-columns: 100px 100px 100px;}
  .g2 {grid-template-columns: 100px 150px 100px;}
  .g3 {grid-template-columns: 100px 50px 100px;}
  .g4 {grid-template-columns: 25% 25% 50%;}
  .g5 {grid-template-columns: 25% 25% 60%;}

  .a1 {background: #f33a;}
  .a2 {background: #0f0a;}
  .a3 {background: #09fa;}
</style>

CSS 教学 - 使用 Grid 网格容器 - Grid 固定网格宽高“溢出空间”或“无法填满空间”

弹性网格尺寸

“弹性网格尺寸”是会透过“分成几等分”的方式,将网格容器的“可用空间”,根据设定进行分成几等分,使用的数值单位是“fr”,只支援“大于零”的数值,下方展示 fr 单位的计算方式:

CSS 教学 - 使用 Grid 网格容器 - Grid  弹性网格尺寸 fr 单位计算方式

下方范例使用六个 div,前三个 div 宽度为 300px,后三个 div 高度为 100px,从中可以看出弹性网格尺寸对于尺寸的表现。

线上展示:https://codepen.io/oxxo/pen/PoMGvod

<!-- HTML 程式碼-->
grid-template-columns: 1fr 1fr;
<div class="g g1"><div>1fr</div><div>1fr</div></div>
grid-template-columns: 2.5fr 2.5fr;
<div class="g g2"><div>2.5fr</div><div>2.5f</div></div>
grid-template-columns: 1fr 1fr 2fr;
<div class="g g3"><div>1fr</div><div>1fr</div><div>2fr</div></div>
grid-template-rows: 1fr 1fr;
<div class="g r g4"><div>1fr</div><div>1fr</div></div>
grid-template-rows: 2.5fr 2.5fr;
<div class="g r g5"><div>2.5fr</div><div>2.5fr</div></div>
grid-template-rows: 1fr 1fr 2fr;
<div class="g r g6"><div>1fr</div><div>1fr</div><div>2fr</div></div>

<!-- CSS 程式碼 -->
<style>
  .g {
    width: 300px;
    display: grid;
    border: 1px solid #000;
    margin: 5px 0 15px;
  }
  .g1 {grid-template-columns: 1fr 1fr;}
  .g2 {grid-template-columns: 2.5fr 2.5fr;}
  .g3 {grid-template-columns: 1fr 1fr 2fr;}

  .r {
    width: 60px;
    height: 100px;
  }
  .g4 {grid-template-rows: 1fr 1fr;}
  .g5 {grid-template-rows: 2.5fr 2.5fr;}
  .g6 {grid-template-rows: 1fr 1fr 2fr;}

  .g div:nth-child(1) {background: #f33a;}
  .g div:nth-child(2) {background: #0f0a;}
  .g div:nth-child(3) {background: #09fa;}
</style>

CSS 教学 - 使用 Grid 网格容器 - Grid 弹性网格尺寸

因为 fr 单位是以“容器剩余可用宽度”进行计算,所以可以搭配固定网格尺寸一起使用,下方范例使用四个 div,里头都有固定尺寸的网格项目,而使用 fr 为单位的弹性网格会自动分配并补满剩余的宽度。

线上展示:https://codepen.io/oxxo/pen/WNVGBNW

<!-- HTML 程式碼-->
grid-template-columns: 100px 1fr 1fr;
<div class="g g1"><div>100px</div><div>1fr</div><div>1fr</div></div>
grid-template-columns: 100px 2.5fr 2.5fr;
<div class="g g2"><div>100px</div><div>2.5fr</div><div>2.5f</div></div>
grid-template-columns: 100px 1fr 3fr;
<div class="g g3"><div>100px</div><div>1fr</div><div>3fr</div></div>
grid-template-columns: 50px 1fr 50px;
<div class="g g4"><div>50px</div><div>1fr</div><div>50px</div></div>

<!-- CSS 程式碼 -->
<style>
  .g {
    width: 300px;
    display: grid;
    border: 1px solid #000;
    margin: 5px 0 15px;
  }
  .g1 {grid-template-columns: 100px 1fr 1fr;}
  .g2 {grid-template-columns: 100px 2.5fr 2.5fr;}
  .g3 {grid-template-columns: 100px 1fr 3fr;}
  .g4 {grid-template-columns: 50px 1fr 50px;}

  .g div:nth-child(1) {background: #f33a;}
  .g div:nth-child(2) {background: #0f0a;}
  .g div:nth-child(3) {background: #09fa;}
</style>

CSS 教学 - 使用 Grid 网格容器 - Grid 弹性网格尺寸搭配固定网格尺寸

根据内容改变网格尺寸

“根据内容改变网格尺寸”表示网格的尺寸会根据“网格内容”而改变,有下列几种设定语法:

语法 说明
max-content 内容所需空间的最大值。
min-content 内容所需空间的最小值。
minmax(min, max) 设定自动改变宽度的最大值与最小值。

下方范例中设定为 max-content 的项目会将宽度自动调整为内容所需空间的最大值,设定为 min-content 的 项目会将宽度自动调整为内容所需空间的最小值,如果遇到“过长”的文字内容,就会发生不换行且溢出容器范围的状况,如果其他的项目设定单位 fr 的弹性网格,也会因为过长的文字压缩宽度,甚至在没有内容时发生网格消失的现象。

线上展示:https://codepen.io/oxxo/pen/MWNjdYw

<!-- HTML 程式碼-->
max-content max-content max-content
<div class="g g1"><div>apple</div><div>banana</div><div>Hello World!! I am oxxo.studio, how are you?</div></div>
min-content min-content min-content
<div class="g g2"><div>apple</div><div>banana</div><div>Hello World!! I am oxxo.studio, how are you?</div></div>
20px 20px max-content
<div class="g g3"><div>apple</div><div>banana</div><div>Hello World!! I am oxxo.studio, how are you?</div></div>
1fr 1fr max-content
<div class="g g4"><div></div><div></div><div>Hello World!! I am oxxo.studio, how are you?</div></div>
1fr 1fr max-content
<div class="g g5"><div>Hello World!! I am oxxo, how are you?</div><div>banana</div><div>Hello World!! I am oxxo.studio, how are you?</div></div>
max-content 1fr 1fr 
<div class="g g6"><div>Hello World!! I am oxxo.studio, how are you?</div><div>apple</div><div>banana</div></div>

<!-- CSS 程式碼 -->
<style>
  .g {
    width: 300px;
    display: grid;
    border: 1px solid #000;
    margin: 5px 0 15px;
  }
  .g1 {grid-template-columns: max-content max-content max-content;}
  .g2 {grid-template-columns: min-content min-content min-content;}
  .g3 {grid-template-columns: 20px 20px max-content;}
  .g4 {grid-template-columns: 1fr 1fr max-content;}
  .g5 {grid-template-columns: 1fr 1fr max-content;}
  .g6 {grid-template-columns: max-content 1fr 1fr ;}

  .g div:nth-child(1) {background: #f33a;}
  .g div:nth-child(2) {background: #0f0a;}
  .g div:nth-child(3) {background: #09fa;}
</style>

CSS 教学 - 使用 Grid 网格容器 - Grid 根据内容改变网格尺寸 max-content、min-content

使用 max-content 或 min-content 都会受限于内容本身,因此常会发生不如预期的状况,这时可以透过 minmax(min, max) 语法,将网格宽度限制在特定的范围里,就能更容易掌握排版状况,下方范例使用四个 div 展示不同的 minmax 设定结果。

线上展示:https://codepen.io/oxxo/pen/YzmGbPe

<!-- HTML 程式碼-->
max-content max-content minmax(0, max-content)
<div class="g g1"><div>apple</div><div>banana</div><div>Hello World!! I am oxxo.studio, how are you?</div></div>
minmax(min-content, max-content) minmax(min-content, max-content) max-content
<div class="g g2"><div>o oxxo</div><div>ba banana</div><div>Hello World!! I am oxxo.studio, how are you?</div></div>
minmax(min-content, max-content) minmax(min-content, max-content) minmax(0, max-content)
<div class="g g3"><div>o oxxo</div><div>ba banana</div><div>Hello World!! I am oxxo.studio, how are you?</div></div>
minmax(10px, max-content) minmax(10px, max-content) minmax(0, max-content)
<div class="g g4"><div></div><div></div><div>Hello World!! I am oxxo.studio, how are you?</div></div>

<!-- CSS 程式碼 -->
<style>
  .g {
    width: 300px;
    display: grid;
    border: 1px solid #000;
    margin: 5px 0 55px;
  }
  .g1 {grid-template-columns: max-content max-content minmax(0, max-content);}
  .g2 {grid-template-columns: minmax(min-content, max-content) minmax(min-content, max-content) max-content;}
  .g3 {grid-template-columns: minmax(min-content, max-content) minmax(min-content, max-content) minmax(0, max-content);}
  .g4 {grid-template-columns: minmax(10px, max-content) minmax(10px, max-content) minmax(0, max-content);}

  .g div:nth-child(1) {background: #f33a;}
  .g div:nth-child(2) {background: #0f0a;}
  .g div:nth-child(3) {background: #09fa;}
</style>

CSS 教学 - 使用 Grid 网格容器 - Grid 根据内容改变网格尺寸 minmax(min, max)

网格尺寸自动符合内容

“网格尺寸符合内容”表示网格的尺寸会根据“网格内容”而改变,并尽可能“符合内容的最大宽度或最小宽度”,使用的语法为“fit-content(val)”,val 使用长度单位数值,使用后会让“网格项目永远保持在网格容器里”,除非内容真的太长,不然不会溢出容器,基本上会按照“max(minimum, min(limit, max-content))”公式计算,如果遇到多个字段互相比较,则会按照“minmax(auto, max-content)”和“minmax(auto, limit)”计算出较小的值作为调整参考。

不过通常在排版时不会考虑这些公式 ( 也很难去计算 ),只需要参考下方常见的状况使用:

CSS 教学 - 使用 Grid 网格容器 - Grid 网格尺寸符合内容 fit-content

下方范例中的 div,会呈现出下列的长相:

  • 第一个 div,val 数值都小于内容最小宽度,最后呈现结果就会是内容最小宽度
  • 第二个 div,val 数值都大于最小宽度,但因为 val 仍小于内容最大宽度,会采用 val 数值作为宽度。
  • 第三到第五个 div:val 数值都大于内容最大宽度,会先采用内容最大宽度,若所有网格的最大宽度加起来超过网格容器宽度,就会根据公式计算分配彼此的宽度。

线上展示:https://codepen.io/oxxo/pen/bGXwyNZ

<!-- HTML 程式碼-->
fit-content(5px) fit-content(5px) fit-content(5px)
<div class="g g1"><div>o ox oxx oxxo</div><div>1 2 3 4 5</div><div>Hello World!! I am oxxo.studio, how are you?</div></div>
fit-content(50px) fit-content(50px) fit-content(150px)  
<div class="g g2"><div>o ox oxx oxxo</div><div>1 2 3 4 5</div><div>Hello World!! I am oxxo.studio, how are you?</div></div>
fit-content(5000px) fit-content(5000px) fit-content(5000px)
<div class="g g3"><div>o ox oxx oxxo</div><div>1 2 3 4 5 6 7</div><div>Hello World!! I am oxxo.studio, how are you?</div></div>
<div class="g g3"><div>Hello World!! I am oxxo.studio, how are you?</div><div>o ox oxx oxxo</div><div>1 2 3 4 5</div></div>
<div class="g g3"><div>o ox oxx oxxo</div><div>1 2 3</div><div>1 2 3 4 5</div></div>


<!-- CSS 程式碼 -->
<style>
  .g {
    width: 400px;
    display: grid;
    border: 1px solid #000;
    margin: 5px 0 55px;
  }
  .g1 {grid-template-columns: fit-content(5px) fit-content(5px) fit-content(5px);}
  .g2 {grid-template-columns: fit-content(50px) fit-content(50px) fit-content(150px);}
  .g3 {grid-template-columns: fit-content(5000px) fit-content(5000px) fit-content(5000px);}
  .g3 {margin-bottom: 15px}

  .g div:nth-child(1) {background: #f33a;}
  .g div:nth-child(2) {background: #0f0a;}
  .g div:nth-child(3) {background: #09fa;}
</style>

CSS 教学 - 使用 Grid 网格容器 - Grid 网格尺寸符合内容 fit-content

重复产生指定尺寸的网格

“重复产生指定尺寸的网格”会根据“重复的次数”,重复产生指定尺寸的网格,撰写语法如下:

  • 语法:repeat(重複次數, 網格設定)。
  • 重复次数:
    • 使用“非负值的整数”,表示要重复几次后方所设定的网格
    • 使用“auto-fill”或“auto-fit”,会自动计算网格容器可容纳几次重复。
  • 网格设定:可使用之前段落介绍的所有方式设定网格,参考:
    • 使用“空白”分隔网格。
    • 使用“长度、fr”数值设定网格尺寸
    • 支援 max-content、min-content、minmax(min, max)、fit-content(val) 语法。

下方范例分别让三种不同网格设定的网格重复三次,如果后方网格设定为一格,重复三次之后就会变成三格,如果是两个就会变成六格,三格就会变成九格 ( 注意,如果使用固定尺寸的网格,可能会发生溢出网格容器的状况 )。

线上展示:https://codepen.io/oxxo/pen/KKOgLpP

<!-- HTML 程式碼-->
repeat(3, 40px)
<div class="g g1"><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div></div>
repeat(3, 40px 40px)
<div class="g g2"><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div></div>
repeat(3, 40px 40px 40px)
<div class="g g3"><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div></div>


<!-- CSS 程式碼 -->
<style>
  .g {
    width: 300px;
    display: grid;
    border: 1px solid #000;
    margin: 5px 0 25px;
  }
  .g1 {grid-template-columns: repeat(3, 40px);}
  .g2 {grid-template-columns: repeat(3, 40px 40px);}
  .g3 {grid-template-columns: repeat(3, 40px 40px 40px);}

  .g div:nth-child(1) {background: #f33a;}
  .g div:nth-child(2) {background: #0f0a;}
  .g div:nth-child(3) {background: #09fa;}
  .g div:nth-child(4) {background: #fc0a;}
  .g div:nth-child(5) {background: #b0fa;}
  .g div:nth-child(6) {background: #666a;}
  .g div:nth-child(7) {background: #05fa;}
  .g div:nth-child(8) {background: #f09a;}
  .g div:nth-child(9) {background: #f90a;}
</style>

CSS 教学 - 使用 Grid 网格容器 - Grid 三种不同网格设定的网格重复三次

如果指了定重复次数但又不想溢出容易,就需要搭配 fr 单位 或 max-content、min-content、minmax(min, max)、fit-content(val) 语法共同操作,下方范例会透过宽度的设定,让网格项目不会溢出容器 ( 注意如果网格里有固定尺寸的网格,当所有的固定尺寸和最小容器尺寸相加后大于容器宽度,仍然会溢出容器 )。

线上展示:https://codepen.io/oxxo/pen/xxvENGq

<!-- HTML 程式碼-->
repeat(3, 1fr 2fr 3fr)
<div class="g g1"><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div></div>
repeat(3, 50px 1fr 1fr)
<div class="g g2"><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div></div>
repeat(3, minmax(min-content, 80px) 70px)
<div class="g g3"><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div></div>
repeat(3, minmax(min-content, 80px) 20px)
<div class="g g4"><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div></div>

<!-- CSS 程式碼 -->
<style>
  .g {
    width: 300px;
    display: grid;
    border: 1px solid #000;
    margin: 5px 0 25px;
  }
  .g1 {grid-template-columns: repeat(3, 1fr 2fr 3fr);}
  .g2 {grid-template-columns: repeat(3, 50px 1fr 1fr);}
  .g3 {grid-template-columns: repeat(3, minmax(min-content, 80px) 70px);}
  .g4 {grid-template-columns: repeat(3, minmax(min-content, 80px) 20px);}

  .g div:nth-child(1) {background: #f33a;}
  .g div:nth-child(2) {background: #0f0a;}
  .g div:nth-child(3) {background: #09fa;}
  .g div:nth-child(4) {background: #fc0a;}
  .g div:nth-child(5) {background: #b0fa;}
  .g div:nth-child(6) {background: #666a;}
  .g div:nth-child(7) {background: #05fa;}
  .g div:nth-child(8) {background: #f09a;}
  .g div:nth-child(9) {background: #f90a;}
</style>

CSS 教学 - 使用 Grid 网格容器 - Grid repeat 使用 auto-fill

当“重复”撰写 repeat() 时,会自动将所有重复次数加总,例如下方范例,两个重复三次就会变成六次,三个重复三次就会变成九次。

线上展示:https://codepen.io/oxxo/pen/OJKRYVa

<!-- HTML 程式碼-->
repeat(3, 15px) repeat(3, 50px)
<div class="g g1"><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div></div>
repeat(3, 15px) repeat(3, 50px) repeat(3, 30px)
<div class="g g2"><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div></div>

<!-- CSS 程式碼 -->
<style>
  .g {
    width: 300px;
    display: grid;
    border: 1px solid #000;
    margin: 5px 0 25px;
  }
  .g1 {grid-template-columns: repeat(3, 15px) repeat(3, 50px);}
  .g2 {grid-template-columns: repeat(3, 15px) repeat(3, 50px) repeat(3, 30px);}

  .g div:nth-child(1) {background: #f33a;}
  .g div:nth-child(2) {background: #0f0a;}
  .g div:nth-child(3) {background: #09fa;}
  .g div:nth-child(4) {background: #fc0a;}
  .g div:nth-child(5) {background: #b0fa;}
  .g div:nth-child(6) {background: #666a;}
  .g div:nth-child(7) {background: #05fa;}
  .g div:nth-child(8) {background: #f09a;}
  .g div:nth-child(9) {background: #f90a;}
</style>

CSS 教学 - 使用 Grid 网格容器 - Grid 重复撰写 repeat

自动填满网格

使用 repeat 语法时,如果“不想要溢出网格容器”但又无法确定重复次数,就可以使用“auto-fill”或“auto-fit”设定值代替重复次数,当发生“溢出容器”的状况时,就会自动将下一次重复的网格换行*,从下方范例可以看出设定 auto-fill 和 auto-fit 的网格容器,因为“9”这格摆放溢出了容器,就自动将这格换行 ( 注意,自动填满网格的写法不支援 fr 单位 )。

线上展示:https://codepen.io/oxxo/pen/MWNjdaw

<!-- HTML 程式碼-->
repeat(auto-fill, 10px 60px)
<div class="g g1"><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div></div>
repeat(auto-fit, 10px 60px)
<div class="g g2"><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div></div>

<!-- CSS 程式碼 -->
<style>
  .g {
    width: 300px;
    display: grid;
    border: 1px solid #000;
    margin: 5px 0 25px;
  }
  .g1 {grid-template-columns: repeat(auto-fill, 10px 60px);}
  .g2 {grid-template-columns: repeat(auto-fit, 10px 60px);}

  .g div:nth-child(1) {background: #f33a;}
  .g div:nth-child(2) {background: #0f0a;}
  .g div:nth-child(3) {background: #09fa;}
  .g div:nth-child(4) {background: #fc0a;}
  .g div:nth-child(5) {background: #b0fa;}
  .g div:nth-child(6) {background: #666a;}
  .g div:nth-child(7) {background: #05fa;}
  .g div:nth-child(8) {background: #f09a;}
  .g div:nth-child(9) {background: #f90a;}
</style>

CSS 教学 - 使用 Grid 网格容器 - Grid repeat 使用 auto-fill 或 auto-fit

虽然 auto-fill 和 auto-fit 呈现的效果很相似,但由于 auto-fill 会建立一个可以包涵所有项目的空间 ( 可称作“轨道 track” ) 而 auto-fit 不会建立这个空间,当网格项目不足以填满网格容器的状态下进行“对齐”,就产生不同的呈现方式,下方范例将网格容器都设定为“justify-content: center;”水平置中,根据填满方式的不同产生不同的显示方式:

线上展示:https://codepen.io/oxxo/pen/dyxpEYZ

<!-- HTML 程式碼-->
repeat(auto-fill, 10px 60px)
<div class="g g1"><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div></div>
repeat(auto-fit, 10px 60px)
<div class="g g2"><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div></div>

repeat(auto-fill, 10px 60px)
<div class="g g3"><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div></div>
repeat(auto-fit, 10px 60px)
<div class="g g4"><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div></div>

<!-- CSS 程式碼 -->
<style>
  .g {
    width: 300px;
    display: grid;
    border: 1px solid #000;
    margin: 5px 0 55px;
    justify-content: center;
  }
  .g1 {grid-template-columns: repeat(auto-fill, 10px 30px);}
  .g2 {grid-template-columns: repeat(auto-fit, 10px 30px);}

  .g3 {grid-template-columns: repeat(auto-fill, 20px 60px);}
  .g4 {grid-template-columns: repeat(auto-fit, 20px 60px);}

  .g div:nth-child(1) {background: #f33a;}
  .g div:nth-child(2) {background: #0f0a;}
  .g div:nth-child(3) {background: #09fa;}
  .g div:nth-child(4) {background: #fc0a;}
  .g div:nth-child(5) {background: #b0fa;}
  .g div:nth-child(6) {background: #666a;}
  .g div:nth-child(7) {background: #05fa;}
  .g div:nth-child(8) {background: #f09a;}
  .g div:nth-child(9) {background: #f90a;}
</style>

CSS 教学 - 使用 Grid 网格容器 - Grid auto-fill 和 auto-fit 的差异

小结

Grid 网格容器是 CSS 排版的最新功能,虽然较为复杂,但能做到的事情也更多,这篇教学只是介绍网格的架构,接下来还有其他篇幅会介绍更多细节设定!

相关文章:Grid 网格空间与命名、Grid 网格流向与间距、Grid 排列网格项目、Grid 网格项目对齐、顺序与对齐

意见反馈

微信二维码 微信扫码关注 抖音二维码 抖音扫码关注