display
-
block,块元素,例如:div、p、form、header、footer、section等
-
inline,行内元素,例如:span、a等
-
none,一些特殊元素的默认 display 值,例如script。用来在不删除元素的情况下隐藏或显示元素。
-
其他display值,例如:list-item、flex详细列表
每个元素都有一个默认的display类型,可以重写。
margin
#main {
width: 600px;
margin: 0 auto;
}
#main {
max-width: 600px;
margin: 0 auto;
}
使用max-width
替代width
可以使浏览器更好地处理小窗口的情况。
盒模型
CSS 盒模型 (Box Model) 规定了元素框处理元素内容、内边距、边框 和 外边距 的方式
标准模式
完整定义DOCTYPE,都会触发标准模式;DOCTYPE缺失,在ie8及其以前版本下将会触发怪异模式(quirks 模式)
<!DOCTYPE HTML>
.box {
width: 200px;
height: 200px;
border: 20px solid black;
padding: 50px;
margin: 50px;
}
total = 200px (width) + 40px (left + right padding) + 100px (left + right border) + 100px (left + right margin) = 440px
总宽度/高度=width/height+padding+border+margin
怪异模式
.box {
width: 200px;
height: 200px;
border: 20px solid black;
padding: 50px;
margin: 50px;
}
total = 200px (width) + 100px (left + right margin) = 60 (content) + 40px (left + right padding) + 100px (left + right border) + 100px (left + right margin) = 300px
总宽度/高度=width/height + margin = 内容区宽度/高度 + padding + border + margin
box-sizing
设置一个元素为 box-sizing: border-box; 时,此元素的内边距和边框不再会增加它的宽度。
.simple {
width: 500px;
margin: 20px auto;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
position
static 默认值
.static {
position: static;
}
relative 相对定位
.relative1 {
position: relative;
}
.relative2 {
position: relative;
top: -20px;
left: 20px;
background-color: white;
width: 500px;
}
fixed,固定定位,相对于视窗来定位,页面滚动,还是会停留在相同的位置
.fixed {
position: fixed;
bottom: 0;
right: 0;
width: 200px;
background-color: white;
}
absolute,绝对定位,相对于最近的positioned祖先元素,会随着页面滚动而移动
.relative {
position: relative;
width: 600px;
height: 400px;
}
.absolute {
position: absolute;
top: 120px;
right: 0;
width: 300px;
height: 200px;
}
float 浮动布局
float
clear
.box {
float: left;
width: 200px;
height: 100px;
margin: 1em;
}
.after-box {
clear: left;
}
.clearfix {
overflow: auto;
}
简单浮动布局
nav {
float: left;
width: 200px;
}
section {
margin-left: 200px;
}
百分比宽度布局
nav {
float: left;
width: 25%;
}
section {
margin-left: 25%;
}
inline-block 布局
nav {
display: inline-block;
vertical-align: top;
width: 25%;
}
.column {
display: inline-block;
vertical-align: top;
width: 75%;
}
grid 网格单元布局
grid概念
Grid Container
一个元素设置了属性值display: grid 或 inline-grid。
.container{
display: grid; /* or inline-grid */
}
Grid布局以后,子元素的float、clear和vertical-align属性将失效。
Grid Item
container的子元素,不包括sub-item
<div class="container">
<div class="item"></div>
<div class="item">
<p class="sub-item"></p>
</div>
<div class="item"></div>
</div>
网格线(Grid Line)
网格线组成了网格,是网格的水平和垂直的分界线。
网格轨道(Grid Track)
网格轨道是就是相邻两条网格线之间的空间,就好比表格中行或列。在网格中其分为grid column和grid row。
网格单元格(Grid Cell)
网格单元格是指四条网格线之间的空间。是最小的单位。
网格区域(Grid Area)
网格区域是由任意四条网格线组成的空间,所以他可能包含一个或多个单元格。
网格单元格顺序(order)
对网格单父元格进行顺序重排
浏览器支持
http://caniuse.com/#feat=css-grid
chrome启动支持CSS Grid Layout
chrome://flags/#enable-experimental-web-platform-features
在项目当中使用grid布局方式,则需要安装css-grid-polyfill
demo
等分
<html>
<head>
<title></title>
<style type="text/css">
body {
padding: 50px;
}
.container {
display: grid;
grid-template-columns: 100px 10px 100px 10px 100px 10px 100px;
grid-template-rows: auto 10px auto 10px auto;
}
.grid-item {
background-color: #000;
color: #fff;
padding: 20px;
text-align: center;
}
.a1 {
grid-column-start: 1;
grid-column-end: 2;
grid-row-start: 1;
grid-row-end: 2;
}
.b1 {
grid-column-start: 3;
grid-column-end: 4;
grid-row-start: 1;
grid-row-end: 2;
}
.c1 {
grid-column-start: 5;
grid-column-end: 6;
grid-row-start: 1;
grid-row-end: 2;
}
.d1 {
grid-column-start: 7;
grid-column-end: 8;
grid-row-start: 1;
grid-row-end: 2;
}
.a2 {
grid-column: 1 / 2;
grid-row: 3 / 4;
}
.b2 {
grid-column: 3 / 4;
grid-row: 3 / 4;
}
</style>
</head>
<body>
<div class="container">
<div class="grid-item a1">A1</div>
<div class="grid-item b1">B1</div>
<div class="grid-item c1">C1</div>
<div class="grid-item d1">D1</div>
<div class="grid-item a2">A2</div>
<div class="grid-item b2">B2</div>
</div>
</body>
</html>
垂直居中
<div class="vertical-container">
<div class="content">垂直居中</div>
</div>
.vertical-container {
height: 500px;
width: 500px;
display: grid;
display: -webkit-grid;
align-items: center;
-webkit-align-items: center;
justify-content: center;
-webkit-justify-content: center;
background-color: green;
}
.content {
height: 200px;
width: 200px;
line-height: 200px;
text-align: center;
background-color: yellow;
}
两栏/三栏布局
<div class="box box1">
<div class="left">left</div>
<div class="main">main</div>
</div>
<div class="box box2">
<div class="left">left</div>
<div class="main">main</div>
<div class="right">right</div>
</div>
.box {
display: grid;
height: 200px;
width: 100%;
margin-bottom: 30px;
grid-template-columns: 200px auto;
}
.box1 {
grid-template-columns: 200px auto;
}
.box2 {
grid-template-columns: 200px auto 100px;
}
.left {
background-color: yellow;
grid-area: 1/ 1/ 2/ 2;
}
.main {
background-color: green;
grid-area: 1/ 2/ 2/ 3;
}
.right {
background-color: blue;
grid-area: 1/ 3/ 2/ 4;
}
flexbox 弹性布局
Flex(Flexible Box),弹性布局。
flex概念
flex container
一个元素设置了属性值display: flex 或 inline-flex。
.container {
display: flex; /* or inline-flex */
}
Flex布局以后,子元素的float、clear和vertical-align属性将失效
容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis)。主轴的开始位置(与边框的交叉点)叫做main start,结束位置叫做main end;交叉轴的开始位置叫做cross start,结束位置叫做cross end。 项目默认沿主轴排列。单个项目占据的主轴空间叫做main size,占据的交叉轴空间叫做cross size。
设置在父级容器属性
flex-direction
flex-wrap
flex-flow
justify-content
align-items
align-content
flex-direction
.container {
flex-direction: row | row-reverse | column | column-reverse;
}
row(默认值):主轴为水平方向,起点在左端。
row-reverse:主轴为水平方向,起点在右端。
column:主轴为垂直方向,起点在上沿。
column-reverse:主轴为垂直方向,起点在下沿.
flex-wrap
.container{
flex-wrap: nowrap | wrap | wrap-reverse;
}
nowrap (default): single-line 不换行。
wrap: multi-line 换行,第一行在上方。
wrap-reverse: multi-line 换行,第一行在下方。
flex-flow
flex-direction 和 flex-wrap的简写,默认值为row nowrap
flex-flow: <‘flex-direction’> || <‘flex-wrap’>
justify-content
设置或检索弹性盒子元素在主轴(横轴)方向上的对齐方式
.container {
justify-content: flex-start|flex-end|center|space-between|space-around|initial|inherit;
}
flex-start(默认值):左对齐
flex-end:右对齐
center: 居中
space-between:两端对齐,项目之间的间隔都相等。
space-around:每个项目两侧的间隔相等
align-items
flex子项在flex容器的当前行的侧轴(纵轴)方向上的对齐方式
.container {
align-items: flex-start | flex-end | center | baseline | stretch;
}
align-content
在弹性容器内的各项没有占用交叉轴上所有可用的空间时对齐容器内的各项(垂直)
.container {
align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}
flex items
flex容器的子元素
设置在子元素上的属性
order
flex-grow
flex-shrink
flex-basis
flex
align-self
order
flex items 的排序
.item {
order: <integer>;
}
flex-grow
子元素宽的比重
.item {
flex-grow: <number>; /* default 0 */
}
flex-shrink
收缩比,比如第二个元素收缩到其他元素的三分之一
.item2 {
flex-shrink: 3;
}
flex-basis
用于设置或检索弹性盒伸缩基准值,比如设置第二个弹性盒元素的初始长度为80px。
.item2 {
flex-basis: 80px;
}
flex
flex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选。
.item {
flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}
align-self
flex子项单独在侧轴(纵轴)方向上的对齐方式
.item {
align-self: auto | flex-start | flex-end | center | baseline | stretch;
}
浏览器支持
http://caniuse.com/#feat=flexbox
demo
垂直居中布局
<div class="vertical-container">
<div class="content">垂直居中</div>
</div>
.vertical-container {
height: 500px;
width: 500px;
display: flex;
display: -webkit-flex;
align-items: center;
-webkit-align-items: center;
justify-content: center;
-webkit-justify-content: center;
background-color: green;
}
.content {
height: 200px;
width: 200px;
line-height: 200px;
text-align: center;
background-color: yellow;
}
两栏/三栏布局
<div class="box">
<div class="left">left</div>
<div class="main">main</div>
</div>
<div class="box">
<div class="left">left</div>
<div class="main">main</div>
<div class="right">right</div>
</div>
.box {
display: flex;
height: 200px;
margin-bottom: 30px;
}
.left {
background-color: yellow;
flex-basis: 200px;
/* flex-basis定义该项目在分配主轴空间之前提前获得200px的空间 */
flex-grow: 0;
/* flex-grow定义该项目不分配剩余空间 */
}
.main {
background-color: green;
flex-grow: 1;
/* flex-grow定义main占满剩余空间 */
}
.right {
background-color: blue;
flex-basis: 100px;
flex-grow: 0;
}