完整的Visual Flexbox和网格备忘单+教程





朋友们,美好的一天!



这是有关Flexbox和Grid CSS模块所有属性的完整视觉备忘单指南。



主要来源:一个完整的指南Flexbox的一个完整的指南网格



在本文的结尾,您将找到一个有关创建Flexbox模拟器的小教程。



没有更多的序言。



目录






Flexbox(Flex,以下简称Flex)



术语



Flex不是一个单独的属性,而是一个包含一组属性的整个模块。这些属性中的一些被添加到容器(父元素,称为flex容器),其他属性被添加到子元素(称为flex项目,下文中) -元素))。



“常规”布局基于块和内联元素的流程,而flex布局基于flex-flow方向。从规范中查看这张图片,以展示Flex布局背后的关键思想。







元素沿主轴(从主轴起点到主轴)或沿十字轴(从十字起点到十字轴)放置。



  • — , , . ; «flex-direction» (, . )
  • main-start | main-end — main-start main-end
  • (main size) — (main dimension),
  • — , .
  • cross-start | cross-end — , cross-end cross-start
  • (cross size) —






-



display


此属性定义一个flex容器;块或行取决于分配的值。它包括容器的所有直接子代的“弹性上下文”。



.container {
  display: flex; /*  inline-flex */
}


请注意,容器中的CSS列属性不起作用。



弹性方向






此属性定义主轴,即在容器中放置物品的方向。Flex本身(没有包装程序扩展其功能)实现了单向布局的概念。因此,将元素放置在水平线或垂直列中。



.container {
  flex-direction: row | row-reverse | column | column-reverse;
}


  • 行(默认):项目在ltr中从左到右或在rtl中从右到左排列
  • row-reverse:项目的反向行顺序-在ltr中从右到左或在rtl中从左到右
  • 列:类似于行,但从上到下
  • 列反转:类似于行反转,但从下到上


flex-wrap(包装,过渡,拆分)






默认情况下,所有项目都放在一行上。使用此属性,您可以根据需要将项目移动到下一行。



.container {
  flex-wrap: nowrap | wrap | wrap-reverse;
}


  • nowrap(默认):所有项目都在一行上
  • 环绕:元素可以从上到下跨越多行
  • 自动换行:元素可以从下到上跨越多行


弹性流(流)


此属性是flex-direction和flex-wrap的简写,它们定义了容器的主轴和横轴。默认值为rownowrap。



.container {
  flex-flow: column wrap;
}


证明内容(将内容对齐在一行上)






此属性确定元素沿主轴的对齐方式。它允许您分配具有固定大小的未使用元素或已达到其最大大小的flex元素剩余的可用空间。它还允许您控制溢出项目的对齐方式。



.container {
  justify-content: flex-start | flex-end | center | space-between | space-around | space-evenly | start | end | left | right ... + safe | unsafe;
}


  • flex-start(默认):项目沿主轴移动到容器的开头
  • flex-end:项目被推到容器的末端
  • start:将元素移动到容器的开头,由“ writing-mode”属性的值确定
  • end:将元素移至容器的末尾,由“ writing-mode”属性的值确定
  • 左:项目被推到容器的左边缘;没有弹性方向,行为类似于开始
  • 右:物品被挤压到容器的右边缘;没有弹性方向,行为类似于开始
  • center:
  • space-between: , , — ,
  • space-around: . , ; , . , ,
  • space-evenly: ,


请注意,对所列属性的支持在不同的浏览器中有所不同。最安全的是flex-start,flex-end和center。



至于其他关键字“ safe”和“ unsafe”,使用safe可以避免在页面外部渲染元素,而无需考虑位置,从而消除了滚动的可能性。



对齐项目(对齐项目)






此属性确定如何沿横轴放置元素。可以将其与横向轴(垂直于主轴)的对齐内容进行比较。



.container {
  align-items: stretch | flex-start | flex-end | center | baseline | first baseline | last baseline | start | end | self-start | self-end + ... safe | unsafe;
}


  • 拉伸(默认):元素拉伸以填充整个容器(取决于它们的最小宽度/最大宽度)
  • flex-start / start / self-start:项目相对于横轴的起点偏移。指定属性之间的差异不明显,并且取决于伸缩方向或写入模式
  • flex-end / end / self-end:项目相对于横轴的末端偏移。上述属性之间的差异并不明显,并且取决于弹性方向或写入模式
  • 中心:元素居中
  • 基线:元素沿基线对齐


“安全”和“不安全”修饰符关键字可以用作其他设置,以避免导致内容无法访问(页面外部,无法访问)的元素对齐。



align-content(跨多行对齐内容)






当沿横轴有自由空间时,此属性确定容器线的对齐方式。它与证明内容相似,后者沿主轴在各个元素之间分配空间。



请注意,当flex-wrap属性设置为wrap或wrap-reverse时,该属性仅适用于跨越多行的容器内容。对于单线(当“ flex-wrap”属性具有默认的“ no-wrap”值时),应用align-content将无效。



.container {
  align-content: flex-start | flex-end | center | space-between | space-around | space-evenly | stretch | start | end | baseline | first baseline | last baseline + ... safe | unsafe;
}


  • 正常(默认):线条在正常位置
  • flex-start / start:将行移动到容器的开头。flex-start取决于flex-direction,start取决于write-mode
  • flex-end / end:将行推到容器的末端。flex-end取决于flex-direction,而end取决于write-mode
  • 中心:线居中
  • 间隔:行的位置应使第一行在容器的开头,最后一行在末尾,其余行均匀间隔
  • 环绕:行之间的间隔相等
  • 间隔均匀:每条线之间的间距相等
  • 拉伸:线条拉伸以填充所有可用空间


“安全”和“不安全”修饰符关键字可以用作其他设置,以避免导致内容无法访问(页面外部,无法访问)的元素对齐。







弹性元素属性



订单(order)






默认情况下,元素按照在标记中出现的顺序排列在容器中。此属性使您可以控制它。



.item {
  order: 5; /*    0 */
}


弹性增长(增长,扩展)






此属性确定元素在需要时扩展的能力。它采用一个整数比例。比例确定一个项目可以占用容器中多少可用空间。



如果所有项目的弹性增长均为1,则可用空间在它们之间平均分配。如果其中一个项目的flex-grow为2,则该项目所占空间将是其余项目的两倍(或至少尝试这样做)。



.item {
  flex-grow: 4; /*   0 */
}


负值无效。



弯曲收缩(收缩,收缩)


此属性确定元素在需要时进行压缩的能力。



.item {
  flex-shrink: 3; /*   1 */
}


负值无效。



弹性基础


此属性确定元素的默认大小,然后分配剩余空间。该大小可以是长度(例如20%,5rem等)或关键字。auto关键字表示使用元素的“ width”或“ height”属性的值(以前,使用main-size代替auto)。“内容”关键字表示考虑元素的内容。提到的关键字尚未得到很好的支持,因此很难说出最小含量,最大含量和适合含量之间的区别。



.item {
  flex-basis:  | auto; /*   auto */
}


如果此属性的值为0,则不考虑元素周围的空间。如果值为“ auto”,则根据“ flex-grow”属性的值分配可用空间。



柔性


此属性是flex-grow,flex-shrink和flex-basis的简写。第二个和第三个参数(flex-shrink和flex-basis)是可选的。默认值为0 1自动,并且可以省略自动。



.item {
  flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}


建议您使用此简写代替定义每个属性,以便以正确的顺序自动确定属性值。



自我对齐(单元素对齐)






此属性使您可以覆盖单个元素的默认对齐方式或“自我对齐”方式。



有关可用值,请参见align-items说明。



.item {
  align-self: auto | flex-start | flex-end | center | baseline | stretch;
}


请注意,浮动,清除和垂直对齐对flex元素没有影响。



示例



让我们从一个非常简单的示例开始-解决将元素与中心对齐的问题。



.parent {
  display: flex;
  height: 300px; /*     */
}

.child {
  width: 100px;  /*     */
  height: 100px; /*     */
  margin: auto;  /* ! */
}


由于将“ margin”属性设置为“ auto”会消耗flex容器的所有可用空间,因此该方法有效。因此,将垂直填充值设置为auto可以使元素在两个轴上完美居中。



现在,让我们尝试使用更多属性。我们有6个固定大小的元素,可以根据屏幕宽度调整大小,而无需涉及媒体查询。我们希望主轴的可用空间在各个元素之间平均分配。



.flex-container {
  /*     - */
  display: flex;

  /*     ,
           
   *       :
   * flex-direction: row;
   * flex-wrap: wrap;
   */
  flex-flow: row wrap;

  /* ,  ,      */
  justify-content: space-around;
}


做完了 它仍然需要样式:







让我们尝试其他事情。假设我们的网站标题中有一个右对齐的导航菜单,我们希望它位于中型屏幕的中心,并在小屏幕上排成一列。十分简单。



/*   */
.navigation {
  display: flex;
  flex-flow: row wrap;
  /*          */
  justify-content: flex-end;
}

/*   */
@media (max-width: 800px) {
  .navigation {
    /*                 */
    justify-content: space-around;
  }
}

/*   */
@media (max-width: 500px) {
  .navigation {
    /*           ()   () */
    flex-direction: column;
  }
}




让我们尝试一下元素的灵活性。如何创建不依赖于标记中元素顺序的,具有全尺寸的页眉和页脚的移动优先三栏布局。



.wrapper {
  display: flex;
  flex-flow: row wrap;
}

/*   flex-basis       100% */
.wrapper > * {
  flex: 1 100%;
}

/*      
 * 1. header
 * 2. article
 * 3. aside 1
 * 4. aside 2
 * 5. footer
 */

/*   */
@media all and (min-width: 600px) {
  /*        */
  .aside { flex: 1 auto; }
}

/*   */
@media all and (min-width: 800px) {
  /*      main 
   *   main   2   ,  
   */
  .main { flex: 2 0px; }
  .aside-1 { order: 1; }
  .main    { order: 2; }
  .aside-2 { order: 3; }
  .footer  { order: 4; }
}




有用的资源





支持






网格(以下称为网格或网格)



CSS Grid Layout是迄今为止功能最强大的页面布局工具。它是一个双向系统。这意味着它既可以使用字符串也可以使用列,而Flex只能使用字符串。网格包括父元素(网格容器,以下称为容器)的属性和子元素(网格元素,以下称为元素)的属性。



术语



网格容器(以下简称容器)


分配了值为“ grid”的“ display”属性的元素将成为网格容器。此容器是所有网格项目的直接祖先。在下面的示例中,类为“ container”的div是一个网格容器。



<div class="container">
  <div class="item item-1"> </div>
  <div class="item item-2"> </div>
  <div class="item item-3"> </div>
</div>


网格线(以下简称线)


形成网格结构的分隔线。它可以是垂直或水平的,表示行或列的边界。下图中的黄线是垂直网格线(列网格线)的示例。







网格轨迹(以下简称轨迹)


两条相邻线之间的间隔。您可以将轨迹视为网格的行或列。这是第二行和第三行之间的轨道示例。







网格面积(以下简称面积)


四行之间的总空间。一个区域可以跨越任意数量的网格单元。这是水平线1和3与垂直线1和3之间的区域示例。







网格元素(以下简称元素)


容器的子代(直接后代)。在以下示例中,类别为“ item”的项目是网格项目,而类别为“ sub-item”的项目则不是网格项目。



<div class="container">
  <div class="item"> </div>
  <div class="item">
    <p class="sub-item"> </p>
  </div>
  <div class="item"> </div>
</div>


网格单元(以下简称单元)


两个相邻的水平和垂直线之间的间隔。它是网格的基本单位。这是水平线1和2与垂直线2和3之间的单元格示例。









宽度可变的列可根据屏幕宽度自动调整大小,而无需媒体查询。



.grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
  /*      min() */
  /* grid-template-columns: repeat(auto-fill, minmax(min(200px, 100%), 1fr)); */
  grid-gap: 1rem;
  /*    ,    */
  /* gap: 1rem */
}




网格容器属性



显示


此属性使元素成为网格容器,并为其内容设置网格上下文。



.container {
  display: grid | inline-grid;
}


  • 网格-块网格
  • 内联网格-内联网格


请注意,创建嵌套网格的功能已移至CSS网格2级规范



网格模板列,网格模板行


这些属性定义以空格分隔的Grid值的列和行。值代表轨迹的大小,空格代表线条。



.container {
  grid-template-columns:  ... |   ...;
  grid-template-rows:  ... |   ...;
}


  • <track-size>-网格的可用空间的长度,百分比或分数(使用“ fr”单位)
  • <line-name>-任意名称


当您在跟踪值之间留有空白时,将自动为行分配正数和负数:



.container {
  grid-template-columns: 40px 50px auto 50px 40px;
  grid-template-rows: 25% 100px auto;
}






您可以显式指定行名。注意方括号:



.container {
  grid-template-columns: [first] 40px [line2] 50px [line3] auto [col4-start] 50px [five] 40px [end];
  grid-template-rows: [row1-start] 25% [row1-end] 100px [third-line] auto [last-line];
}






行可以有多个名称。例如,这里的第二行有两个名称:



.container {
  grid-template-rows: [row1-start] 25% [row1-end row2-start] 25% [row2-end];
}


如果定义包含重复的片段,则可以使用“ repeat”语句来缩短:



.container {
  grid-template-columns: repeat(3, 20px [col-start]);
}


等效于以下内容:



.container {
  grid-template-columns: 20px [col-start] 20px [col-start] 20px [col-start];
}


如果几行具有相同的名称,则可以使用行名称和此类行的数量。



.item {
  grid-column-start: col-start 2;
}


“ fr”单位允许您将轨道大小设置为容器可用空间的一部分。在下面的示例中,每个元素都是容器宽度的三分之一:



.container {
  grid-template-columns: 1fr 1fr 1fr;
}


减去固定大小的元素后计算出可用空间。在以下示例中,可使用“ fr”单位进行分配的空间不包括50px:



.container {
  grid-template-columns: 1fr 50px 1fr 1fr;
}


网格模板区域


此属性使用“网格区域”属性中定义的区域名称定义Grid模板。重复区域名称会使内容以指定数量的单元格扩展。点表示空单元格。此语法使您可以可视化网格的结构。



.container {
  grid-template-areas:
    " | . | none | ..."
    "...";
}


  • <grid-area-name>-区域名称
  • ... -空单元格
  • 无-无区域


例:



.item-a {
  grid-area: header;
}
.item-b {
  grid-area: main;
}
.item-c {
  grid-area: sidebar;
}
.item-d {
  grid-area: footer;
}

.container {
  display: grid;
  grid-template-columns: 50px 50px 50px 50px;
  grid-template-rows: auto;
  grid-template-areas:
    "header header header header"
    "main main . sidebar"
    "footer footer footer footer";
}


这段代码创建了一个四列宽三行高的网格。第一(顶部)行完全被标题占据。中间行由两个“主”区域,一个空单元格和一个“侧栏”区域组成。最后一行是地下室。







定义中的每一行必须具有相同的列数。



可以使用任意数量的点表示空白单元格。只要点之间没有空格,它们就表示一个空单元格。



请注意,此语法用于表示区域,而不是线。使用此语法,将自动命名区域两侧的线。如果区域名称为“ foo”,则该区域的第一(第一)行(行和列)将为“ foo-start”,而最后一行为“ foo-end”。这意味着某些行可以具有多个名称,如上例所示,其中左上方的行具有三个名称:header-start,main-start和footer-start。



网格模板


此属性是grid-template-rows,grid-template-columns和grid-template-area的简写。



.container {
  grid-template: none | <grid-template-rows> / <grid-template-columns>;
}


  • none-将所有三个属性的值重置为默认值
  • <grid-template-rows> / <grid-template-columns>-将“ grid-template-rows”和“ grid-template-columns”属性设置为相应的值,并将“ grid-template-areas”属性设置为“ none”


您可以使用更复杂但更方便的语法来定义所有三个属性的值:



.container {
  grid-template:
    [row1-start] "header header header" 25px [row1-end]
    [row2-start] "footer footer footer" 25px [row2-end]
    / auto 50px auto;
}


这等效于以下内容:



.container {
  grid-template-rows: [row1-start] 25px [row1-end row2-start] 25px [row2-end];
  grid-template-columns: auto 50px auto;
  grid-template-areas:
    "header header header"
    "footer footer footer";
}


由于grid-template不会重置大多数情况下所需的隐式Gri​​d属性(例如grid-auto-columns,grid-auto-rows和grid-auto-flow),因此建议改用“ grid”属性。



列间距,行间距,网格列间距,网格行间距


这些属性确定线的大小。换句话说,它们确定列/行之间的缩进量。



.container {
  /*  */
  column-gap: <line-size>;
  row-gap: <line-size>;

  /*  */
  grid-column-gap: <line-size>;
  grid-row-gap: <line-size>;
}


  • <line-size>-缩进量


例:



.container {
  grid-template-columns: 100px 50px 100px;
  grid-template-rows: 80px auto 80px;
  column-gap: 10px;
  row-gap: 15px;
}






仅在列/行之间创建填充,而不是沿着网格的边缘创建填充。



注意,“ grid-column-gap”和“ grid-row-gap”属性现在已重命名为“ column-gap”和“ row-gap”。



间隙,栅隙


此属性是行间距和列间距的简写。



.container {
  /*  */
  gap: <grid-row-gap> <grid-column-gap>;

  /*  */
  grid-gap: <grid-row-gap> <grid-column-gap>;
}


  • <grid-row-gap> <grid-column-gap>-填充大小


例:



.container {
  grid-template-columns: 100px 50px 100px;
  grid-template-rows: 80px auto 80px;
  gap: 15px 10px;
}


如果未设置“ row-gap”属性,则将其设置为“ column-gap”属性。



请注意,“ grid-gap”属性现已重命名为“ gap”。



证明项目


此属性确定单元格中各项沿着线(水平)轴的对齐方式(与“ align-items”属性相对,后者确定沿块(列,垂直)轴的对齐方式)。此属性的值适用于容器中的所有元素。



.container {
  justify-items: start | end | center | stretch;
}


  • start-元素移动到其单元格的开头(左侧边框)
  • end-元素移动到单元格的末尾(右边框)
  • 中心-项目居中
  • 拉伸-元素填充单元格的整个宽度


.container {
  justify-items: start;
}






.container {
  justify-items: end;
}






.container {
  justify-items: center;
}






.container {
  justify-items: stretch;
}






沿着单元格的行轴的单个项目的位置由“ justify-self”属性控制。



对齐项目


此属性确定沿框(列,垂直)轴的单元格中的项目的对齐方式(与“ justify-items”属性相反,该属性确定沿行(水平)轴的对齐方式)。此属性的值适用于容器中的所有元素。



.container {
  align-items: start | end | center | stretch;
}


  • start-元素移动到其单元格的开头(顶部边框)
  • end-元素移动到单元格的末尾(底部边框)
  • 中心-项目居中
  • 拉伸-元素填充单元格的整个高度


.container {
  align-items: start;
}






.container {
  align-items: end;
}






.container {
  align-items: center;
}






.container {
  align-items: stretch;
}






单个项目沿单元格列轴的位置由“ align-self”属性控制。



地方项目


此属性是align-items和justify-items的简写。



.container {
  place-items: <align-items> <justify-items>;
}


  • <align-items> <justify-items>是align-items的第一个值,第二个是justify-items的第二个值。如果没有第二个值,则将第一个值分配给两个属性。


例:



.container {
  place-items: center start;
}


项沿列轴居中,沿线轴原点。



证明内容(列对齐)


有时,Grid元素(其列)的总宽度小于容器的宽度。当定义固定大小的元素(例如,使用px)时,可能会发生这种情况。在这种情况下,我们可以定义容器中Grid列的顺序。此属性确定Grid沿行轴的对齐方式-列的对齐方式(与“ align-content”属性相对,后者确定Grid沿框(列)轴的对齐方式-行的对齐方式)。



.container {
  justify-content: start | end | center | stretch | space-around | space-between | space-evenly;
}


  • start-将Grid移到容器的开头(左边框)
  • end-将网格移动到容器的末端(右边框)
  • 中心-网格居中
  • stretch — ,
  • space-around — ,
  • space-between — , — ,
  • space-evenly — ,


.container {
  justify-content: start;
}






.container {
  justify-content: end;
}






.container {
  justify-content: center;
}






.container {
  justify-content: stretch;
}






.container {
  justify-content: space-around;
}






.container {
  justify-content: space-between;
}






.container {
  justify-content: space-evenly;
}






align-content ( )


有时,Grid元素(其行)的总高度小于容器的高度。当定义固定大小的元素(例如,使用px)时,可能会发生这种情况。在这种情况下,我们可以确定容器中Grid行的顺序。此属性定义网格沿框(列)轴的对齐方式-行的对齐方式(与“ justify-content”属性相反,后者确定网格沿内联轴的对齐方式-列的对齐方式)。



.container {
  align-content: start | end | center | stretch | space-around | space-between | space-evenly;
}


  • start-将Grid移到容器的开头(顶部边框)
  • end-将Grid移到容器的末尾(底部边框)
  • 中心-网格居中
  • 拉伸-拉伸线,使网格占据容器的整个高度
  • 围绕空间-线之间的空间相等,容器边缘周围空间的一半
  • 中间的空间-第一行移至容器的开头,最后一行移至结尾,自由空间在其余各行之间平均分配
  • 均匀分布的空间-线之间和容器边缘的均等空间


.container {
  align-content: start;
}






.container {
  align-content: end;
}






.container {
  align-content: center;
}






.container {
  align-content: stretch;
}






.container {
  align-content: space-around;
}






.container {
  align-content: space-between;
}






.container {
  align-content: space-evenly;
}






地方内容


此属性是align-content和justify-content的简写。



.container {
  place-content: <align-content> <justify-content>;
}


  • <align-content> <justify-content>是align-content的第一个值,第二个是justify-content的值。如果没有第二个值,则将第一个值分配给两个属性。


例:



.container {
  place-content: center start;
}


行在容器中居中,列在开头。



网格自动列,网格自动行(隐式轨道的大小)


这些属性确定自动生成的轨道(隐式轨道)的大小。当项目多于网格中的单元格时,或者当项目位于网格外部时,会创建隐式轨道。



.container {
  grid-auto-columns: <track-size> ...;
  grid-auto-rows: <track-size> ...;
}


  • <track-size>-网格的可用空间的长度,百分比或分数(使用“ fr”单位)


例:



.container {
  grid-template-columns: 60px 60px;
  grid-template-rows: 90px 90px;
}






这将创建一个2x2网格。



假设我们使用“ grid-column”和“ grid-row”属性来定位项目,如下所示:



.item-a {
  grid-column: 1 / 2;
  grid-row: 2 / 3;
}
.item-b {
  grid-column: 5 / 6;
  grid-row: 2 / 3;
}






类“ item-b”的元素以垂直线5开始,以垂直线6结尾,但是我们尚未定义这些线。由于我们引用的是不存在的行,因此将创建隐式零宽度轨道以填充缩进。我们可以使用“ grid-auto-columns”属性来定义隐式轨道的宽度:



.container {
  grid-auto-columns: 60px;
}






网格自动流


自动放置算法可用于在网格外部放置项目。所考虑的属性决定了给定算法的工作方式。



.container {
  grid-auto-flow: row | column | row dense | column dense;
}


  • row(默认)-算法将当前行填充到限制,如果必要,当当前行的宽度不足时,将创建一个新行
  • column-算法将当前列填充到极限,如果必要,当当前列的高度不足时,将创建一个新列
  • 密集-在存在不同大小的元素时智能填充网格


请注意,密集会更改元素的视觉顺序,这会对可访问性产生负面影响。



假设我们具有以下标记:



  <section class="container">
  <div class="item-a">item-a</div>
  <div class="item-b">item-b</div>
  <div class="item-c">item-c</div>
  <div class="item-d">item-d</div>
  <div class="item-e">item-e</div>
</section>


我们定义一个具有五列两行的网格,并将“ grid-auto-flow”属性设置为“ row”(默认):



.container {
  display: grid;
  grid-template-columns: 60px 60px 60px 60px 60px;
  grid-template-rows: 30px 30px;
  grid-auto-flow: row;
}


在网格中放置项目时,我们仅放置两个项目:



.item-a {
  grid-column: 1;
  grid-row: 1 / 3;
}
.item-e {
  grid-column: 5;
  grid-row: 1 / 3;
}


由于“ grid-auto-flow”属性的值为“ row”,因此我们的Grid如下图所示。注意类“ item-b”,“ item-c”和“ item-d”的元素的排列(优先选择行):







如果将“ grid-auto-flow”属性的值更改为“ column”,则网格将如下所示方式(优先考虑列):









此属性是grid-template-rows,grid-template-columns,grid-template-areas,grid-auto-rows,grid-auto-columns和grid-auto-flow的简写(请注意,一个声明可能包含仅“显式”或“隐式”属性)。



  • 无-所有属性均接受默认值
  • <grid-template>-类似于grid-template快捷方式
  • <grid-template-rows> / [自动流&&密集?] <grid-auto-columns>?-为grid-template-rows定义一个值。如果关键字“ auto-flow”在斜杠的右侧,则“ grid-auto-flow”属性的值将变为“ column”。如果除了自动流之外还指定了关键字“ dense”,则自动嵌套算法将相应地打包项目。如果省略“ grid-auto-columns”属性的值,则其值将变为“ auto”
  • [自动流&&密集?] <网格自动行>?/ <grid-template-columns>-定义grid-template-columns的值。如果关键字“ auto-flow”在斜杠的左侧,则“ grid-auto-flow”属性的值将变为“ row”。如果除了自动流之外还指定了关键字“ dense”,则自动嵌套算法将相应地打包项目。如果省略“ grid-auto-rows”属性的值,则其值将变为“ auto”


以下两个代码块是等效的:



.container {
  grid: 100px 300px / 3fr 1fr;
}


.container {
  grid-template-rows: 100px 300px;
  grid-template-columns: 3fr 1fr;
}


以下两个代码块是等效的:



.container {
  grid: auto-flow / 200px 1fr;
}


.container {
  grid-auto-flow: row;
  grid-template-columns: 200px 1fr;
}


以下两个代码块是等效的:



.container {
  grid: auto-flow dense 100px / 1fr 2fr;
}


.container {
  grid-auto-flow: row dense;
  grid-auto-rows: 100px;
  grid-template-columns: 1fr 2fr;
}


以下两个代码块也是等效的:



.container {
  grid: 100px 300px / auto-flow 200px;
}


.container {
  grid-template-rows: 100px 300px;
  grid-auto-flow: column;
  grid-auto-columns: 200px;
}


在这种情况下,我们可以使用更复杂但更方便的语法来同时定义“ grid-template-areas”,“ grid-template-rows”和“ grid-template-columns”属性并将其他属性设置为默认值... 为此,您需要定义线的名称以及在一行上具有相应区域的轨道的大小。通过示例更容易演示:



.container {
  grid: [row1-start] "header header header" 1fr [row1-end]
        [row2-start] "footer footer footer" 25px [row2-end]
        / auto 50px auto;
}


这等效于以下内容:



.container {
  grid-template-areas:
    "header header header"
    "footer footer footer";
  grid-template-rows: [row1-start] 1fr [row1-end row2-start] 25px [row2-end];
  grid-template-columns: auto 50px auto;
}


网格项目属性



注意,应用于网格元素的属性float,display:inline-block,display:table-cell,vertical-align和column- *无效。



网格列开始,网格列结束,网格行开始,网格行结束


这些属性通过对齐到特定行来确定元素在网格中的位置。grid-column-start / grid-row-start是该项目的开始行,而grid-column-end / grid-row-end是该项目的结束行。



.item {
  grid-column-start: <number> | <name> | span <number> | span <name> | auto;
  grid-column-end: <number> | <name> | span <number> | span <name> | auto;
  grid-row-start: <number> | <name> | span <number> | span <name> | auto;
  grid-row-end: <number> | <name> | span <number> | span <name> | auto;
}


  • <line>-可以是数字(捕捉到行号)或名称(捕捉到行名)
  • span <number>-元素将拉伸指定的轨道数
  • span <name>-元素将拉伸直到到达具有指定名称的行
  • 自动-自动布局,自动扩展或默认一列拉伸


.item-a {
  grid-column-start: 2;
  grid-column-end: five;
  grid-row-start: row1-start;
  grid-row-end: 3;
}






.item-b {
  grid-column-start: 1;
  grid-column-end: span col4-start;
  grid-row-start: 2;
  grid-row-end: span 2;
}






如果未指定grid-column-end / grid-row-end属性值,则默认情况下该项目将占据1条轨道。



元素可以相互重叠。您可以使用z-index属性来控制元素的堆叠顺序。



网格列,网格行


这些属性分别是grid-column-start + grid-column-end和grid-row-start + grid-row-end的简写。



.item {
  grid-column: <start-line> / <end-line> | <start-line> / span <value>;
  grid-row: <start-line> / <end-line> | <start-line> / span <value>;
}


  • <start-line> / <end-line>-值与原始属性相同,包括跨度


例:



.item-c {
  grid-column: 3 / span 2;
  grid-row: third-line / 4;
}






如果未指定结束线,则该元素将默认为1条轨道。



网格区域


此属性定义元素的名称,该名称用作grid-template-areas属性中的值。grid-area也可以用作grid-row-start + grid-column-start + grid-row-end + grid-column-end的简写。



.item {
  grid-area: <name> | <row-start> / <column-start> / <row-end> / <column-end>;
}


  • <name>-元素的任意名称
  • <row-start> / <column-start> / <row-end> / <column-end>-可以是数字或行名


命名元素:



.item-d {
  grid-area: header;
}


grid-row-start + grid-column-start + grid-row-end + grid-column-end的简写:



.item-d {
  grid-area: 1 / col4-start / last-line / 6;
}






自我辩护


此属性指定单元格中元素沿行轴的对齐方式(与align-self属性相反,后者指定沿框(列)轴的对齐方式)。此属性适用于单个单元格内的元素。



.item {
  justify-self: start | end | center | stretch;
}


  • start-元素移动到单元格的开头(左边框)
  • end-元素移动到单元格的末尾(右边框)
  • center-元素居中
  • 拉伸-元素填充单元格的整个宽度


.item-a {
  justify-self: start;
}






.item-a {
  justify-self: end;
}






.item-a {
  justify-self: center;
}






.item-a {
  justify-self: stretch;
}






justify-items属性用于控制所有Grid项目沿线轴的对齐方式。



自我调整


此属性确定单元格中项目沿框(列)轴的对齐方式(与justify-self属性相反,后者确定沿行轴的对齐方式)。此属性适用于单个单元格内的元素。



.item {
  align-self: start | end | center | stretch;
}


  • start-元素移动到单元格的开头(顶部边框)
  • end-元素移动到单元格的末尾(底部边框)
  • center-元素居中
  • 拉伸-元素填充整个像元高度


.item-a {
  align-self: start;
}






.item-a {
  align-self: end;
}






.item-a {
  align-self: center;
}






.item-a {
  align-self: stretch;
}






align-items属性用于控制所有Grid项目沿块(列)轴的对齐方式。



地方自我


此属性是align-self和justify-self的简写。



  • 自动-默认值
  • <align-self> / <justify-self>是align-self的第一个值,第二个是justify-self的值。如果省略第二个值,则第一个值将应用于两个属性


.item-a {
  place-self: center;
}






.item-a {
  place-self: center stretch;
}








  • , px, rem, % .., , min-content, max-content, auto , , — (fr). grid-template-columns: 200px 1fr 2fr min-content
  • , . , , 1fr, 200px: grid-template-columns: 1fr minmax(200px, 1fr)
  • repeat() : grid-template-columns: repeat(10, 1fr) ( , 1fr)
  • 这些功能的组合使您可以实现令人难以置信的布局灵活性,例如:grid-template-columns:重复(自动填充,minmax(200px,1fr))(来自Grid部分开头的示例)


有用的资源





支持






讲解



在本教程中,我们将为基本的Flexbox属性创建一个简单的培训师。







标记


<main>
  <div id="controls">
    <div id="buttons">
      <button data-btn="addBtn">Add Item</button>
      <button data-btn="removeBtn">Remove Item</button>
    </div>
    <fieldset id="flexContainerProps">
      <legend>Flex Container Props</legend>
      <label for="flexDirection">flex-direction</label>
      <select id="flexDirection">
        <option value="row" selected>row</option>
        <option value="row-reverse">row-reverse</option>
        <option value="column">column</option>
        <option value="column-reverse">column-reverse</option>
      </select>

      <label for="flexWrap">flex-wrap</label>
      <select id="flexWrap">
        <option value="nowrap">nowrap</option>
        <option value="wrap" selected>wrap</option>
        <option value="wrap-reverse">wrap-reverse</option>
      </select>

      <label for="justifyContent">justify-content</label>
      <select id="justifyContent">
        <option value="flex-start">flex-start</option>
        <option value="flex-end">flex-end</option>
        <option value="center" selected>center</option>
        <option value="space-between">space-between</option>
        <option value="space-around">space-around</option>
        <option value="space-evenly">space-evenly</option>
      </select>

      <label for="alignItems">align-items</label>
      <select id="alignItems">
        <option value="flex-start">flex-start</option>
        <option value="flex-end">flex-end</option>
        <option value="center" selected>center</option>
        <option value="stretch">stretch</option>
        <option value="baseline">baseline</option>
      </select>

      <label for="alignContent">align-content</label>
      <select id="alignContent">
        <option value="flex-start" selected>flex-start</option>
        <option value="flex-end">flex-end</option>
        <option value="center">center</option>
        <option value="stretch">stretch</option>
        <option value="space-between">space-between</option>
        <option value="space-around">space-around</option>
        <option value="space-evenly">space-evenly</option>
      </select>
    </fieldset>

    <fieldset id="flexItemProps">
      <legend>Flex Item Props</legend>
      <label for="order">order</label>
      <input
        id="order"
        type="number"
        min="-5"
        max="5"
        step="1"
        value="0"
      />

      <label for="flexGrow">flex-grow</label>
      <input
        id="flexGrow"
        type="number"
        min="0"
        max="5"
        step="1"
        value="0"
      />

      <label for="flexShrink">flex-shrink</label>
      <input
        id="flexShrink"
        type="number"
        min="1"
        max="6"
        step="1"
        value="1"
      />

      <label for="alignSelf">align-self</label>
      <select id="alignSelf">
        <option value="auto" selected>auto</option>
        <option value="flex-start">flex-start</option>
        <option value="flex-end">flex-end</option>
        <option value="center">center</option>
        <option value="stretch">stretch</option>
        <option value="baseline">baseline</option>
      </select>
    </fieldset>
  </div>

  <div id="flexContainer">
    <div class="flex-item selected">1</div>
    <div class="flex-item">2</div>
    <div class="flex-item">3</div>
    <div class="flex-item">4</div>
    <div class="flex-item">5</div>
    <div class="flex-item">6</div>
  </div>
</main>


在这里,我们有一个带有六个flex-items的flexContainer和一个控件,用于控制flexContainerProps和选定的flexItemProps属性之间的切换。同样在第二个容器中,您有两个按钮:一个用于将元素添加到flex容器(addBtn),另一个用于删除最后一个flex元素(removeBtn)。



款式


main {
  display: flex;
  justify-content: center;
  align-items: center;
}

#controls {
  margin-right: 0.4rem;
}

#buttons {
  margin: 0.4rem;
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
}

button {
  margin: 0.2rem;
}

label {
  display: block;
  margin: 0.4rem;
}

select {
  width: 100%;
}

#flexContainer {
  width: 600px;
  height: 600px;
  border: 1px dashed #222;
  border-radius: 4px;
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: center;
}

.flex-item {
  min-width: 178px;
  min-height: 178px;
  background: radial-gradient(circle, yellow, orange);
  border: 1px solid #222;
  border-radius: 4px;
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4);
  color: #222;
  font-size: 2rem;
  display: flex;
  justify-content: center;
  align-items: center;
  user-select: none;
  cursor: pointer;
}

.flex-item:nth-child(2n) {
  min-width: 158px;
  min-height: 158px;
}

.flex-item:nth-child(3n) {
  min-width: 198px;
  min-height: 198px;
}

.flex-item.selected {
  background: radial-gradient(circle, lightgreen, darkgreen);
}


柔性元件应具有不同的尺寸,同时应具有柔性。我们使用min-width / min-height和nth-child实现此目的。所选项目属于“已选择”类别,具有不同的背景颜色。



脚本


//    
const controls = document.querySelector('#controls')
const buttons = document.querySelector('#buttons')
const flexContainer = document.querySelector('#flexContainer')

//   
buttons.addEventListener('click', (e) => {
  //     
  if (e.target.tagName !== 'BUTTON') return

  //   
  const { btn } = e.target.dataset

  switch (btn) {
    //        -
    case 'addBtn':
      //     6 
      //      -
      //    
      const num = document.querySelectorAll('.flex-item').length + 1
      // ,      7 
      //   
      if (num < 7) {
        //    "div"
        const newItem = document.createElement('div')
        //    
        newItem.className = 'flex-item'
        //  
        newItem.textContent = num
        //    -
        flexContainer.append(newItem)
      }
      break
    //      -
    case 'removeBtn':
      //    
      const index = document.querySelectorAll('.flex-item').length - 1
      // ,      0
      //      -
      if (index > 0) {
        //  ,  
        const itemToRemove = document.querySelectorAll('.flex-item')[index]
        //   
        itemToRemove.remove()
      }
      break
  }
})

//     
controls.addEventListener('change', (e) => {
  //    
  const prop = e.target.id
  //    
  const value = e.target.value

  // ,   
  //  -    -
  //      
  if (e.target.parentElement.id === 'flexContainerProps') {
    flexContainer.style[prop] = value
  } else {
    const selectedItem = document.querySelector('.selected')
    selectedItem.style[prop] = value
  }
})

//   -
flexContainer.addEventListener('click', (e) => {
  //        -
  if (
    e.target.className !== 'flex-item' ||
    e.target.classList.contains('selected')
  )
    return

  //     "selected"    
  if (document.querySelector('.selected') !== null)
    document.querySelector('.selected').classList.remove('selected')

  //      
  e.target.classList.add('selected')

  //   -      "-"
  //       
  //      -
  //    
  //   ,     

  //         
  //         -
  const getStyle = (property, element = e.target) =>
    getComputedStyle(element).getPropertyValue(property)

  //  ,      DOM-,   "id", 
  //  ,     
  order.value = getStyle('order')
  flexGrow.value = getStyle('flex-grow')
  flexShrink.value = getStyle('flex-shrink')
  alignSelf.value = getStyle('align-self')
})


如您所见,没有什么复杂的。当然,生成的模拟器的功能非常有限。但是,我相信这足以了解Flexbox的基本属性如何工作。



我建议尝试根据Grid的基本属性创建一个类似的模拟器-这将是一种很好的做法,并且可以使您正确地理解所有内容。







您可能还会发现我最近的一个有趣的项目,即Modern HTML Starter Template



谢谢您的关注,祝您有美好的一天。



All Articles