2022-08-10 css flex布局和grid布局

一、Flex布局

1.布局原理

采用 Flex 布局的元素,称为 Flex 容器(flex container),简称"容器"。它的所有子元素自动成为容器成员,称为Flex 项目(flex item),简称"项目"。
当我们为父盒子设为 flex 布局以后,子元素的float、clear和 vertical-align属性将失效。
伸缩布局 = 弹性布局 = 伸缩盒布局 = 弹性盒布局=flex布局
总结flex布局原理: 就是通过给父盒子添加flex属性,来控制子盒子的位置和排列方式

2. flex布局父项常见属性

flex-direction:设置主轴的方向
justify-content:设置主轴上的子元素排列方式
flex-wrap:设置子元素是否换行
align-content:设置侧轴上的子元素的排列方式(多行)
align-items:设置侧轴上的子元素排列方式(单行)
flex-flow:复合属性,相当于同时设置了 flex-direction 和 flex-wrap
3.align-content 和align-items区别
align-items 适用于单行情况下, 只有上对齐、下对齐、居中和 拉伸
align-content适应于换行(多行)的情况下(单行情况下无效), 可以设置上对齐、下对齐、居中、拉伸以及平均分配剩余空间等属性值。
总结就是单行找align-items 多行找 align-content

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #box1 {
            width: 300px;
            height: 300px;
            border: 1px solid red;
            margin: 100px auto;
            display: flex;
            /* 1.从右往左
            flex-direction: row-reverse;
               2.折行显示,默认不折行
            flex-wrap: wrap; 
               3.复合写法 ,中间空格隔开
            flex-flow: column wrap; 
               4.主轴子项排列   
                justify-content 属性(水平)对齐弹性容器的项目,当项目不占用主轴上所有可用空间时。*/
            justify-content: space-around;
            flex-wrap: wrap;
            /* 5.子项对齐方式 */
            align-items: flex-end;
        }

        #box1 div {
            width: 50px;
            /*5. height: 50px; */
            background-color: aqua;
            line-height: 50px;
            text-align: center;
        }
    </style>
</head>

<body>
    <div id="box1">
        <div>1</div>
        <div>2</div>
        <div>3</div>
        <div>1</div>
        <div>2</div>
        <div>3</div>
        <div>1</div>
        <div>2</div>
        <div>3</div>
    </div>
</body>

</html>
image.png
4.flex布局子项属性

order:改变某一个flex子项的位置,默认值是0
flex-grow:扩展flex子项所占据的宽度
flex-shrink:当flex容器空间不足的时候,单个元素的收缩比例,默认是1
flex-basis:定义了在分配剩余空间之前元素的默认大小
flex:是flex-grow,flex-shrink,flex-basis的缩写
align-self:控制单独某一个flex子项的垂直对齐方式

二、flex骰子练习

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #box1 {
            width: 100px;
            height: 100px;
            border: 1px black solid;
            border-radius: 5px;
            display: flex;
            justify-content: center;
        }

        #box1 div {
            width: 30%;
            height: 30%;
            border-radius: 50%;
            background-color: black;
            align-self: center;
        }

        #box2 {
            margin-top: 10px;
            width: 100px;
            height: 100px;
            border: 1px black solid;
            border-radius: 5px;
            display: flex;
            justify-content: space-between;
        }

        #box2 div {
            width: 30%;
            height: 30%;
            border-radius: 50%;
            background-color: black;
        }

        #box2 div:last-child {
            align-self: end;
        }

        #box3 {
            margin-top: 10px;
            width: 100px;
            height: 100px;
            border: 1px black solid;
            border-radius: 5px;
            display: flex;
            justify-content: space-between;
        }

        #box3 div {
            width: 30%;
            height: 30%;
            border-radius: 50%;
            background-color: black;
        }

        #box3 div:nth-child(2) {
            align-self: center;
        }

        #box3 div:nth-child(3) {
            align-self: flex-end;
        }

        #box4 {
            margin-top: 10px;
            width: 100px;
            height: 100px;
            border: 1px black solid;
            border-radius: 5px;
            display: flex;
            flex-wrap: wrap;
        }

        #box4 div {
            width: 100%;
            display: flex;
            justify-content: space-between;
        }

        #box4 div:last-child {
            align-items: flex-end;
        }

        #box4 i {
            display: block;
            width: 30%;
            height: 60%;
            background-color: black;
            border-radius: 50%;
        }

        #box5 {
            margin-top: 10px;
            width: 100px;
            height: 100px;
            border: 1px black solid;
            border-radius: 5px;
            display: flex;
            flex-wrap: wrap;
        }

        #box5 div {
            width: 100%;
            display: flex;
            justify-content: center;
        }

        #box5 div:first-child {
            align-items: start;
            justify-content: space-between;
        }

        #box5 div:last-child {
            align-items: flex-end;
            justify-content: space-between;
        }

        #box5 i {
            display: block;
            width: 30%;
            height: 90%;
            background-color: black;
            border-radius: 50%;
        }

        #box6 {
            margin-top: 10px;
            width: 100px;
            height: 100px;
            border: 1px black solid;
            border-radius: 5px;
            display: flex;
            flex-wrap: wrap;
        }

        #box6 div {
            width: 100%;
            display: flex;
            justify-content: space-between;
        }

        #box6 div:first-child {
            align-items: start;
            justify-content: space-between;
        }

        #box6 div:last-child {
            align-items: flex-end;
            justify-content: space-between;
        }

        #box6 i {
            display: block;
            width: 30%;
            height: 90%;
            background-color: black;
            border-radius: 50%;
        }
    </style>
</head>

<body>
    <div id="box1">
        <div></div>
    </div>
    <div id="box2">
        <div></div>
        <div></div>
    </div>
    <div id="box3">
        <div></div>
        <div></div>
        <div></div>
    </div>
    <div id="box4">
        <div>
            <i></i>
            <i></i>
        </div>
        <div>
            <i></i>
            <i></i>
        </div>
    </div>
    <div id="box5">
        <div>
            <i></i>
            <i></i>
        </div>
        <div>
            <i></i>
        </div>
        <div>
            <i></i>
            <i></i>
        </div>
    </div>
    <div id="box6">
        <div>
            <i></i>
            <i></i>
        </div>
        <div>
            <i></i>
            <i></i>
        </div>
        <div>
            <i></i>
            <i></i>
        </div>
    </div>
</body>

</html>
image.png

三、grid布局

(一)、概念

1.网格布局(Grid)是最强大的 CSS 布局方案。
2.它将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局。以前,只能通过复杂的 CSS 框架达到的效果,现在浏览器内置了。
3.Grid 布局与 Flex 布局 有一定的相似性,都可以指定容器内部多个项目的位置。但是,它们也存在重大区别。
4.Flex 布局是轴线布局,只能指定"项目"针对轴线的位置,可以看作是一维布局。Grid 布局则是将容器划分成"行"和"列",产生单元格,然后指定"项目所在"的单元格,可以看作是二维布局。Grid 布局远比 Flex 布局强大。

(二)、容器属性

1.grid-template-columns 属性、 grid-template-rows 属性
容器指定了网格布局以后,接着就要划分行和列。grid-template-columns属性定义每一列的列宽,grid-template-rows属性定义每一行的行高。
2.repeat()
有时候,重复写同样的值非常麻烦,尤其网格很多时。这时,可以使用repeat()函数,简化重复的值。上面的代码用repeat()改写如下。

 grid-template-rows: repeat(3, 1fr);
 grid-template-columns: repeat(3, 1fr);

3.grid-row-gap 属性,grid-column-gap 属性,grid-gap 属性
grid-row-gap属性设置行与行的间隔(行间距),grid-column-gap属性设置列与列的间隔(列间距)。

  1. grid-template-areas 属性
    网格布局允许指定"区域"(area),一个区域由单个或多个单元格组成。grid-template-areas属性用于定义区域。
  grid-template-areas:
                "a1 a1 a1"
                "a2 a2 a3"
                "a2 a2 a3";

5.justify-items 属性,align-items 属性,place-items 属性
justify-items属性设置单元格内容的水平位置(左中右),align-items属性设置单元格内容的垂直位置(上中下)。
6.justify-content 属性,align-content 属性,place-content 属性
justify-content属性是整个内容区域在容器里面的水平位置(左中右),align-content属性是整个内容区域的垂直位置(上中下)。

(三)、子项属性

1.grid-column-start 属性,grid-column-end 属性,grid-row-start 属性,grid-row-end 属性
项目的位置是可以指定的,具体方法就是指定项目的四个边框,分别定位在哪根网格线。
2.grid-column 属性,grid-row 属性
grid-column属性是grid-column-start和grid-column-end的合并简写形式,grid-row属性是grid-row-start属性和grid-row-end的合并简写形式。
3.grid-area 属性
grid-area属性指定项目放在哪一个区域。
4.justify-self
单个网格元素的水平对齐方式
5.align-self
单个网格的垂直对齐方式
6.place-self
justify-self和align-self的缩写

(四)、grid骰子练习

1.方法一

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #box1 {
            width: 100px;
            height: 100px;
            border: 1px black solid;
            border-radius: 5px;
            display: grid;
            grid-template-columns: repeat(3, 1fr);
            grid-template-rows: repeat(3, 1fr);
            place-items: center center;
        }

        #box1 div {
            width: 20px;
            height: 20px;
            border-radius: 50%;
            background-color: black;
        }

        #box1 div:nth-child(1) {
            /* 两个方向的起始线 2 2 ,和结束线 3 3 */
            grid-area: 2 / 2 / 3 / 3;
        }

        #box2 {
            width: 100px;
            height: 100px;
            border: 1px black solid;
            margin-top: 10px;
            border-radius: 5px;
            display: grid;
            grid-template-columns: repeat(3, 1fr);
            grid-template-rows: repeat(3, 1fr);
            place-items: center center;
        }

        #box2 div {
            width: 20px;
            height: 20px;
            border-radius: 50%;
            background-color: black;
        }

        #box2 div:nth-child(2) {
            grid-area: 3 / 3 / 4 / 4;
        }

        #box3 {
            width: 100px;
            height: 100px;
            border: 1px black solid;
            margin-top: 10px;
            border-radius: 5px;
            display: grid;
            grid-template-columns: repeat(3, 1fr);
            grid-template-rows: repeat(3, 1fr);
            place-items: center center;
        }

        #box3 div {
            width: 20px;
            height: 20px;
            border-radius: 50%;
            background-color: black;
        }

        #box3 div:nth-child(2) {
            grid-area: 2 / 2 / 3 / 3;
        }

        #box3 div:nth-child(3) {
            grid-area: 3 / 3 / 4 / 4;
        }

        #box4 {
            width: 100px;
            height: 100px;
            border: 1px black solid;
            margin-top: 10px;
            border-radius: 5px;
            display: grid;
            grid-template-columns: repeat(3, 1fr);
            grid-template-rows: repeat(3, 1fr);
            place-items: center center;
        }

        #box4 div {
            width: 20px;
            height: 20px;
            border-radius: 50%;
            background-color: black;
        }

        #box4 div:nth-child(4) {
            grid-area: 3 / 1 / 4 / 2;
        }

        #box4 div:nth-child(3) {
            grid-area: 3 / 3 / 4 / 4;
        }

        #box4 div:nth-child(2) {
            grid-area: 1 / 3 / 2 / 4;
        }

        #box5 {
            width: 100px;
            height: 100px;
            border: 1px black solid;
            margin-top: 10px;
            border-radius: 5px;
            display: grid;
            grid-template-columns: repeat(3, 1fr);
            grid-template-rows: repeat(3, 1fr);
            place-items: center center;
        }

        #box5 div {
            width: 20px;
            height: 20px;
            border-radius: 50%;
            background-color: black;
        }

        #box5 div:nth-child(5) {
            grid-area: 3 / 3 / 4 / 4;
        }

        #box5 div:nth-child(4) {
            grid-area: 3 / 1 / 4 / 2;
        }

        #box5 div:nth-child(3) {
            grid-area: 2 / 2 / 3 / 3;
        }

        #box5 div:nth-child(2) {
            grid-area: 1 / 3 / 2 / 4;
        }

        #box6 {
            width: 100px;
            height: 100px;
            border: 1px black solid;
            margin-top: 10px;
            border-radius: 5px;
            display: grid;
            grid-template-columns: repeat(3, 1fr);
            grid-template-rows: repeat(3, 1fr);
            place-items: center center;
        }

        #box6 div {
            width: 20px;
            height: 20px;
            border-radius: 50%;
            background-color: black;
        }

        #box6 div:nth-child(6) {
            grid-area: 3 / 3 / 4 / 4;
        }

        #box6 div:nth-child(5) {
            grid-area: 3 / 1 / 4 / 2;
        }

        #box6 div:nth-child(4) {
            grid-area: 2 / 3 / 3 / 4;
        }

        #box6 div:nth-child(3) {
            grid-area: 2 / 1 / 3 / 2;
        }

        #box6 div:nth-child(2) {
            grid-area: 1 / 3 / 2 / 4;
        }
    </style>
</head>

<body>
    <div id="box1">
        <div></div>
    </div>
    <div id="box2">
        <div></div>
        <div></div>
    </div>
    <div id="box3">
        <div></div>
        <div></div>
        <div></div>
    </div>
    <div id="box4">
        <div></div>
        <div></div>
        <div></div>
        <div></div>
    </div>
    <div id="box5">
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
    </div>
    <div id="box6">
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
    </div>
</body>

</html>
image.png

2.方法二

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #box1 {
            width: 100px;
            height: 100px;
            border: 1px black solid;
            margin-top: 10px;
            border-radius: 5px;
            display: grid;
            grid-template-columns: repeat(3, 1fr);
            grid-template-rows: repeat(3, 1fr);
            place-items: center center;
            grid-template-areas:
                "a1 a2 a3"
                "a4 a5 a6"
                "a7 a8 a9"
            ;
        }

        #box1 div {
            width: 20px;
            height: 20px;
            border-radius: 50%;
            background-color: black;
            grid-area: a5;
        }

        #box2 {
            width: 100px;
            height: 100px;
            border: 1px black solid;
            margin-top: 10px;
            border-radius: 5px;
            display: grid;
            grid-template-columns: repeat(3, 1fr);
            grid-template-rows: repeat(3, 1fr);
            place-items: center center;
            grid-template-areas:
                "a1 a2 a3"
                "a4 a5 a6"
                "a7 a8 a9"
            ;
        }

        #box2 div {
            width: 20px;
            height: 20px;
            border-radius: 50%;
            background-color: black;
        }

        #box2 div:nth-child(1) {
            grid-area: a1;
        }

        #box2 div:nth-child(2) {
            grid-area: a9;
        }

        #box3 {
            width: 100px;
            height: 100px;
            border: 1px black solid;
            margin-top: 10px;
            border-radius: 5px;
            display: grid;
            grid-template-columns: repeat(3, 1fr);
            grid-template-rows: repeat(3, 1fr);
            place-items: center center;
            grid-template-areas:
                "a1 a2 a3"
                "a4 a5 a6"
                "a7 a8 a9"
            ;
        }

        #box3 div {
            width: 20px;
            height: 20px;
            border-radius: 50%;
            background-color: black;
        }

        #box3 div:nth-child(1) {
            grid-area: a1;
        }

        #box3 div:nth-child(2) {
            grid-area: a5;
        }

        #box3 div:nth-child(3) {
            grid-area: a9;
        }

        /* ............. */
    </style>
</head>

<body>
    <div id="box1">
        <div></div>
    </div>
    <div id="box2">
        <div></div>
        <div></div>
    </div>
    <div id="box3">
        <div></div>
        <div></div>
        <div></div>
    </div>
    <div id="box4">
        <div></div>
        <div></div>
        <div></div>
        <div></div>
    </div>
    <div id="box5">
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
    </div>
    <div id="box6">
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
    </div>
</body>

</html>
image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容