目录
grid-template-columns和grid-template-rows
grid-template-areas和grid-template
Flex弹性盒模型
随着移动互联网的发展,对于网页布局来说要求越来越高,而传统的布局方案对于实现特殊布局非常不方便,比如垂直居中。2009年,W3C 提出了一种新的方案----Flex 布局,可以简便、完整、响应式地实现各种页面布局。目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能。
作用在flex容器上 | 作用在flex子项上 |
flex-direction | order |
flex-wrap | flex-grow |
flex-flow | flex-shrink |
justify-content | flex-basis |
align-items | flex |
align-content | align-self |
flex-direction
flex-direction用来控制子项整体布局方向,是从左往右还是从右往左,是从上往下还是从下往上。
取值 | 含义 |
row | 默认值,显示为行。方向为当前文档水平流方向, |
row-reverse | 显示为行。但方向和row属性值是反的 |
column | 显示为列 |
column-reverse | 显示为列。但方向和column属性值是反的 |
flex-wrap
flex-wrap用来控制子项整体单行显示还是换行显示。
取值 | 含义 |
nowrap | 默认值,表示单行显示,不换行。 |
wrap-reverse | 宽度不足换行显示,但是是从下往上开始, |
wrap | 宽度不足换行显示 |
flex-flow
flex-flow属性是flex-direction和flex-wrap的缩写,表示flex布局的flow流动特性。第一个值表示方向,第二个值表示换行,中间用空格隔开。
justify-content
justify-content属性决定了主轴方向上子项的对齐和分布方式。
取值 | 含义 |
flex-start | 默认值,表现为起始位置对齐。 |
flex-end | 表现为结束位置对齐。 |
center | 表现为居中对齐。 |
space-between | 表现为两端对齐。between是中间的意思,意思是多余的空白间距只在元素中间区域分配。 |
space-around | around是环绕的意思,意思是每个flex子项两侧都环绕互不干扰的等宽的空白间距,最终视觉上边缘两侧的空白只有中间空白宽度一半。 |
space-evenly | evenly是匀称、平等的意思。也就是视觉上,每个flex子项两侧空白间距完全相等。 |
align-items
align-items中的items指的就是flex子项们,因此align-items指的就是flex子项们相对于flex容器在侧轴方向上的对齐方式。
取值 | 含义 |
stretch | 默认值,flex子项拉伸。 |
flex-start | 表现为容器顶部对齐。 |
flex-end | 表现为容器底部对齐。 |
center | 表现为垂直居中对齐。 |
<style>
/* #parent{ width:300px; height:300px; border:1px black solid; margin:20px auto; display: flex;}
#box{ width:150px; height:50px; background:red; margin:auto;} */
#box{ width:300px; height:300px; border:1px black solid; margin:20px auto; display: flex; flex-direction: column-reverse;}
#box div{ width:50px; height:50px; color:white; line-height: 50px; text-align: center; background:red;}
#box2{ width:300px; height:300px; border:1px black solid; margin:20px auto; display: flex; /* flex-wrap:wrap; flex-direction: column; */ flex-flow: column wrap;}
#box2 div{ width:50px; height:50px; color:white; line-height: 50px; text-align: center; background:red;}
#box3{ width:300px; height:300px; border:1px black solid; margin:20px auto; display: flex; justify-content: space-evenly; flex-wrap:wrap;}
#box3 div{ width:50px; height:50px; color:white; line-height: 50px; text-align: center; background:red;}
#box4{ width:300px; height:300px; border:1px black solid; margin:20px auto; display: flex; justify-content: space-evenly; flex-wrap:wrap; align-items: flex-start; align-content: space-around; }
#box4 div{ width:50px; background:red;}
</style>
</head>
<body>
<!-- <div id="parent">
<div id="box"></div>
</div> -->
<!-- <div id="box">
<div>1</div>
<div>2</div>
<div>3</div>
</div> -->
<!-- <div id="box2">
<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> -->
<!-- <div id="box3">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
</div> -->
<div id="box4">
<div>测试文本</div>
<div>测试文本测试文本</div>
<div>测试文本测试文本测试文本</div>
<div>测试文本</div>
<div>测试文本</div>
<div>测试文本测试文本</div>
<div>测试文本测试文本测试文本</div>
<div>测试文本</div>
</div>
作用在flex子项上的CSS属性
取值 | 含义 |
order | 可以通过设置order改变某一个flex子项的排序位置。 |
flex-grow | 属性中的grow是扩展的意思,扩展的就是flex子项所占据的宽度,扩展所侵占的空 |
flex-shrink | 属性中的shrink是“收缩”的意思,flex-shrink主要处理 |
flex-basis | flex-basis定义了在分配剩余空间之前元素的默认大小。 |
flex | flex属性是flex-grow,flex-shrink和flex-basis的缩写。 |
align-self | align-self指控制单独某一个flex子项的垂直对齐方式。 |
Flex案例
1. 骰子的点数
<style>
#box1{ width:100px; height:100px; border:1px black solid; border-radius: 5px; display: flex; justify-content: center; align-items: center;}
#box1 div{ width:30%; height:30%; background:black; border-radius: 50%;}
#box2{ width:100px; height:100px; border:1px black solid; border-radius: 5px; display: flex; justify-content: space-between;}
#box2 div{ width:30%; height:30%; background:black; border-radius: 50%;}
#box2 div:last-child{ align-self: flex-end;}
#box3{ width:100px; height:100px; border:1px black solid; border-radius: 5px; display: flex; justify-content: space-between; align-items: center;}
#box3 div{ width:30%; height:30%; background:black; border-radius: 50%;}
#box3 div:first-child{ align-self: flex-start;}
#box3 div:last-child{ align-self: flex-end;}
#box4{ 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:black; border-radius: 50%;}
#box5{ 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; align-items: center;}
#box5 div:first-child{ align-items: flex-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:black; border-radius: 50%;}
#box6{ 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: flex-start; }
#box6 div:last-child{ align-items: flex-end;}
#box6 i{ display: block; width:30%; height:90%; background: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>
2.自适应
*{margin: 0;padding: 0;}
#main{display: flex;}
#left{width: 200px;height: 200px;background: red;}
#center{flex: 1;height: 300px;background: yellow;}
#right{width: 150px;height: 200px;background: blue;}
</style>
</head>
<body>
<div id="main">
<div id="left"></div>
<div id="center"></div>
<div id="right"></div>
</div>
grid网格布局
Grid布局是一个二维的布局方法,纵横两个方向总是同时存在
作用在grid容器上 | 作用在grid子项上 |
grid-template-columns | grid-column-start |
grid-template-rows | grid-column-end |
grid-template-areas | grid-row-start |
grid-template | grid-row-end |
grid-column-gap | grid-column |
grid-row-gap | grid-row |
grid-gap | grid-area |
justify-items | justify-self |
align-items | align-self |
place-items | place-self |
justify-content | |
align-content | |
place-content |
grid-template-columns和grid-template-rows
对网格进行横纵划分,形成二维布局。单位可以是像素,百分比,自适应以及fr单位(网格剩余空间比例单位)。有时候,我们网格的划分是很规律的,如果需要添加多个横纵网格时,可以利用repeat()语法进行简化操作。
.box{ width:300px; height:300px; border:1px gray dotted; display: grid;
/* grid-template-rows: 100px auto 25%;
grid-template-columns: 100px 100px 200px 100px; */
/* grid-template-rows: 1fr 1fr 1fr;
grid-template-columns: 1fr 1fr 1fr; */
grid-template-rows: repeat(3 , 1fr);
grid-template-columns: repeat(3 , 1fr);
}
.box div{ background:red; border:1px black solid;}
</style>
</head>
<body>
<div class="box">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
<div>6</div>
<div>7</div>
<div>8</div>
<div>9</div>
</div> -->
grid-template-areas和grid-template
.box2{ width:300px; height:300px; border:1px gray dotted; display: grid;
/* grid-template-rows: repeat(3 , 1fr);
grid-template-columns: repeat(3 , 1fr);
grid-template-areas:
"a1 a1 a1"
"a2 a2 a3"
"a2 a2 a3"; */
grid-template:
"a1 a1 a1" 1fr
"a2 a2 a3" 1fr
"a2 a2 a3" 1fr
/1fr 1fr 1fr;
}
.box2 div{ background:red; border:1px black solid;}
.box2 div:nth-child(1){ grid-area: a1;}
.box2 div:nth-child(2){ grid-area: a2;}
.box2 div:nth-child(3){ grid-area: a3;}
<div class="box2">
<div>1</div>
<div>2</div>
<div>3</div>
</div>
grid-column-gap和grid-row-gap
grid-column-gap和grid-row-gap属性用来定义网格中网格间隙的尺寸。CSS grid-gap属性是grid-column-gap和grid-row-gap属性的缩写
/* grid-column-gap: 10px;
grid-row-gap: 20px; */
grid-gap:20px 10px;
justify-items和align-items
justify-items指定了网格元素的水平呈现方式,是水平拉伸显示,还是左中右对齐。align-items指定了网格元素的垂直呈现方式,是垂直拉伸显示,还是上中下对齐。
place-items可以让align-items和justify-items属性写在单个声明中。
取值 | 含义 |
stretch | 默认值,拉伸。表现为水平或垂直填充。 |
Start | 表现为容器左侧或顶部对齐。 |
end | 表现为容器右侧或底部对齐。 |
center | 表现为水平或垂直居中对齐。 |
/* justify-items: end;
align-items:end; */
/* place-items: start end; */
/* justify-content: space-between;
align-content: space-between; */
place-content: space-between space-between;
justify-content和align-content
justify-content指定了网格元素的水平分布方式。align-content指定了网格元素的垂直分布方式。place-content可以让align-content和justify-content属性写在一个CSS声明中。
取值 | 含义 |
stretch | 默认值,拉伸。表现为水平或垂直填充。 |
start | 表现为容器左侧或顶部对齐。 |
end | 表现为容器右侧或底部对齐。 |
center | 表现为水平或垂直居中对齐。 |
space-between | 表现为两端对齐。 |
space-around | 享有独立不重叠的空白空间。 |
space-evenly | 平均分配空白空间 |
作用在grid子项上的CSS属性
取值 | 含义 |
grid-column-start | 水平方向上占据的起始位置。 |
grid-column-end | 水平方向上占据的结束位置。(span属性) |
grid-row-start | 垂直方向上占据的起始位置。 |
grid-row-end | 垂直方向上占据的结束位置。(span属性) |
grid-column | grid-column-start + grid-column-end的缩写。 |
grid-row | grid-row-start + grid-row-end的缩写。 |
grid-area | 表示当前网格所占用的区域,名字和位置两种表示方法。 |
justify-self | 单个网格元素的水平对齐方式。 |
align-self | 单个网格元素的垂直对齐方式。 |
place-self | align-self和justify-self的缩写。 |
<style>
.box{ width:300px; height:300px; border:1px gray dotted; display: grid;
grid-template-rows: repeat(3 , 1fr);
grid-template-columns: repeat(3 , 1fr);
}
.box div{ background:red; border:1px black solid;
/* grid-column-start: 2;
grid-column-end: 3;
grid-row-start: 2;
grid-row-end: span 2; */
/* grid-column: 2 / 3;
grid-row: 2 / span 2; */
grid-area: 3 / 2 / 4 / 4; /* 第一个值是水平的起始位置 , 第二个值是垂直的起始位置,三个值是水平的结束位置,第四个值是垂直的结束位置 */
}
.box2{ width:300px; height:300px; border:1px gray dotted; display: grid;
grid-template-rows: repeat(3 , 1fr);
grid-template-columns: repeat(3 , 1fr);
}
.box2 div{ background:red; border:1px black solid;}
.box2 div:nth-child(2){ /* justify-self: start; align-self: end; */ place-self:end start ; }
</style>
</head>
<body>
<!-- <div class="box">
<div></div>
</div> -->
<div class="box2">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
<div>6</div>
<div>7</div>
<div>8</div>
<div>9</div>
</div>
骰子
.box{ 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;
}
.box div{ width:20px; height:20px; background:black; border-radius: 50%;}
.box div:nth-child(1){ grid-area: 2 / 2 / 3 / 3; }
.box2{ 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;
}
.box2 div{ width:20px; height:20px; background:black; border-radius: 50%;}
.box2 div:nth-child(2){ grid-area: 3 / 3 / 4 / 4; }
.box3{ 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;
grid-template-areas:
"a1 a2 a3"
"a4 a5 a6"
"a7 a8 a9";
}
.box3 div{ width:20px; height:20px; background:black; border-radius: 50%;}
.box3 div:nth-child(2){ grid-area: a5; }
.box3 div:nth-child(3){ grid-area: a9; }
.box4{ 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;
grid-template-areas:
"a1 a2 a3"
"a4 a5 a6"
"a7 a8 a9";
}
.box4 div{ width:20px; height:20px; background:black; border-radius: 50%;}
.box4 div:nth-child(2){ grid-area: a3; }
.box4 div:nth-child(3){ grid-area: a7; }
.box4 div:nth-child(4){ grid-area: a9; }
.box5{ 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;
grid-template-areas:
"a1 a2 a3"
"a4 a5 a6"
"a7 a8 a9";
}
.box5 div{ width:20px; height:20px; background:black; border-radius: 50%;}
.box5 div:nth-child(2){ grid-area: a3; }
.box5 div:nth-child(3){ grid-area: a7; }
.box5 div:nth-child(4){ grid-area: a9; }
.box5 div:nth-child(5){ grid-area: a5; }
.box6{ 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;
grid-template-areas:
"a1 a2 a3"
"a4 a5 a6"
"a7 a8 a9";
}
.box6 div{ width:20px; height:20px; background:black; border-radius: 50%;}
.box6 div:nth-child(2){ grid-area: a3; }
.box6 div:nth-child(3){ grid-area: a7; }
.box6 div:nth-child(4){ grid-area: a9; }
.box6 div:nth-child(5){ grid-area: a4; }
.box6 div:nth-child(6){ grid-area: a6; }
</style>
</head>
<body>
<div class="box">
<div></div>
</div>
<div class="box2">
<div></div>
<div></div>
</div>
<div class="box3">
<div></div>
<div></div>
<div></div>
</div>
<div class="box4">
<div></div>
<div></div>
<div></div>
<div></div>
</div>
<div class="box5">
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
</div>
<div class="box6">
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
</div>
百度风云榜
.box{ width:280px; height:352px; margin:20px auto; display: grid;
grid-template-columns: repeat(3 , 1fr);
grid-template-rows: repeat(4 , 1fr);
grid-template-areas:
"a1 a2 a2"
"a3 a2 a2"
"a4 a4 a5"
"a6 a7 a7";
grid-gap: 6px 6px;
}
.box div{ background:red;}
.box div:nth-child(1){ grid-area: a1;}
.box div:nth-child(2){ grid-area: a2;}
.box div:nth-child(3){ grid-area: a3;}
.box div:nth-child(4){ grid-area: a4;}
.box div:nth-child(5){ grid-area: a5;}
.box div:nth-child(6){ grid-area: a6;}
.box div:nth-child(7){ grid-area: a7;}
</style>
</head>
<body>
<div class="box">
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
</div>