非常教程

CSS参考手册

网格布局 | Grid Layout

使用命名网格线进行布局 | CSS Grid Layout: Layout using Named Grid Lines

在以前的指南中,我们已经研究了如何根据定义网格轨道创建的行放置项目,以及如何使用命名模板区域放置项目。在本指南中,我们将研究这两件事在使用命名行时是如何一起工作的。行命名是非常有用的,但是一些看起来更令人困惑的网格语法来自于这种名称和跟踪大小的组合。一旦你完成了一些例子,它应该变得更清晰和更容易使用。

定义网格时命名行

当您使用grid-template-rowsgrid-template-columns属性定义网格时, 可以为网格中的部分或全部行指定名称。为了演示, 我将使用在基于线的布局指南中创建的简单版式。这一次, 我将使用命名行创建网格。

在定义网格时,我将我的行命名为方括号。这些名字可以是你喜欢的任何东西。我已经为开始和结束容器定义了一个名称,包括行和列。然后将网格的中心块定义为content-startcontent-end同样,对于列和行,尽管不需要命名网格中的所有行,但都是如此。您可以选择只为布局指定一些关键行。

.wrapper {
  display: grid;
  grid-template-columns: [main-start] 1fr [content-start] 1fr [content-end] 1fr [main-end];
  grid-template-rows: [main-start] 100px [content-start] 100px [content-end] 100px [main-end];
}

一旦行有了名称,我们就可以使用名称来放置项目,而不是行号。

.box1 {
  grid-column-start: main-start;
  grid-row-start: main-start;
  grid-row-end: main-end;
}

.box2 {
  grid-column-start: content-end;
  grid-row-start: main-start;
  grid-row-end: content-end;
}

.box3 {
  grid-column-start: content-start;
  grid-row-start: main-start;
}

.box4 {
  grid-column-start: content-start;
  grid-column-end: main-end;
  grid-row-start: content-end;
}
<div class="wrapper">
  <div class="box1">One</div>
  <div class="box2">Two</div>
  <div class="box3">Three</div>
  <div class="box4">Four</div>
</div>

关于基于行的布局的所有其他东西仍然以相同的方式工作,您可以混合命名行和行号。在创建响应性设计时,在重新定义网格时,命名行非常有用,而不是需要通过更改媒体查询中的行号来重新定义内容位置,您可以确保在定义中始终将行命名为相同的。

给行多个名称

您可能需要给出一个多个名称的行,例如,它可能表示侧边栏末端和主开始。要做到这一点,在方括号中添加名称,在它们之间加上空格。[sidebar-end main-start]然后,您可以用任何一个名称来引用这一行。

从命名线隐式网格区域

在命名这些行时,我提到了你可以给这些名字命名任何你喜欢的。名称是习惯身份一个作者定义的名字。在选择名称时,您需要避免出现在规范中并可能引起混淆的单词,例如span.不引用身份证明。

当您可以选择任何名称时,如果您附加-start-end对于围绕一个区域的行,正如我在上面的示例中所做的那样,网格将创建一个主名称的命名区域。以上面的例子为例content-startcontent-end行和列都是。这意味着我得到一个网格区域content如果我愿意的话可以在那个区域放点东西。

我正在使用与上面相同的网格定义,但是这次我要把一个单独的项目放到指定的区域content

.wrapper {
  display: grid;
  grid-template-columns: [main-start] 1fr [content-start] 1fr [content-end] 1fr [main-end];
  grid-template-rows: [main-start] 100px [content-start] 100px [content-end] 100px [main-end];
}
.thing {
  grid-area: content;
}
<div class="wrapper">
  <div class="thing">I am placed in an area named content.</div>
</div>

我们不需要确定我们的区域在哪里grid-template-areas因为我们的命名线为我们创造了一个区域。

来自命名区域的隐式网格线

我们已经看到了命名行是如何创建一个命名区域的,这也是相反的。命名模板区域创建可用于放置项目的命名行。如果我们采用在“网格模板区域指南”中创建的布局,我们可以使用我们的区域创建的行来查看这是如何工作的。

在本例中,我添加了一个额外的div,其中包含一个overlay.我们已经命名了使用grid-area属性中创建的布局。grid-template-areas.地区名称如下:

  • hd
  • ft
  • main
  • sd

这给了我们列和行的行:

  • hd-start
  • hd-end
  • sd-start
  • sd-end
  • main-start
  • main-end
  • ft-start
  • ft-end

您可以在图像中看到指定的行,请注意,有些行有两个名称-例如sd-endmain-start请参考同一列行。

使用命名网格线进行布局  |  CSS Grid Layout: Layout using Named Grid Lines

就位overlay使用这些隐式命名行与使用我们已命名的行定位项目相同。

.wrapper {
  display: grid;
  grid-template-columns: repeat(9, 1fr);
  grid-auto-rows: minmax(100px, auto);
  grid-template-areas: 
    "hd hd hd hd   hd   hd   hd   hd   hd"
    "sd sd sd main main main main main main"
    "ft ft ft ft   ft   ft   ft   ft   ft";
}

.header {
  grid-area: hd;
}

.footer {
  grid-area: ft;
}

.content {
  grid-area: main;
}

.sidebar {
  grid-area: sd;
}

.wrapper > div.overlay {
  z-index: 10;
  grid-column: main-start / main-end;
  grid-row: hd-start / ft-end;
  border: 4px solid rgb(92,148,13);
  background-color: rgba(92,148,13,.4);
  color: rgb(92,148,13);
  font-size: 150%;
}
<div class="wrapper">
  <div class="header">Header</div>
  <div class="sidebar">Sidebar</div>
  <div class="content">Content</div>
  <div class="footer">Footer</div>
  <div class="overlay">Overlay</div>
</div>

考虑到我们有定位、从命名区域创建线和从命名线创建区域的能力,在开始创建网格布局时,需要花一点时间来规划您的命名策略。通过选择对您和您的团队有意义的名称,您将帮助每个人更容易地使用您创建的布局。

与repeat()具有相同名称的多行

如果您想要给网格中的所有行一个唯一的名称,那么您需要长时间写出轨道定义,而不是使用重复语法,因为在定义轨道时,需要将名称添加到方括号中。如果您确实使用了重复语法,那么您将得到多行同名的行,但是这也非常有用。

在下一个例子中,我创建了一个具有十二个等宽列的网格。在定义列轨道的1fr大小之前,我还定义了一个行名称[col-start]。这意味着我们最终会得到一个网格,它有12列线,都col-start1fr宽度列之前命名。

.wrapper {
  display: grid;
  grid-template-columns: repeat(12, [col-start] 1fr);
}

一旦创建了网格,就可以将项目放置到网格上。因为我们有多行名为col-start如果您将一个项目放在一行后开始col-start网格使用第一行名为col-start,在我们的例子中,这将是最左翼的路线。若要寻址另一行,请使用名称,加上该行的编号。要将我们的项目从第一行col-start放到第五,我们可以使用:

.item1 {
  grid-column: col-start / col-start 5
}

您还可以使用span关键字在这里。我的下一项将放在名为第七行的col-start跨越三条线。

.item2 {
  grid-column: col-start 7 / span 3;
}
<div class="wrapper">
  <div class="item1">I am placed from col-start line 1 to col-start 5</div>
  <div class="item2">I am placed from col-start line 7 spanning 3 lines</div>
</div>

如果您查看Firefox Grid荧光笔中的这个布局,您可以看到列行是如何显示的,以及我们的项是如何放置在这些行中的。

使用命名网格线进行布局  |  CSS Grid Layout: Layout using Named Grid Lines

重复语法也可以采取跟踪列表, 它不只是需要是一个单一的轨道大小, 正在重复。下面的代码将创建一个八个轨道的网格,一个较窄的1fr宽度列命名col1-start后跟一个更宽的3fr列命名col2-start

.wrapper {
  grid-template-columns: repeat(4, [col1-start] 1fr [col2-start] 3fr);
}

如果重复语法将两行放在一起,那么它们将被合并,并创建与在非重复轨道定义中给行多个名称相同的结果。下面的定义创建了四个1fr轨道,每个轨道都有一个开始和结束线。

.wrapper {
  grid-template-columns: repeat(4, [col-start] 1fr [col-end] );
} 

如果我们不使用重复表示法写出这个定义,它将如下所示。

.wrapper {
  grid-template-columns: [col-start] 1fr [col-end col-start] 1fr [col-end col-start] 1fr  [col-end col-start] 1fr [col-end];
} 

如果您使用了轨道列表,则可以使用span关键字不仅要跨越多行,而且要跨若干特定名称的行。

.wrapper {
  display: grid;
  grid-template-columns: repeat(6, [col1-start] 1fr [col2-start] 3fr);
}

.item1 {
  grid-column: col1-start / col2-start 2
}

.item2 {
  grid-row: 2;
  grid-column: col1-start 2 / span 2 col1-start;
}
<div class="wrapper">
  <div class="item1">I am placed from col1-start line 1 to col2-start line 2</div>
  <div class="item2">I am placed from col1-start line 2 spanning 2 lines named col1-start</div>
</div>

在过去的三个指南中,您发现有很多不同的方法可以使用网格来放置项目。这在一开始看起来有点过于复杂,但请记住,您不需要使用所有这些。在实践中,我发现对于简单的布局,使用命名模板区域很好,它给出了布局外观的良好的视觉表示,然后就很容易在网格上移动东西。

例如,如果使用严格的多列布局,本指南最后部分中的命名行演示非常有效。如果您考虑网格系统,比如那些在Foundation或Bootstrap之类的框架中发现的网格系统,这些系统是基于12列网格的。然后,框架导入代码来完成所有的计算,以确保列加为100%。对于网格布局,网格“框架”所需要的唯一代码是:

.wrapper {
  display: grid;
  grid-gap: 10px;
  grid-template-columns: repeat(12, [col-start] 1fr);
}

然后我们可以使用这个框架来布局我们的页面。例如,要创建具有页眉和页脚的三列布局,我可能有以下标记。

<div class="wrapper">
  <header class="main-header">I am the header</header>
  <aside class="side1">I am sidebar 1</aside>
  <article class="content">I am the main article</article>
  <aside class="side2">I am sidebar 2</aside>
  <footer class="main-footer">I am the footer</footer>
</div>

然后,我可以把这个放在我的网格布局框架中,就像这样。

.main-header,
.main-footer  {
  grid-column: col-start / span 12;
}

.side1 {
  grid-column: col-start / span 3;
  grid-row: 2;
}

.content {
  grid-column: col-start 4 / span 6; 
  grid-row: 2;
}

.side2 {
  grid-column: col-start 10 / span 3;
  grid-row: 2;
}

再一次,网格高亮笔有助于我们向我们展示我们如何将我们的项目放在工作上。

使用命名网格线进行布局  |  CSS Grid Layout: Layout using Named Grid Lines

这就是我需要的。我不需要做任何计算,在将空间分配给1fr列轨道之前,网格会自动移除我的10像素分隔线轨道。当你开始构建你自己的布局时,你会发现对语法变得更加熟悉,然后你就能选择最适合你的方式以及你想要构建的项目类型。尝试用这些不同的方法建立一些共同的模式,你很快就会找到最有效的工作方式。然后,在下一个指南中,我们将看看网格如何为我们定位项目 - 我们无需使用展示位置属性!

网格布局 | Grid Layout相关

1.网格 | CSS Grid
2.网格布局 | CSS Grid Layout
3.网格布局中自动放置 | CSS Grid Layout: Auto-placement in CSS Grid Layout
4.网格布局的基础知识 | CSS Grid Layout: Basic Concepts of Grid Layout
5.网格布置中的框对齐方式 | CSS Grid Layout: Box Alignment in CSS Grid Layout
6.网格布局和渐进增强 | CSS Grid Layout: CSS Grid and Progressive Enhancement
7.网格布局和辅助功能 | CSS Grid Layout: CSS Grid Layout and Accessibility
8.网格,逻辑值和写入模式 | CSS Grid Layout: CSS Grid, Logical Values and Writing Modes
9.网格模板区 | CSS Grid Layout: Grid Template Areas
10.语言 编辑 高级 使用CSS网格进行基于行的放置 | CSS Grid Layout: Line-based Placement with CSS Grid
11.使用CSS网格布局实现常见布局 | CSS Grid Layout: Realising common layouts using CSS Grid
12.使用CSS网格布局实现常见布局 | CSS Grid Layout: Realizing common layouts using CSS Grid Layout
13.网格布局与其他布局方法的关系 | CSS Grid Layout: Relationship of Grid Layout
14.适合内容 | fit-content
15.flex value
16.网格 | grid
17.网格区域 | grid-area
18.网格自动列 | grid-auto-columns
19.网格自动流 | grid-auto-flow
20.网格自动行 | grid-auto-rows
21.网格列 | grid-column
22.格列端 | grid-column-end
23.格列隙 | grid-column-gap
24.格列开始 | grid-column-start
25.网格差距 | grid-gap
26.网格行 | grid-row
27.网格行结束 | grid-row-end
28.格列隙 | grid-row-gap
29.格行开始 | grid-row-start
30.网格模板 | grid-template
31.网格模板区 | grid-template-areas
32.网格模板列 | grid-template-columns
33.网格模板行 | grid-template-rows
34.设置最小值 最大值函数 | minmax
35.重复 | repeat
CSS

层叠样式表( Cascading Style Sheets )是一种用来表现 HTML 或 XML 等文件样式的计算机语言。CSS 不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。

CSS目录

1.动画和转换 | Animations & Transitions
2.背景和边框 | Backgrounds & Borders
3.基本框模型 | Basic Box Model
4.基本用户界面 | Basic User Interface
5.框对齐 | Box Alignment
6. 级联和继承 | Cascading & Inheritance
7.颜色 | Color
8. 合成与混合 | Compositing & Blending
9.条件和规则 | Conditional Rules
10.计数器样式 | Counter Styles
11.设备适配 | Device Adaptation
12.扩展 | Extensions
13.滤镜效果 | Filter Effects
14.灵活的框布局 | Flexible Box Layout
15.字体 | Fonts
16.片段模块 | Fragmentation
17.全屏 API | Fullscreen API
18. 生成内容 | Generated Content
19.网格布局 | Grid Layout
20.图像值 | Image Values
21.初始线格局 | Inline Layout
22.列表和计数器 | Lists & Counters
23.逻辑属性 | Logical Properties
24.面具 | Masking
25.媒体查询 | Media Queries
26.杂项 | Miscellaneous
27.Miscellaneous Level 1
28.Miscellaneous Level 2
29.运动路径 | Motion Path
30. 多列布局 | Multi-column Layout
31.命名空间 | Namespaces
32.项目模型 | Object Model View
33.网页媒体 | Paged Media
34.定位布局 | Positioned Layout
35.伪元素 | Pseudo-
36.节奏大小 | Rhythmic Sizing
37. Ruby布局 | Ruby Layout
38.可缩放矢量图形 | Scalable Vector Graphics
39.滚动快照 | Scroll Snap
40.选择 | Selectors
41.形状 | Shapes
42.文本 | Text
43.文字装饰 | Text Decoration
44.变换 | Transforms
45.值和单位 | Values & Units
46.变量 | Variables
47.写入模型 | Writing Modes
48.CSS 教程
49.CSS 创建
50.CSS Id 和 Class选择器
51.CSS 简介
52.CSS 盒子模型
53.CSS Table(表格)
54.CSS 列表样式(ul)
55.CSS 链接(link)
56.CSS Fonts(字体)
57.CSS Text(文本)
58.CSS Backgrounds(背景)
59.CSS Display(显示) 与 Visibility(可见性)
60.CSS 尺寸 (Dimension)
61.CSS 分组和嵌套
62.CSS 轮廓(outline)属性
63.CSS Border(边框)
64.CSS 图像透明/不透明
65.CSS 导航栏
66.CSS 伪元素
67.CSS 伪类
68.CSS Float(浮动)
69.CSS Position(定位)
70.CSS 总结
71.CSS 属性选择器
72.CSS 媒体类型
73.CSS 图像拼合技术
74.CSS 实例
75.CSS 组合选择符
76.响应式 Web 设计 – 框架
77.响应式 Web 设计 – 视频(Video)
78.CSS 提示工具(Tooltip)
79.CSS 布局 Overflow
80.CSS 计数器
81.CSS 表单