如何使用CSS新语法gridarea来设置网格布局
gridareaCSS属性是一种简写,它通过在一个声明中设置网格行开始、网格列开始、网格行结束和网格列结束的值来指定网格布局中网格项的位置和大小。。gridcontainer{display:grid;gridtemplatecolumns:repeat(autofit,minmax(100px,1fr));}。griditem:nthchild(2){gridarea:2446;isequivalentto:gridrowstart:2;gridcolumnstart:4;gridrowend:4;gridcolumnend:6;}
由于CSSGrid的默认自动放置行为,此示例中的第二个网格项通常放置在网格第一行的第二列中。但是,由于我们声明了网格面积并将其设置为将网格项的起始边缘和结束边缘与我们所需的网格线对齐,因此该项移动到第二行和第四列,并在两个方向上跨越两条轨道,以满足正确的结束网格线。
使用网格区域CSS属性设置第二个网格项的位置和大小。成分属性
如前所述,网格区域属性是结合了四个属性的简写s:
gridcolumnstart
。element{gridcolumnstart:3;}
gridcolumnend
。element{gridcolumnend:4;}
gridrowstart
。element{gridrowstart:2;}
gridrowend
。element{gridrowend:3;}
Syntax语法gridarea:gridline〔gridline〕{0,3}
此属性最多可以采用四个值,由正斜杠()分隔。设置四个值
如果设置了第一个值设置网格行开始属性。第二个值设置网格列开始属性。第三个值设置网格行结束属性。第四个值设置网格列结束属性。。griditem{gridarea:2436;isequivalentto:gridrowstart:2;gridcolumnstart:4;gridrowend:3;gridcolumnend:6;}设置三个值
第一个值设置网格行开始属性。第二个值设置网格列开始属性。如果值为。否则,网格列端设置为auto。第三个值设置网格行结束属性。customident。griditem{gridarea:2area4;isequivalenttogridrowstart:2;gridcolumnstart:area;gridrowend:4;gridcolumnend:area;}gridline。griditem{gridarea:243;isequivalentto:gridrowstart:2;gridcolumnstart:4;gridrowend:3;gridcolumnend:auto;}设置两个值
第一个值设置网格行开始属性。如果值为。否则,网格行结束设置为自动。第二个值设置网格列开始属性。如果值为。否则,网格列端设置为auto。customident。griditem{gridarea:area4;isequivalenttogridrowstart:area;gridcolumnstart:4;gridrowend:area;gridcolumnend:auto;}anothercustomidentexample。griditem{gridarea:areaanotherarea;isequivalenttogridrowstart:area;gridcolumnstart:anotherarea;gridrowend:area;gridcolumnend:anotherarea;}gridline。griditem{gridarea:24;isequivalenttogridrowstart:2;gridcolumnstart:4;gridrowend:auto;gridcolumnend:auto;}设置1个值
customident。griditem{gridarea:area;isequivalenttogridrowstart:area;gridcolumnstart:area;gridrowend:area;gridcolumnend:area;}gridline。griditem{gridarea:2;isequivalenttogridrowstart:2;gridcolumnstart:auto;gridrowend:auto;gridcolumnend:auto;}理解此语法
基于值数量的不同方案更不用说案例乍一看可能看起来很复杂和奇怪。但如果你仔细想想,这一切都是有道理的。
以以下网格项为例:。griditem{gridarea:243;}
在这里,省略了gridcolumnend(因为这是一个三值语法),gridcolumnstart设置为4。gridcolumnend属性不能也为4,因为网格项的起始边缘和结束边缘将指向同一行。浏览器不会将起始边缘与4对齐,并将网格项跨越一列作为默认行为。这就是为什么当一条边没有值时,它会设置为自动以防它的另一条边指向带有数值的网格线。
现在,如果将网格列开始值设置为名称怎么办?例如,用x代替4:。griditem{gridarea:2x3;}
X值可以是网格线或网格区域的名称。如果有一条名为x的网格线,则网格列端也设置为x,但由于网格项的两个列边缘都指向同一网格线x浏览器的默认行为再次是充当好像网格列结束设置为自动并且网格项跨越一列。
另一方面,如果存在一个名为x的网格区域,则gridcolumnstart设置为该网格区域的起始边缘,而gridcolumnend设置为其结束边缘。
当你在代码中看到它时,更容易理解所有这些:。griditem{gridarea:2x3;isequivalenttogridrowstart:2;gridcolumnstart:xstart;gridrowend:3;gridcolumnend:xend;}值Keywordvaluegridarea:auto;customidentvaluegridarea:myarea;gridarea:mainstartsidebarstart;gridarea:mainstartsidebarstartfooterstartmainend;gridarea:line1line2line3line4;integercustomidentvaluesgridarea:3;gridarea:23;gridarea:main2;gridarea:2a4b2x;spanintegercustomidentvaluesgridarea:span3;gridarea:13span25;gridarea:1spanmyline;gridarea:2spangridline3;Globalvaluesgridarea:inherit;gridarea:initial;sameasautogridarea:revert;gridarea:revertlayer;gridarea:unset;auto
这是默认值。它指示默认范围(1)和自动放置行为,这意味着网格项将自动放置在下一个可用的空网格单元格中。
此语法允许您使用整数来引用编号的网格线,或使用字符串来引用命名网格线或命名网格区域。换句话说,可以通过网格项边缘的数字索引或名称来指定网格线。按行号定位项目
每个网格轨道之前和之后都有两条网格线,从数字1开始,自动为其分配一个数字索引。
演示行和列网格轨道的索引。
在本文的第一个示例中,我们使用此语法通过索引(2和4)引用第二行和第四行网格线,以将网格项的开始边缘和结束边缘与第二行和第三行的开始边缘和结束边缘对齐。此外,我们参考第四列和第六列网格线,将网格项的开始和结束边缘与第四列和第五列的开始和结束边缘对齐。。griditem:nthchild(2){gridarea:2446;}
请注意,您也可以使用负数来指代网格线,但它从网格的结束边缘开始计数。以下代码指向上一示例中的相同网格线,但计数相反:。griditem:nthchild(2){gridcolumn:4422;sameas:gridarea:2446;}
请注意,负整数已分配给我们的网格:
使用网格区域CSS属性将第二个网格项放入第二行和第三行以及第四列和第五列。按行名定位元素
您可以使用网格模板列和网格模板行基于线条的放置网格属性为网格线指定自定义名称,以按其名称引用该线。
让我们回到我们的示例,并像这样命名列和行轨道行:。grid{display:grid;gridtemplaterows:100px〔row2〕100px100px〔row4〕100px;gridtemplatecolumns:1fr1fr1fr〔fourth〕1fr1fr〔secondtolast〕1fr;}
我们可以通过自定义名称(row2、row4、第四和倒数第二)来引用第三行和第五行,而不是它们的索引值(分别为2、4、4和6):。griditem:nthchild(2){gridarea:row2fourthrow4secondtolast;sameasindexnumbers2446}
请注意,不能采用span值。span是网格放置属性的保留关键字(例如gridcolumn:1span2)。通过gridareas来定位元素
使用gridtemplateareas属性定义网格区域时,将根据区域的名称免费获得隐式行名称。例如,名称为content的网格区域在其前面生成一个名为contentstart的行,在其之后生成一个名为contentend的行。您可以参考这些行来设置网格项的位置。。griditem:nthchild(2){gridarea:contentstartcontentstartcontentendcontentend;}
或者,您可以引用区域的名称,将项目定位在名为area的内容的开始行和结束行:。griditem:nthchild(2){gridarea:content;}
如下是完整例子bodyheaderheadermainmainasidefooterfooterbodybody{display:grid;gap:16px;gridtemplatecolumns:1fr1fr1fr;gridtemplaterows:mincontent1frmincontent;gridtemplateareas:headerheaderheadercontentcontentsidebarfooterfooterfooter;}header{gridarea:header;}main{gridarea:content;}aside{gridarea:sidebar;}footer{gridarea:footer;}
这将设置网格元素在网格中的位置,我们希望它们在网格中的位置。
使用网格区域CSS属性按名称将网格项放入网格区域中。?h1
这种语法风格允许您在存在重复名称时按网格线定位网格项。如果存在同名的网格线,则此语法有助于指定要引用的网格线。。grid{display:grid;gridtemplatecolumns:〔a〕1fr〔b〕1fr〔b〕1fr〔b〕1fr〔b〕;gridtemplaterows:〔x〕1fr〔y〕1fr〔y〕1fr〔y〕1fr〔y〕;Usingrepeat()functionalsogivesyourepeatednamedgridline,forexample:gridtemplatecolumns:repeat(3,〔b〕1fr);}
假设您想在行轨道中选择第三行,但该行与第二、第四和最后一个网格线同名它们都称为y。由于名为y的第二行是第三条网格线,因此可以使用2选择它作为起点。在以下示例中,相同的计数方式适用于网格面积的其他值:。griditem:nthchild(2){gridarea:2y3b4y4b;Thisisequivalentto:gridrowstart:2y;gridcolumnstart:3b;gridrowend:4y;gridcolumnend:4b;}
请注意,值的顺序无关紧要。我们也可以像这样编写前面的代码:。griditem:nthchild(2){gridarea:y2b3y4b4;}
与前面的语法一样,您也可以使用负整数来计算从网格结束边缘开始的网格线。在我们的示例中,如果我们想引用相同的行,我们可以从网格的结束边缘开始计数并像这样写:。griditem:nthchild(2){gridarea:3y2b1y1b;}
请注意,整数值不能为零。span〔〕h1
此语法允许网格项跨越网格轨道。可以通过三种不同的方式指定它。
请注意,如果未在此语法中的任何位置指定整数,则默认值为1。span
使用span关键字后跟整数表示网格项从特定网格线跨越的轨道数。例如,如果我们希望网格项跨越三个行轨道和两个列轨道朝向其起始边缘,我们可以应用以下值:。griditem:nthchild(2){gridarea:span3span2;Thisisequivalenttogridrowstart:span3;gridcolumnstart:span2;gridrowend:auto;gridcolumnend:auto;}
网格项使用网格区域CSS属性跨越两列和三行。span
还可以将span关键字与网格线的名称组合在一起,以使网格项扩展,直到到达指定的网格线。。griditem:nthchild(3){gridarea:auto3autospanlastline;}
由于网格项的起始线是已知的(3),我们可以跨越该项,直到它到达名为lastline的列网格线。
网格项跨越网格,直到它使用网格区域CSS属性到达名为lastline的指定网格线。spanh1
如果指定的网格线名称分配给多个网格线换句话说,如果我们重复命名的网格线我们需要说出我们想要定位的网格线。为此,我们可以在值中添加一个整数,指定我们引用的网格线。
以以下网格为例:。gridcontainer{display:grid;gridtemplatecolumns:〔y〕1fr〔x〕1fr〔x〕1fr〔y〕1fr〔x〕1fr〔x〕;}。griditem:nthchild(3){gridarea:224spanx2;}
我们将网格项的起始行设置为第二列行。然后我们希望它向前跨度,直到它到达名为x的网格线。由于我们希望它是第二条x网格线,因此我们最终得到spanx2。
因此,我们的网格项从第二行开始,如下图所示。它命中的第一行是第一行x,后跟y,最后,它命中所需的第二行,名为x。
S使用gridarea属性将网格项的位置从第二列行调整到第二个x命名行。
当您希望使用网格项的名称将网格项跨越到网格线时,此语法非常有用。但请注意,使用此方法有多个同名的网格线,因此我们添加一个整数来表示我们想要该网格线的N。
请参阅网格行开始、网格行结束、网格列开始和网格列结束,以获取每个构成属性的详细信息和语法示例。例子
让我们通过几个例子来演示如何使用网格区域在网格上放置项目。创建多层横幅
假设此图形是由您的设计团队交给您的:
他们还提供了另一个版本来向您展示它是在网格上设计的:
让我们首先设置我们的HTML:figureimgclassbacksrca2020imgdataimg。jpgdatasrcimg02。bs178。comblah3dc39543b30bcb98。jpgaltPleaseimgclassmiddlesrca2020imgdataimg。jpgdatasrcimg02。bs178。comblahdf885e572cc4d7cd。jpgaltfillyouraltimgclassfrontsrca2020imgdataimg。jpgdatasrcimg02。bs178。comblahd724da10e00afbfd。jpgaltproperlyfigcaptionFreedomistheoxygenofthesoul。。。figcaptionfigure
设计中有十四列九行。我们可以这样写出来:figure{display:grid;gridtemplatecolumns:repeat(14,50px);gridtemplaterows:repeat(9,50px);}
我们需要将所有这些子元素放入其右侧网格区域中。为此,我们使用网格区域属性:。back{gridarea:1321;}。middle{gridarea:2179;}。front{gridarea:4413;}figcaption{gridarea:3411;}
您可以在下图中看到结果:
查看演示以了解有关此示例的更多详细信息:堆叠网格项
在网格上定位项目时,我们可以将它们堆叠或重叠在一起。这使我们能够有时使用CSS网格作为绝对定位的替代方案。例如,我们可以在不使用位置属性的情况下将标题层放在图像顶部,如下所示:figureimgsrca2020imgdataimg。jpgdatasrcimg02。bs178。comblahbd970f64a6301fa7。jpgalthowdareyouleavealtempty?figcaptionThecaptionofourimagefigcaptionfigurefigure{display:grid;}img,figcaption{gridarea:1111;}
默认情况下,网格项按源顺序堆叠,但您可以使用zindex属性控制其级别。在下面的示例中,我们重叠了一些项目,我们使用zindex属性将第二个项目带到堆栈上下文中的最高级别:。item:nthchild(2){gridarea:2244;zindex:1;}
使用zindex属性将第二个网格项置于堆栈顶部。可访问性
使用网格放置属性时需要注意的一点是重新排列项目引起的问题。更改项目的位置时,只有网格项目的可视顺序会更改,并且该顺序可能与原始文档顺序不同。对于在键盘上按Tab键浏览文档或收听按与HTML相同的顺序读取内容的屏幕阅读器的人来说,这可能会导致非常糟糕的体验。
因此,当元素的HTML顺序很重要时,请避免更改网格项的顺序。例如,它可能适用于随机图像库,但可能不适用于表单输入。
但是,在撰写本文时,有一项解决此问题的建议,有望在未来解决这一问题。。grid{gridtemplatecolumns:gridtemplaterows:}。item:nthchild(3){gridarea:}