前端主流布局自适应布局之初识flex

自适应布局之初识flex 说起自适应、恐怕对于flex那是无人不知无人不晓了吧(如果你真的没听过....emmm 大哥我错了),下面将结合一些例子来简单描述下flex 初识flex 案例一

三行代码简单实现下子元素垂直、水平居中

.father { // 三行水平垂直居中   display: flex;   align-items: center;   justify-content: center;

  width: 300px;   height: 300px;   background-color: pink; // pink老师,yyds!!! } ​ <div class="father"> <span class=“son”>我是子元素</span> </div> 复制代码 案例二

上下 固定高度,中间自适应

  • {   margin: 0;   padding: 0; } body {   display: flex;   flex-direction: column;   width: 100vw;   min-height: 100vh;   background-color: pink; } // 三种写法在当前的情况下一样的效果,其实发生作用的是 flex-grow 属性 main {   /* flex: 1; /   / flex: auto; */   flex-grow: 1; } footer, header {   background-color: skyblue;   height: 50px; } ​ <body>    <header>header</header>    <main>main</main>    <footer>footer</footer> </body> 复制代码

案例三

左边侧边栏(包含滚动条),右边上下 固定高度,中间自适应

  • { margin: 0; padding: 0; } body { display: flex; flex-direction: column; width: 100vw; min-height: 100vh; background-color: pink; } // 三种写法在当前的情况下一样的效果,其实发生作用的是 flex-grow 属性 main { /* flex: 1; / / flex: auto; */ flex-grow: 1; } footer, header { background-color: skyblue; height: 50px; }

    ----------------新增样式----------------------- aside { width: 100px; height: 100vh; background-color: greenyellow; flex: none; overflow-y: auto; } li { height: 200px; } .main-container { flex: 1; display: flex; flex-direction: column; }

    <body> <aside> <ul> <li>item</li> <li>item</li> <li>item</li> <li>item</li> <li>item</li> <li>item</li> <li>item</li> <li>item</li> </ul> </aside> <div class="main-container"> <header>header</header> <main>main</main> <footer>footer</footer> </div> </body> 复制代码

定义 先说说flex定义、简单来说flex包含两部分,一部分是容器(父容器) 、另一部分是项目(子项) ,就像下面的结构一样,那明白了么?就是一个容器包含了几个子项目,这两部分可以通过flex的一些属性进行控制项目(子项)的位置、对齐方式、响应式的变化方式 <div class="father" style="display: flex"> <span class=“son”>我是子元素</span>   ......    <span class=“son”>我是子元素</span> </div> 复制代码 有了如上的简单展示,那么开始学习一下flex的具体属性值,其实并不复杂,只要多用即可掌握,记住容器(父元素)6个属性、项目(子项)6个属性值,都是6个,66大顺,很好记对吧。 容器(父元素)

flex-direction (主轴方向) flex-wrap (子元素超出是否换行) flex-flow (上面两个属性的综合体,可以只写这个,代替上面两个,就像字体的font属性一样) justify-content (定义子项在主轴上的对齐方式) align-items (定义子项在交叉轴上的对齐方式) align-content (定义多根轴线时的轴线对齐方式,只有一根轴线时,设置无效)

以上6个属性,一般常用的我加粗了,其他的少用 项目(子元素)

order (定义子元素的排序,数值越小越靠前) flex-grow (定义子元素在容器还有剩余空间时的放大比例,默认为0,即不放大) flex-shrink(与grow相反,定义子元素在容器没有剩余空间时的缩小比例,默认为1,即所有子元素缩小一样) flex-basis (设置子项伸缩基准值) flex (flex-grow、flex-shrink、flex-basis的缩写) align-self (允许当前项设置 align-items 并覆盖父元素的设置 )

前端CSS布局系统进阶与实战 CSS Grid 网格布局教程

网格布局(Grid)是最强大的 CSS 布局方案。

它将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局。以前,只能通过复杂的 CSS 框架达到的效果,现在浏览器内置了。

Grid 布局与 Flex 布局有一定的相似性,都可以指定容器内部多个项目的位置。但是,它们也存在重大区别。

Flex 布局是轴线布局,只能指定"项目"针对轴线的位置,可以看作是一维布局。Grid 布局则是将容器划分成"行"和"列",产生单元格,然后指定"项目所在"的单元格,可以看作是二维布局。Grid 布局远比 Flex 布局强大。

设置display:grid/inline-grid的元素就是网格布局容器,这样就能出发浏览器渲染引擎的网格布局算法

<div class="container"> <div class="item item-1"> <p class="sub-item"></p > </div> <div class="item item-2"></div> <div class="item item-3"></div> </div> 上述代码实例中,.container元素就是网格布局容器,.item元素就是网格的项目,由于网格元素只能是容器的顶层子元素,所以p元素并不是网格元素

这里提一下,网格线概念,有助于下面对grid-column系列属性的理解

网格线,即划分网格的线,如下图所示:

二、属性 同样,Grid 布局属性可以分为两大类:

容器属性, 项目属性 关于容器属性有如下:

#display 属性 文章开头讲到,在元素上设置display:grid 或 display:inline-grid 来创建一个网格容器

display:grid 则该容器是一个块级元素

display: inline-grid 则容器元素为行内元素

#grid-template-columns 属性,grid-template-rows 属性 grid-template-columns 属性设置列宽,grid-template-rows 属性设置行高

.wrapper { display: grid; /* 声明了三列,宽度分别为 200px 200px 200px / grid-template-columns: 200px 200px 200px; grid-gap: 5px; / 声明了两行,行高分别为 50px 50px */ grid-template-rows: 50px 50px; } 以上表示固定列宽为 200px 200px 200px,行高为 50px 50px

上述代码可以看到重复写单元格宽高,通过使用repeat()函数,可以简写重复的值

第一个参数是重复的次数 第二个参数是重复的值 所以上述代码可以简写成

.wrapper { display: grid; grid-template-columns: repeat(3,200px); grid-gap: 5px; grid-template-rows:repeat(2,50px); } 除了上述的repeact关键字,还有:

auto-fill:示自动填充,让一行(或者一列)中尽可能的容纳更多的单元格 grid-template-columns: repeat(auto-fill, 200px) 表示列宽是 200 px,但列的数量是不固定的,只要浏览器能够容纳得下,就可以放置元素

fr:片段,为了方便表示比例关系 grid-template-columns: 200px 1fr 2fr 表示第一个列宽设置为 200px,后面剩余的宽度分为两部分,宽度分别为剩余宽度的 1/3 和 2/3

minmax:产生一个长度范围,表示长度就在这个范围之中都可以应用到网格项目中。第一个参数就是最小值,第二个参数就是最大值 minmax(100px, 1fr)表示列宽不小于100px,不大于1fr

auto:由浏览器自己决定长度 grid-template-columns: 100px auto 100px 表示第一第三列为 100px,中间由浏览器决定长度

#grid-row-gap 属性, grid-column-gap 属性, grid-gap 属性 grid-row-gap 属性、grid-column-gap 属性分别设置行间距和列间距。grid-gap 属性是两者的简写形式

grid-row-gap: 10px 表示行间距是 10px

grid-column-gap: 20px 表示列间距是 20px

grid-gap: 10px 20px 等同上述两个属性

#grid-template-areas 属性 用于定义区域,一个区域由一个或者多个单元格组成

.container { display: grid; grid-template-columns: 100px 100px 100px; grid-template-rows: 100px 100px 100px; grid-template-areas: 'a b c' 'd e f' 'g h i'; } 上面代码先划分出9个单元格,然后将其定名为a到i的九个区域,分别对应这九个单元格。

多个单元格合并成一个区域的写法如下

grid-template-areas: 'a a a' 'b b b' 'c c c'; 上面代码将9个单元格分成a、b、c三个区域

如果某些区域不需要利用,则使用"点"(.)表示

#grid-auto-flow 属性 划分网格以后,容器的子元素会按照顺序,自动放置在每一个网格。

顺序就是由grid-auto-flow决定,默认为行,代表"先行后列",即先填满第一行,再开始放入第二行

当修改成column后,放置变为如下:

#justify-items 属性, align-items 属性, place-items 属性 justify-items 属性设置单元格内容的水平位置(左中右),align-items 属性设置单元格的垂直位置(上中下)

两者属性的值完成相同

.container { justify-items: start | end | center | stretch; align-items: start | end | center | stretch; } 属性对应如下:

start:对齐单元格的起始边缘 end:对齐单元格的结束边缘 center:单元格内部居中 stretch:拉伸,占满单元格的整个宽度(默认值) place-items属性是align-items属性和justify-items属性的合并简写形式

#justify-content 属性, align-content 属性, place-content 属性 justify-content属性是整个内容区域在容器里面的水平位置(左中右),align-content属性是整个内容区域的垂直位置(上中下)

.container { justify-content: start | end | center | stretch | space-around | space-between | space-evenly; align-content: start | end | center | stretch | space-around | space-between | space-evenly;
} 两个属性的写法完全相同,都可以取下面这些值:

start - 对齐容器的起始边框 end - 对齐容器的结束边框 center - 容器内部居中

space-around - 每个项目两侧的间隔相等。所以,项目之间的间隔比项目与容器边框的间隔大一倍

space-between - 项目与项目的间隔相等,项目与容器边框之间没有间隔

space-evenly - 项目与项目的间隔相等,项目与容器边框之间也是同样长度的间隔

stretch - 项目大小没有指定时,拉伸占据整个网格容器

#grid-auto-columns 属性和 grid-auto-rows 属性 有时候,一些项目的指定位置,在现有网格的外部,就会产生显示网格和隐式网格

比如网格只有3列,但是某一个项目指定在第5行。这时,浏览器会自动生成多余的网格,以便放置项目。超出的部分就是隐式网格

而grid-auto-rows与grid-auto-columns就是专门用于指定隐式网格的宽高

关于项目属性,有如下:

#grid-column-start 属性、grid-column-end 属性、grid-row-start 属性以及grid-row-end 属性 指定网格项目所在的四个边框,分别定位在哪根网格线,从而指定项目的位置

grid-column-start 属性:左边框所在的垂直网格线 grid-column-end 属性:右边框所在的垂直网格线 grid-row-start 属性:上边框所在的水平网格线 grid-row-end 属性:下边框所在的水平网格线 举个例子:

<style> #container{ display: grid; grid-template-columns: 100px 100px 100px; grid-template-rows: 100px 100px 100px; } .item-1 { grid-column-start: 2; grid-column-end: 4; } </style>

<div id="container"> <div class="item item-1">1</div> <div class="item item-2">2</div> <div class="item item-3">3</div> </div> 通过设置grid-column属性,指定1号项目的左边框是第二根垂直网格线,右边框是第四根垂直网格线

#grid-area 属性 grid-area 属性指定项目放在哪一个区域

.item-1 { grid-area: e; } 意思为将1号项目位于e区域

与上述讲到的grid-template-areas搭配使用

#justify-self 属性、align-self 属性以及 place-self 属性 justify-self属性设置单元格内容的水平位置(左中右),跟justify-items属性的用法完全一致,但只作用于单个项目。

align-self属性设置单元格内容的垂直位置(上中下),跟align-items属性的用法完全一致,也是只作用于单个项目

.item { justify-self: start | end | center | stretch; align-self: start | end | center | stretch; } 这两个属性都可以取下面四个值。

start:对齐单元格的起始边缘。 end:对齐单元格的结束边缘。 center:单元格内部居中。 stretch:拉伸,占满单元格的整个宽度