使用CSS网格在响应式布局中定位内容。
CSS网格被前端开发人员和设计师用来构建各种现代的网页布局和界面——事实上,它是像Slack和Webflow Style面板这样的应用程序的布局结构。但它可以用来创建从基本结构到整个网站的任何东西。
我们将从6个部分介绍基于网格的布局:我们将展示如何创建和配置网格,我们将讨论神奇的div块,我们将使用网格自动位置创建一个图像网格布局,我们将使用手动位置和重叠创建一个四象限的英雄部分,我们将使用网格模板区域进入可重用布局,然后我们将介绍如何使网格布局在不同的设备上响应工作。
现在。在我们开始之前,让我们先弄清楚一些事情。网格是导游。这与在iOS上安排应用程序和小部件没什么不同。(你可以把东西推来推去,但网格内的东西将由列引导…和行。)
这是CSS Grid的默认行为(东西自动定位…当它们的列用完时,它们会换行到下一行)。但这只是开始。因为你可以做的更多。
记住这一点,让我们从最基本的开始。任何东西都可以是网格。几乎任何事情。这是一个部分。点击网格?现在你有了一个网格。这是一个div块。点击网格?现在你有了一个网格。在Add面板上? There’s a grid you can just drag right in. Collection list filled with dynamic content from the CMS? Set its display setting to Grid? Now you have a grid. Working on a late-night project and accidentally spill coffee, causing your other hand to lean in just the perfect way on your macOS-compatible keyboard to press both the Command and E keys at the same time? Start typing Grid, press Enter. Now you have a grid.
现在。这是在Mac上,在Windows上不一样。Grimur吗?
格里穆尔:我在做一个深夜的项目,不小心把咖啡洒了出来,导致我的另一只手在兼容windows的键盘上完美地向前倾,同时按下了CONTROL和E键。
麦圭尔:开始输入Grid,按Enter键。现在他有了一个网格。
我们如何使用网格呢?我们只是把东西放进去。默认情况下,内容会占用可用的单元格,并自动换行到下一行。实际上,将自动创建新行。
在任何时候,编辑一个网格…新闻编辑网格。现在您正在编辑网格。在进行编辑时,可以向网格中添加列或行。注意内容是如何自动换行来填充里面的空间的。一旦我们完成了网格的编辑,让我们关闭。
这是第一件看起来很奇怪的事如果我们想把一个元素拖到右下角的单元格?它只是…是行不通的。但这是预期。这是因为默认情况下,添加到网格中的元素是自动定位的。如果我们想手动定位它?把它调到手动档。现在我们可以把它拖到任何地方。
我们将在稍后详细讨论手动位置时讨论这个,但这里有一点非常重要。
这是我们在CSS网格中建立的网站。除了它不是。Microsoft Excel。在电子表格或表格中,删除一行或一列通常会破坏其中的内容。
网络上的网格是不同的。因为它们是参考线,所以删除一列或一行可能会影响内容,但并不是删除实际内容。
这就是主要的思想:在创建网格时,没有任何错误的操作。网格是非破坏性的,因为它们只是我们将放入其中的内容的指南。
让我们进一步编辑我们的网格。这里有很多选择。我们只需点击和拖动,就可以调整空间(你可以调整行和列之间的gap)。
但它会变得更好。想调整列本身吗?你也可以这样做;您可以通过单击和拖动来调整列的大小——当您编辑网格时,您可以在画布上执行此操作。
顺便说一下,FRs(这些列上的FR单位)?这些是分数单位。因为在网格出现之前,我们需要手动计算百分比、像素值(你仍然可以使用这些)……但FRs取代了所有人必须管理自己的笛卡尔坐标系,取而代之的是更直接的东西。它是这样的:
三列?每组1 FR?这意味着每一个都将占宽度的1/3。四列?1 FR每个?现在每个占1/4。我们已经算好了,如果我们想让这一列的宽度是其他列的两倍,我们只要把它设为2fr。注意其他的都是自动缩放的。还有一点需要注意:我们提到了每个单元格之间的间隙。你可以改变这些差距,FRs仍然可以弥补这一点。
FRs魔法吗?没有;他们的科学。还有魔法。
当你完成编辑网格时,记住你总是可以返回并更改内容,但现在,我们可以只按Escape,或按“完成”按钮。
所以。网格。我们可以做一个网格,设置一些行和列,然后开始把东西放进去。它们会自动定位自己,但我们可以通过设置一个或多个元素为MANUAL定位来偏离这一点。(然后我们可以在网格中任意移动它。)
让我们转向神奇的Div块。因为如果你还没注意到的话,有些奇怪的事情发生了。像这样的实用布局并不多。我们经常会遇到这样的问题:“是的,网格,但我们如何使用它?”撇开语法不谈,这里有一个要点。基于网格的布局通常需要嵌套的东西(标题、段落、按钮、图像等等)——网格布局通常需要在单个单元格中放置多个东西。
所以。我们只是把东西设置为手动位置然后拖到同一个单元格里吗?嗯…不。现在它们都摞在一起,乱七八糟。
输入:神奇的div块。它是一个div块。但我们称之为神奇。这个想法是这样的:我们可以拖进一个div块,它占据了一个单元格…我们可以把它放在任何地方…现在我们可以把东西放到div块里面了。
如果这是我们的网格,我们想让这些东西在里面,我们在单元格里放一个DIV块。我们把想要的东西放好…在div块内部。确保我们放置元素的最精确的方法是使用Navigator(但我们稍后将介绍在画布上执行此操作的快捷方式)。
但这是第二个大的想法(我们已经讨论了网格如何作为内容的指南)……但这里的第二个收获是grid cell不是实际的容器(它们不是div块,默认情况下,它们一次只保存一个东西)。
因此div块给了我们在网格单元格中放置多个元素的能力。
这是我们的两个要点:网格引导我们的内容,div块允许我们在网格的任何CELL中嵌套多个内容。
但让我们把它设为REAL,并将其全部放入REAL布局中。为了做到这一点,让我们先进行自动定位。通过构建这个图像网格。
这个很简单。对于我们来说,我们有一个空白的部分和一个空白的容器……我们将使用一个网格(从添加面板中拖拽一个网格,我们把它放在容器中-这样我们就可以保持网格和我们的图像包含在我们的设计中心)。
但现在,让我们添加图像。如我们所知,向我们的网格中添加东西?我们只需点击并拖动它。(我们正在使用图像,但这可能是标题或链接或div块或视频…)
让我们在继续之前编辑我们的网格-让我们把它变成4x4(记住:我们总是可以改变这个)。当我们做了什么?让我们停止编辑。
让我们继续把图片拖进去。但是请注意,就像我们前面提到的那样,无论我们放开什么,内容都是自动放置的。网格的子元素(其中的图像)只是在grid中填充可用的单元格。(这是自动完成的。)
事实上,如果我们再去编辑一次呢?例如,我们可以改变列的数量。同样,在Excel或数字或谷歌表格或冰立方托盘中,删除一列是非常具有破坏性的,会破坏里面的东西。但在这里……我们的图像很好。它们现在只占更少的列(自动换行)。搞定之后,我们就回去吧。
这里需要注意的是SIZE…就是这些行(网格中每一行的高度)-这是自动调整大小的。因为网格(以及容器和Section)——因为它们都没有设置高度,一个选项是在网格上设置高度。让我们选择像800像素这样的像素,但我们总是可以在以后修改它。
但现在它有点不一致-这些图像有不同的纵横比;它们都排列在每个单元格的左上角…让我们开始控制它。选中GRID后,让我们看看这里的选项。我们可以调整…或为Grid中的任何CHILDREN元素进行调整。
现在。特别是对于图像,有时设计师希望这样的图像更一致地适合(具有相同的行高和相同的纵横比)。
一个很好的方法就是适合(物体适合)。这是100%的魔法。而且它(大多数时候)是有效的。
现在。在拍摄之前,我们对这些图像预先应用了相同的类。你可以告诉……因为它字面上写着“我们预先应用的类”在每张图片上。如果我们没有这样做,我们总是可以在以后添加一个类。但是我们做到了。
所以。为了均匀地贴合图像?我们只需要做两件事:(1)我们设置尺寸(我们设置100%宽度…和100%的高度)。(2)我们使用对象匹配。(我们在应用于图像的CLASS上执行所有这些操作)。我们将设置FIT…封面。
就像这样,所有的对象都适合它们的单元格。注意行高是完全相等的。
现在。这个网格现在的大小是怎样的?让我们回到过去,因为我们一分钟前设置高度为800像素。如果我们在GRID上移除这个高度会发生什么?它会趋于零吗?
几乎。事实上,如果你仔细观察,它仍然有GAP(行之间的空间)。但是因为我们定义了每个图像的高度为100%,所以它们只会和行本身一样高。它们没有高度。所以这整件事才会崩溃。所以。如果我们放回一个号码?(如果我们给网格一个高度?)它相应的尺寸。
当然,蓝色属性标签变成蓝色是因为我们在这个类上做了一些更改。而且,正如我们所知,AMBER属性标签显示这个类的值来自其他地方。但是粉色标签呢?
让我们选择其中一个图像并SPAN它(我们抓取角落…点击和拖动……跨度)。因此,它跨越了多个单元格,而不是网格中的一个单元格。我们可以在Style面板中看到它:我们可以看到它跨越了多少列和多少行。这些信息存储在元素中。这就是粉色标签的含义——这并不适用于我们之前预应用的整个类,称为“我们预应用的类”——它只影响SELECTED元素。
这是使用图像网格的自动定位。那手动定位和重叠呢?为了解决这个问题,让我们建立这个英雄部分。但为了达到这个目的,让我们首先把我们的英雄部分并排(我们稍后会讨论为什么)。
为此,我们只需拖入一个Section元素(将其直接拖到页面主体中)。我们将设置一个高度(让我们设置最小高度为70vh -这样它是视口高度的70%)。
我们要做的就是并肩作战?只需设置Section…网格。(两列…现在我们可以并排建造了。)
我们先在左边放一幅图。让我们转到Assets面板,将我们想要的图像拖到左侧(将其放到Grid部分)。默认情况下(如我们所知),它放在FIRST可用单元格中(左上角)。我们希望我们的图像占据所有可用的空间。
幸运的是,我们刚刚浏览了一下FIT对象。就像我们之前做的一样,我们做了两件事来让它完美地工作。我们可以(1)添加我们的尺寸(设置图像的宽度和高度为100%)…(2)我们可以设置FIT为Cover。(现在我们的图像…覆盖了第一个细胞。)
但这不是我们说要做的。
选中图像后,让我们张成空间。(我们希望单击和拖动跨左列的两个单元格SPAN这个元素。)就是这样。同样的,生成就是这么简单。想要跨越TOP两个单元格?单击并拖动……跨越。想放回去吗?跨度。
跨度。这个词越说越怪。
这是并排的左边。那右边的呢?这里我们要回到神奇的Div块。我们将把一个div块直接拖到网格中,它可以放在下一个可用的单元格中。跨越吗?我们把它张成空间。这是并排的。
如果我们想在里面放一个标题?让我们来演示一下做这件事的错误方法。拖动标题……在这里的右边?放手吗?这个…不是我们想要的。记住:把东西拖到网格中和把东西拖到网格中的Div块中是不同的。
为了确保我们做对了,我们来撤销。再试一次,但这次让我们按住macOS上的Command键或Windows上的Control键…然后将标题拖到Div块中。我们可以在导航器中验证这一点。(标题在div块中…在网格中。)
让我们对段落做同样的操作——这次我们可以将段落直接拖到导航器中(就在标题下面)。
最后,让我们添加一些按钮。这一次(因为我们已经养成了展示不同添加方式的习惯)……在我们的段落仍然被选中的情况下,我们可以在它后面添加一些东西。我们将使用Quick Find。
我们可以通过按Command + E(或Windows上的Control + E)并开始输入按钮来实现。这不仅仅是元素(甚至是我们设计和保存的其他布局)。一旦我们选择了它?它被放在段落的正后面。
现在。如何垂直居中呢?几个方面。我们可以选择网格本身。如果我们想让孩子们站到中间…我们只是…对齐到中心。
或者,如果我们想撤销它,我们可以使用flexbox(我们可以将flexbox应用到Div块本身,并确保它被设置为垂直,我们可以混乱我们的对齐或对齐控件,以使其按照我们想要的方式工作)。
如果我们再次选择网格,然后点击编辑?我们可以调整甚至删除间隙(只设置那里的间隙为零)-所以现在它与图像是真正的50/50分割。右边的内容呢?我们可以使用Div块(顺便说一下,让我们将其命名为“Hero content”以保持内容的条理)。
但是等一下。这个部分叫做手动位置。到目前为止…一切都使用自动定位。(我们已经讨论了跨度,但还没有在这个布局中使用MANUAL position)。所以。我们的目标是什么?我们的目标……将英雄内容放在右下角的单元格中。我们怎么做呢?
嗯…我们只是把左边的图像设置为手动位置…我们将div块的右侧设置为手动位置。现在呢?我们可以选择并SPAN我们的图像来占用所有四个单元格。如果我们想让神奇的flexbox Div块位于右下方?我们向下张成空间,所以它占据了右下角的单元格。现在我们有一个BASIC重叠。
它是惊人的?还没有。这里需要注意几点:(1)我们需要让背景变得不那么糟糕。因此,在我们的Div块(英雄内容块)中,我们可以添加背景颜色。但是(2)我们应该算出行高是怎样的。因为您可能会注意到,第二行的HEIGHT不再是HALF -因为我们也将CONTENT的高度添加到最下面的行。我们可以将每一行设置为1 FR吗?我们可以同时用分数单位吗?嗯,是的。实际上,这仍然会尊重里面的内容,但会给我们更均匀的行。 But we could also make the BOTTOM row Auto. That’ll mean the SIZE of the bottom row is determined ONLY by the content inside. And when we do that, we can now add breathing room by adding PADDING (just add some padding to the Hero content block).
但那是手动定位和重叠。可重用布局呢?这部分讲得很快。因为,这里有一部分。让我们给它一个高度(比如说750像素)。我们把它变成一个网格。但这一次,让我们在网格内设置布局。无论我们如何配置我们的网格…我们可以定义网格区域(我们只需点击小加号开始定义网格区域)。这让我们可以定义网格中可以保存内容的区域(换句话说,我们定义了布局的各个部分)。 But the REASON this is important is because we can REUSE these entire layouts in other parts of our project.
但重要的是。这个布局吗?这是课程的一部分。事实上,我们可以将这个类重命名为“示例布局”(还有更聪明的选项)…我们可以把它应用到另一个元素上。因此,让我们在这个部分下面添加另一个部分(当然,您可以将它添加到项目中的任何页面)。我们注意到了什么?嗯,没有。我们必须应用示例布局类。
但是现在我们注意到了什么?它的布局不仅遵循相同的规则,而且……它是空白的。如果我们在这个布局中添加其他东西呢?(这些都只是里面有一些东西的div块——同样,我们使用的是普通的旧div块,我们有时称之为“神奇的”作为小容器——我们放在网格单元格中的容器。)如果我们编辑我们的网格会发生什么?它是独特的吗?不。因为这是一个可重用的布局,我们可以定义我们的区域,甚至在事实之后重新定义我们的区域。整个项目的布局都在变化。
把更多的实际?我们可以使用区域来定义整个布局。这意味着任何一个区域的改变都会影响所有使用这个类的网格。但那是网格模板区域。
让我们结束关于响应式设计的讨论。网格默认是响应的。因为每个列的宽度通常用FRs来调整大小,所以它通常会尊重这些比例和里面的内容。随着浏览器变得越来越窄,所有内容都将相应地扩展。
但如果你想改变另一个视图中的东西呢?想要针对不同设备进行设计?我们可以做出改变。即使我们改变列数,并且网格子结点设置为自动?(如果网格的子节点被自动定位?)它们会像你预期的那样自动包装。回到桌面?一切都和以前一样。
这是因为更改从基本断点开始级联,这意味着当您更改桌面上的内容时,将影响平板电脑和移动设备的视图。你在平板电脑上添加或更改的内容也会影响到手机。(这里有一个规律。)移动景观变化影响移动肖像。当我们往下看不同的视图时,变化只影响较小的设备。
您会注意到,如果您有MANUAL?(如果某些东西被设置为手动位置?)如果您没有告诉它您希望它在某个较小的断点上做什么,它就会以这种方式卡住。即使您删除了一个列,如果某个东西是手动放置在那里的,那么您必须手动将它放置在一个新列中,或者将其位置设置为自动。
现在。关于手动定位有一点需要注意:如果你在画布上视觉上重新定位一个元素(如果你在网格中移动它)?它对实际的文档顺序没有影响。为什么这很重要?如果你在使用像VoiceOver这样的屏幕阅读器,默认情况下,它会遵循你在NAVIGATOR中看到的顺序(文档顺序)。选中THIS元素后,注意它在导航器中的位置是如何保持不变的,即使我们使用手动位置来移动它(顺便说一下,这也可以应用于网格区域)。当你在网格中组织内容时,记住这一点是至关重要的:确保ORDER(你希望别人解释你的内容的方式)-确保在导航器中设置好了,然后根据需要进行视觉调整。这不仅符合逻辑、正确和高效,而且是朝着开发更容易访问的网站的正确方向迈出的一步。
以上就是CSS网格响应式设计的概述。
所以。我们的两大收获:(1)网格作为指南(删除一行或列并不删除其中的内容)。(2)网格单元通常一次只能容纳一件东西。所以在单元格中放入DIV块可以解锁SUPERPOWERS…让我们把其他东西放到Div块里。
所以。让我们快速回顾一下Grid。我们可以像添加其他元素一样添加网格。我们可以把东西放到网格中,它们会自动放置。它们会填满空白……当然,除非你把某些东西设为手动,在这种情况下,你可以让孩子做任何你想做的事。像父母。除了完全没有。
我们可以跨越事物,重叠事物……我们可以创建可重用的布局,当我们将这个类应用到其他东西上时,这个布局就会延续。我们还可以进行响应式设计(采用在桌面运行效果很好的网格布局,但可以在较小的视图上删除一些列)。
现在。我们会讲到更多这方面的内容…比如自动调整、网格的密集设置、设计更大的断点、何时使用flexbox与何时使用GRID——所有这些都在Webflow University上。如果你还没看过的话,去看看吧。
但这只是对网格的概述…Webflow。
在这节课中:
Webflow中的网格布局使CSS网格在一个完全可视化的画布上变得栩栩如生。这让你更直接地控制你的布局和设计。使用网格,您可以在网格内的任何地方重新定位和调整项目的大小,以生成功能强大、响应迅速的布局——更快。
您可以使用网格来创建各种布局。例如,您可以使用它创建一个表,以便在较小的设备上轻松转换为卡片。
的网格元素中选择网格元素即可创建网格添加面板。控件中的任何现有元素也可以应用网格布局风格的面板.
要编辑网格,请单击编辑网格下布局在风格的面板当您选中网格时。
若要退出网格编辑模式,按ESC或者点击完成在画布上。
要添加列和行,请选择添加控件中出现在画布上或风格的面板.
若要复制或删除列或行,请右键单击列或行标题并选择重复的或删除.
控件中的任何行或列也可以删除或复制风格的面板当鼠标悬停在列或行上时。
中的行或列重新排序风格的面板,打开网格设置,将鼠标悬停在要移动的行或列上,然后拖动出现的手柄。
间隙允许您指定网格项之间的空间,而无需添加空白或填充。若要调整列和行之间的间隙大小,请单击并拖动画布上的间隙。
或者,您可以在风格的面板.
要调整网格列的大小,请在画布上选择并拖动列标题到所需的大小。
控件中的行或列标题中为列和行输入自定义大小风格的面板.
网格布局引入了一个额外的长度单元来帮助我们定义网格:FR单元。FR单元表示网格容器中可用空间的一小部分。您使用它来定义行和列的长度,就像百分比或像素单位一样。但是,与固定百分比或像素单位不同,FR单元在调整间隙时自动计算单元格空间。
大小调整值为1FR的列将拉伸或收缩以填充网格容器中的可用空间。如果添加或删除列,所有单位为1FR的列将相应调整。
设置最小/最大值可确保行和列不会缩小到设置的最小值或扩大到设置的最大值。例如,一行的默认高度为auto,并将扩展或缩小以适应里面的内容。
如果你想让你的行有一个最小高度,比如说200px,你可以设置最小值为200px,最大值为Auto。这样,行将根据内容增长,不会缩小超过200px。您可以对列执行同样的操作。
要为任何列或行输入最小/最大值,请在画布上的曲目标题中或在风格的面板.
您可以在网格中添加任何内容:标题、图像、div块,甚至另一个网格。添加到网格中的任何内容都将成为该网格的子元素。默认情况下,每个新的网格子单元格将填充一个单独的网格单元格——从左到右填充下一个可用的单元格。如果一行中没有更多可用的单元格,则会生成一个新行来容纳新的子网格。
控件中的方向设置,可以更改网格子节点的方向风格的面板.在这里,您可以选择默认的行设置,即从左到右排列子级。或者,将方向更改为列,将子元素从上到下放置。
若要覆盖自动放置设置以手动放置网格中的项目,请长按转变将元素拖到网格中。在网格中手动定位的任何项目都将保持手动位置设置。
要将现有网格子模块的位置设置更改为手动设置,请选择网格子模块并更新风格的面板.
手动放置的子网格将保留在指定的网格单元格中。当自动放置的网格子单元格移动到下一个单元格以容纳新的网格子单元格。
通过在网格子单元中嵌套元素,可以向单个网格单元中添加多个元素。要做到这一点,首先需要向网格添加一个布局元素,比如Div块,作为直接网格子元素。
将布局元素(如Div块)添加为网格子元素之后,可以通过按住将其他元素添加到Div块中控制当您将元素拖放到网格单元格中时。
有两种方法可以复制一个网格子,在网格中的多个单元格中重用相同的内容:
一旦将内容放入网格中,就可以随心所欲地操作它们。您可以移动内容以在不同的单元格中重新定位它们。您可以跨越内容以占用多个单元格。您还可以调整网格内内容的对齐方式。
要重新定位网格中的内容,请选择并拖动网格子节点到画布上的所需位置,或在导航器.
控件的网格子设置部分中设置网格子的顺序风格的面板.
控件中的所有子网格的对齐方式要更新,请选择网格并更改对齐方式设置风格的面板.
控件的网格子部分中,选择网格子并更新自对齐设置即可更改单个网格子的对齐方式风格的面板.
要跨多个网格单元格跨越网格子单元格,请选择网格子单元格并拖动出现在网格单元格角落中的句柄。
的子网格也可以跨风格的面板.对于具有自动定位功能的子网格,请指定子网格应该跨越多少列和多少行。
对于手动定位的子项目,请输入项目开始和结束的列和行。
观看视频教程跨越响应网格中的内容.
负网格子定位值很好,如果你:
负数允许您相对于网格的末端定位子单元——它们从右到左或从下到上引用单元格。
要使导航栏跨越所有列,请将其放置在列1(第一列)和列-1(最后一列)之间。
若要始终将页脚保持在网格的最后一行,请将其放置在行-1/ -1中。
如果您想保持子节点在网格的中心,每边的列数相同,请将“end”值设置为“start”值的负等值。例3/-3或2/-2。现在,如果在较小的断点上删除列,子节点将保持居中。
网格子设置只应用于所选元素,它们不会与类一起保存。粉红色的标签风格的面板显示应用于当前断点上选定元素的更改设置。这些样式级联到较低的断点,并用橙色标签表示。当您在较小的断点上覆盖继承的(橙色)样式时,指示符将再次变为粉红色。
要删除任何应用的网格子设置,请单击粉色标签,然后单击重置。
手动定位的子网格在同一单元格中相交时会自动重叠。您还可以控制这些重叠元素的堆栈顺序。可以通过将它们重新定位到导航器,或通过调整定位和z-index设置。
观看视频教程重叠网格内容.
当您跨了子网格时,空单元格可能保留在网格中。中的密集设置可自动填充这些单元格中的内容风格的面板.
请注意:密集的试图将网格子单元格装入网格的空单元格中。这可能不利于可访问性,因为它只会改变项目的位置显示,而不是出现在页面源代码中的位置。
要设计网格,使其跨屏幕响应,您可以手动删除较小视口上的列,或启用自动匹配功能,自动生成列和行,以适应较小的屏幕尺寸。
要确保网格在所有设备上都能响应,请在较小的断点上查看网格,并根据需要删除列。
如果不能在较小的断点上删除列,请尝试:
自动调整是CSS网格最强大的功能之一,它允许你自动重复和换行列,这样你就可以构建一个跨每一个屏幕尺寸的布局-不需要每个断点调整。
若要启用自动匹配,请删除除一列和一行以外的所有列和行。设置列的最小和最大尺寸并启用自动匹配。
更多的列将自动生成并重复以响应方式分发内容。
观看视频教程使用自动匹配将集合列表转换为响应网格.
一旦你完成了网格的创建,学习如何使用网格区域创建可重用布局模板.
提交表单时出错了。请联系support@www.raktarban.com