CSS引入方式
行内引入:
<div style="这里写样式">我是一个块级的标签</div>
嵌入式:将CSS样式表放到head中用
<head>
...
<style type="text/css">
...此处写CSS样式
</style>
</head>
导入式: 将一个独立的.css文件引入HTML文件中,导入式使用@import 引入外部CSS文件,
<head>
...
<style type="text/css">
@import "My.css"; 此处注意.css文件的路径
</style>
</head>
链接式引入:将一个独立的.css文件引入到HTML文件中,使用标记写在标记中。 链接式会以网页文件主体装载前装载CSS文件。
<head>
...
<link href="My.css" rel="stylesheet" type="text/css">
</head>
样式的应用顺序:
- 行内样式优先级最高
- 针对相同的样式属性,不同的样式属性将以合并的方式呈现
- 相同样式并且相同属性,呈现方式在
<head>
中的顺序决定,后面会覆盖前面属性 - !important 指定样式规则应用最优先
CSS选择器
基本选择器:
1、通用元素选择器:
表示应用到所有的标签 。*{margin:0;padding:0;}
2、标签选择器
匹配所有使用 div 标签的元素(可以匹配所有标签)div {color: yellow}
3、类选择器
匹配所有class属性中包含info的元素。
语法:.类名{样式}(类名不能以数字开头,类名要区分大小写。)
.yanse{color:yellow}
<div class="yanse"/>我的div</div>
4、id选择器
使用id属性来调用样式,在一个网页中id的值都是唯一的(是W3C规范而不是规则,所以不会报错)。
语法:#ID名{样式}(ID名不能以数字开头
#Mycolor {color: yellow}
<h3 id="Mycolor">H3</h3>
组合选择器:
1、多元素组合选择器
同时匹配两个或多个标签,用逗号隔开
p,a,div{color: yellow;}
<p>段落</p>
<a>link</a>
<div>kuai</div>
2、后代元素选择器
匹配所有div标签里嵌套的P标签,之间用空格分隔。
div p {color: yellow;}
<div>
<p>pppppp</p>
<div>
<p>pppppp</p>
</div>
</div>
3、子代元素选择器
匹配所有div标签里嵌套的子P标签,之间用 >分隔。
div > p {color: yellow;}
<div>
<p>div</p>
<p>div</p>
</div>
4、兄弟元素选择器
匹配所有紧随div标签之后的同级标签P,之间用+分隔(只能匹配一个)。
div + p {color: yellow;}
<div>div</div>
<p>ppp</p>
伪类选择器:
-
link、hover、active、visited
a:link(未访问的链接状态),用于定义了常规的链接状态。 a:hover(鼠标放在链接上的状态),用于产生视觉效果。 a:active(在链接上按下鼠标时的状态)。 a:visited(已访问过的链接状态),可以看出已经访问过的链接。
-
before、after
P:before 在每个<p>元素的内容之前插入内容; P:after 在每个<p>元素的内容之后插入内容。
CSS常用属性总结
1.颜色属性:
transparent
- 全透明,使用方式:
color: transparent
opacity
- 元素的透明度,语法:
opacity: 0.5
- 属性值在0.0到1.0范围内,0表示透明,1表示不透明。
- filter滤镜属性(只适用于早期的IE浏览器,语法:
filter:alpha(opacity:20);
)。
2.字体属性:
font-style: 用于规定斜体文本
- normal 文本正常显示
- italic 文本斜体显示
- oblique 文本倾斜显示
font-weight: 设置文本的粗细
- normal(默认)
- bold(加粗)
- bolder(相当于
<strong>
和<b>
标签) - lighter (常规)
- 100 ~ 900 整百(400=normal,700=bold)
font-size: 设置字体的大小
- 默认值:medium
<absolute-size>
可选参数值:xx-small、 x-small、 small、 medium、 large、 x-large、 xx-large<relative-size>
相对于父标签中字体的尺寸进行调节。可选参数值:smaller、 larger<percentage>
百分比指定文字大小。<length>
用长度值指定文字大小,不允许负值。
font-family:字体名称
- 使用逗号隔开多种字体(优先级从前向后,如果系统中没有找到当前字体,则往后面寻找)
font:简写属性
- 语法:font:字体大小/行高 字体;(字体要在最后)
3.文本属性:
text-align: 文本的水平对齐方式
- left
- center
- right
line-height: 文本行高
- normal 默认
vertical-align: 文本所在行高的垂直对齐方式
- baseline 默认
- sub 垂直对齐文本的下标,和标签一样的效果
- super 垂直对齐文本的上标,和标签一样的效果
- top 对象的顶端与所在容器的顶端对齐
- text-top 对象的顶端与所在行文字顶端对齐
- middle 元素对象基于基线垂直对齐
- bottom 对象的底端与所在行的文字底部对齐
- text-bottom 对象的底端与所在行文字的底端对齐
text-transform: 属性控制文本的大小写
- capitalize 文本中的每个单词以大写字母开头。
- uppercase 定义仅有大写字母。
- lowercase 定义仅有小写字母。
- text-overflow: 文本溢出样式
text-decoration: 文本的装饰
- none 默认。
- underline 下划线。
- overline 上划线。
- line-through 中线。
text-shadow:文本阴影
text-shadow: 5px 5px 5px #888;
- 第一个参数是左右位置
- 第二个参数是上下位置
- 第三个参数是虚化效果
- 第四个参数是颜色
word-wrap:自动换行
- word-wrap: break-word;
4.背景属性
背景颜色
background-image 设置图像为背景
- url(“1.png”); 图片地址
- background-image:linear-gradient(green,blue,yellow,red,black); 颜色渐变效果
background-position 设置背景图像的位置坐标
- background-position: center center; 图片置中,x轴center,y轴center
- 1px -195px 截取图片某部分,分别代表坐标x,y轴
background-repeat 设置背景图像不重复平铺
- no-repeat 设置图像不重复,常用
- round 自动缩放直到适应并填充满整个容器
- space 以相同的间距平铺且填充满整个容器
background-attachment 背景图像是否固定或者随着页面的其余部分滚动
background 简写
- background: url(“1.png”) no-repeat 0 -196px;
- background: url(“1.png”) no-repeat center bottom 15px;
- background: url(“1.png”) no-repeat left 30px bottom 15px;
5.列表属性
list-style-type: 列表项标志的类型
- none 去除标志
- square; 方框
- circle; 空心圆
- upper-alph; & disc; 实心圆
list-style-image:将图象设置为列表项标志
list-style-position:列表项标志的位置
- inside
- outside
list-style:(缩写,3个参数为以上属性)
CSS优先级
当有多个样式对作用于一个标签时便使用到CSS优先级,它来决定哪些样式会被作用于该标签,哪些会被覆盖。
1.选择器的优先级
CSS 7 种基础的选择器:
- ID 选择器, 如 #id{}
- 类选择器, 如 .class{}
- 属性选择器, 如 a[href=“segmentfault.com”]{}
- 伪类选择器, 如 :hover{}
- 伪元素选择器, 如 ::before{}
- 标签选择器, 如 span{}
- 通配选择器, 如 *{}
对于标签自有的属性,选择器的优先级规则为
内联样式 > ID 选择器 > 类选择器 = 属性选择器 = 伪类选择器 > 标签选择器 = 伪元素选择器
2.选择符的优先级
所有 CSS 的选择符由上述 7 种基础的选择器或者组合而成,组合的方式有 3 种:
- 后代选择符: .father .child{}
- 子选择符: .father > .child{}
- 相邻选择符: .bro1 + .bro2{}
当一个标签同时被多个选择符选中,我们便需要确定这些选择符的优先级。我们有如下规则:
计算选择符中 ID 选择器的个数(a),计算选择符中类选择器、属性选择器以及伪类选择器的个数之和(b),计算选择符中标签选择器和伪元素选择器的个数之和(c)。按 a、b、c 的顺序依次比较大小,大的则优先级高,相等则比较下一个。若最后两个的选择符中 a、b、c 都相等,则按照"就近原则"来判断。
3.多重样式优先级
外部样式表和内部样式表的优先级由其引入顺序有关,一般认为内部样式优先级大于外部样式,也可以认为其相等,因为如果外部样式放在内部样式的后面引入,则外部样式将覆盖内部样式。
内联样式 > 内部样式 > 外部样式 > 浏览器默认样式
如果外部样式表和内部样式表中的样式发生冲突会出现什么情况呢?
这与样式表在 HTML 文件中所处的位置有关。样式被应用的位置越在下面则优先级越高
4.继承样式
一般来说对于文字样式的设置都会具有继承性,例如font-family、font-size、font-weight、color等等,当需要继承样式时,最近的祖先样式比其他祖先样式优先级高。
<div style="color: red;">
<div style="color: blue;">
<div >T3</div> <!-- 显示蓝色 -->
</div>
</div>
规则总结:
CSS 优先规则1: 最近的祖先样式比其他祖先样式优先级高。
CSS 优先规则2:"直接样式"比"祖先样式"优先级高。
CSS 优先规则3:优先级关系:内联样式 > ID 选择器 > 类选择器 = 属性选择器 = 伪类选择器 > 标签选择器 = 伪元素选择器
CSS 优先规则4:计算选择符中 ID 选择器的个数(a),计算选择符中类选择器、属性选择器以及伪类选择器的个数之和(b),计算选择符中标签选择器和伪元素选择器的个数之和(c)。按 a、b、c 的顺序依次比较大小,大的则优先级高,相等则比较下一个。若最后两个的选择符中 a、b、c 都相等,则按照"就近原则"来判断
CSS 优先规则5:属性后插有 !important 的属性拥有最高优先级。若同时插有 !important,则再利用规则 3、4 判断优先级。
错误的说法:
在学习过程中,你可能发现给选择器加权值的说法,即 ID 选择器权值为 100,类选择器权值为 10,标签选择器权值为 1,当一个选择器由多个 ID 选择器、类选择器或标签选择器组成时,则将所有权值相加,然后再比较权值。这种说法其实是有问题的。比如一个由 11 个类选择器组成的选择器和一个由 1 个 ID 选择器组成的选择器指向同一个标签,按理说 110 > 100,应该应用前者的样式,然而事实是应用后者的样式。错误的原因是:权重的进制是并不是十进制,CSS 权重进制在 IE6 为 256,后来扩大到了 65536,现代浏览器则采用更大的数量。。还是拿刚刚的例子说明。11 个类选择器组成的选择器的总权值为 110,但因为 11 个均为类选择器,所以其实总权值最多不能超过 100, 你可以理解为 99.99,所以最终应用后者样式。
CSS页面布局
1. 边框
border-style:边框样式
- solid 默认,实线
- double 双线
- dotted 点状线条
- dashed 虚线
border-color:边框颜色
border-width:边框宽度
border-radius:圆角
- 1个参数:四个角都应用
- 2个参数:第一个参数应用于 左上、右下;第二个参数应用于 左下、右上
- 3个参数:第一个参数应用于 左上;第二个参数应用于 左下、右上;第三个参数应用于右下
- 4个参数:左上、右上、右下、左下(顺时针
border: 简写
- border: 2px yellow solid;
box-shadow:边框阴影
box-shadow: 10px 10px 5px #888;
- 第一个参数是左右位置
- 第二个参数是上下位置
- 第三个参数是虚化效果
- 第四个参数是颜色
2.盒子模型
padding:用于控制内容与边框之间的距离;
margin: 用于控制元素与元素之间的距离;
padding、margin | 表示上右下左都应用 |
---|---|
padding-top、margin-top | 上 |
padding-right、margin-right | 右 |
padding-bottom、margin-bottom | 下 |
padding-left、margin-left | 左 |
有一个参数,应用于四边。
两个参数,第一个用于上、下,第二个用于左、右。
三个参数,第一个用于上,第二个用于左、右,第三个用于下。
当我们写html的时候;在我们写body与浏览器之间还存在一块的空白区域
body{
margin:0;
}
3.display
- none 不显示。
- block 显示为块级元素。
- inline 显示为内联元素。
- inline-block 行内块元素(会保持块元素的高宽)。
- list-item 显示为列表元素。
4.visibility
- visible 元素可见
- hidden 元素不可见
- collapse 当在表格元素中使用时,此值可删除一行或一列,不会影响表格的布局。
5. float 浮动
让一行显示两个或多个块级标签,会脱离文档流;如果浮动起来的标签的父级标签没有内容;那么父标签将消失;
- none
- left 左浮动
- right 右浮动
clear 清除浮动:
- none : 默认值。允许两边都可以有浮动对象
- left : 不允许左边有浮动对象
- right : 不允许右边有浮动对象
- both : 不允许两边有浮动对象
6. clip 剪裁图像
rect 剪裁定位元素:
例:clip:rect(0px,60px,200px,0px);
- auto 默认值,无剪切
- 上-右-下-左(顺时针)的顺序提供四个偏移值
- 区域外的部分是透明的
- 必须指定 position:absolute;
7.overflow 设置当对象的内容超过其指定高度及宽度时如何显示内容
- visible 默认值,内容不会被修剪,会呈现在元素框之外。
- hidden 内容会被修剪,并且其余内容是不可见的。
- scroll 内容会被修剪,但是浏览器会显示滚动条以便查看其余的内容。
- auto 如果内容被修剪,则浏览器会显示滚动条以便查看其余的内容。
8. position 规定元素的定位类型
- static: 默认值,没有定位,遵从正常的文档流
- relative: 相对定位元素,相对于其正常位置进行定位,遵从正常的文档流
- absolute: 绝对定位元素,脱离正常文档流
- fixed: 绝对定位元素,固定在浏览器某处
通过以下四种属性进行定位:
left、top、right、bottom、z-index
9.z-index 元素层叠顺序
- z-index 仅在定位元素上有效(例:position:absolute;)
- 可以指定负数属性值(例:-1;)
10. outline 边框轮廓
- outline-width 轮廓宽度
- outline-color 轮廓颜色
- outline-style 轮廓样式
11.zoom 缩放比例 :
.zoom1 {
zoom: 100%;
}
.zoom2 {
zoom: 150%;
}
.zoom3 {
zoom: 200%;
}
12.cursor 鼠标的类型形状
cursor 属性规定要显示的光标的类型(形状)。
该属性定义了鼠标指针放在一个元素边界范围内时所用的光标形状
13.transform、transition 动画效果
transform 转换,变形
- origin 定义旋转基点(left top center right bottom 坐标值) transform-origin: 50px 50px; transform-origin: left;。
- rotate 旋转 transform:rotate(50deg) 旋转角度可以为负数,需要先定义origin。
- skew 扭曲 transform:skew(50deg,50deg) 分别为相对x轴倾斜,相对y轴倾斜。
- scale 缩放 transform:scale(2,3) 横向放大2倍,纵向放大3倍;transform:scale(2) 横竖都放大2倍。
- translate 移动 transform:translate(50px, 50px) 分别为相对x轴移动,相对y轴移动
transition 过渡属性是一个简写属性,用于设置四个过渡属性:
- transition-property: 变换的属性(none(没有属性改变)、all(所有属性改变)、具体属性)
- transition-duration: 变换持续时间
- transition-timing-function: 变换的速率(ease:(逐渐变慢)、linear:(匀速)、ease-in:(加速)、ease-out:(减速)、ease-in-out:(加速然后减速)、cubic-bezier:(自定义时间曲线))
- transition-delay: 变换延迟时间
Flex布局
Flex布局也称弹性布局,可以为盒状模型提供最大的灵活性,是布局的首选方案,现已得到所有现代浏览器的支持。
1.基础
通过指定display: flex
来标识一个弹性布局盒子,称为FLEX容器,容器内部的盒子就成为FLEX容器的成员,容器默认两根轴线,水平的主轴与垂直的交叉轴,主轴的开始位置叫做main start,结束位置叫做main end;交叉轴的开始位置叫做cross start,结束位置叫做cross end,容器成员默认按照主轴排列。
2.容器属性
flex-direction
flex-direction
属性决定主轴的方向,取值为row | row-reverse | column | column-reverse
row
默认值:主轴为水平方向,起点在左端。row-reverse
:主轴为水平方向,起点在右端,容器成员顺序与row顺序相反。column
:主轴为垂直方向,起点在上沿。column-reverse
:主轴为垂直方向,起点在下沿,容器成员顺序与column
顺序相反。
<div id="t1">
<div>1</div>
<div>2</div>
<div>3</div>
</div>
<!--
3
2
1
-->
<style type="text/css">
#t1{
display: flex;
flex-direction: column-reverse;
}
</style>
flex-wrap
flex-wrap
属性决定当轴线方向放不下成员时,是否换行,取值为nowrap | wrap | wrap-reverse
nowrap
默认:不换行,当空间不足时,会按轴线方向成员大小比例缩小的成员wrap
:距离不够时换行,新起一行排列
-wrap-reverse
:距离不够时换行,新起的一行在上方
<div id="t2" style="width: 20px;">
<div>4</div>
<div>5</div>
<div>6</div>
</div>
<!--
45
6
-->
<style type="text/css">
#t2{
display: flex;
flex-wrap: wrap;
}
</style>
flex-flow
flex-flow
属性是flex-direction
属性和flex-wrap
属性的简写形式,默认row nowrap
<div id="t3" style="width: 20px;">
<div>7</div>
<div>8</div>
<div>9</div>
</div>
<!--
87
9
-->
<style type="text/css">
#t3{
display: flex;
flex-flow: row-reverse wrap;
}
</style>
justify-content
justify-content
属性定义了成员在主轴上的对齐方式,可以很容易地实现多种布局,取值为flex-start | flex-end | center | space-between | space-around
flex-start
默认值:左对齐
-flex-end
:右对齐center
: 居中对齐
-space-between
:两端对齐,成员之间的间隔都相等。space-around
:每个成员两侧的间隔相等,成员之间的间隔比成员与边框的间隔大一倍。
<div id="t4">
<div>a</div>
<div>b</div>
<div>c</div>
</div>
<!-- abc[水平居中] -->
<style type="text/css">
#t4{
display: flex;
justify-content: center;
}
</style>
align-items
align-items
属性定义成员在交叉轴上如何对齐,取值为flex-start | flex-end | center | baseline | stretch
stretch
默认值:如果成员未设置高度或设为auto
,将占满整个容器的高度。flex-start
:交叉轴的起点对齐。flex-end
:交叉轴的终点对齐。center
:交叉轴的中点对齐。baseline
: 成员的第一行文字的基线对齐。
<div id="t5" style="height: 50px;">
<div>d</div>
<div>e</div>
<div>f</div>
</div>
<!-- def[垂直居中] -->
<style type="text/css">
#t5{
display: flex;
align-items: center;
}
</style>
align-content
align-content
属性定义了多根轴线的对齐方式。如果成员只有一根轴线,该属性不起作用,取值为flex-start | flex-end | center | space-between | space-around | stretch
stretch
默认值:轴线占满整个交叉轴。flex-start
:与交叉轴的起点对齐。flex-end
:与交叉轴的终点对齐。center
:与交叉轴的中点对齐。space-between
:与交叉轴两端对齐,轴线之间的间隔平均分布。space-around
:每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。
<div id="t6" style="height: 50px;width: 20px;">
<div>g</div>
<div>h</div>
<div>i</div>
</div>
<!--
g
hi
[交叉轴space-between]
-->
<style type="text/css">
#t6{
display: flex;
flex-wrap: wrap;
align-content: space-between;
}
</style>
3.成员属性
order
order
属性定义成员的排列顺序,数值越小,排列越靠前,默认为0
<div class="flexBox">
<div style="order: 3;">j</div>
<div style="order: 1;">k</div>
<div style="order: 2;">l</div>
</div>
<!-- klj -->
<style type="text/css">
.flexBox{
display: flex;
}
</style>
flex-grow
flex-grow
属性定义成员的放大比例,默认为0
<div class="flexBox">
<div style="flex-grow: 1;">m</div>
<div style="flex-grow: 2;">n</div>
<div style="flex-grow: 3;">o</div>
</div>
<!-- m n o -->
<style type="text/css">
.flexBox{
display: flex;
}
</style>
flex-shrink
flex-shrink
属性定义了成员的缩小比例,默认为1
,即如果空间不足,该成员将缩小。
<div class="flexBox" style="width: 100px;">
<div style="flex-shrink: 1;width: 100px;">p</div>
<div style="flex-shrink: 2;width: 100px;">q</div>
<div style="flex-shrink: 3;width: 100px;">r</div>
</div>
<!-- p q r -->
<style type="text/css">
.flexBox{
display: flex;
}
</style>
flex-basis
flex-basis
属性定义了在分配多余空间之前,成员占据的主轴空间main size
,浏览器根据这个属性,计算主轴是否有多余空间,它的默认值为auto
,即成员的本来大小。
<div class="flexBox">
<div>s</div>
<div style="flex-basis: 40px;">t</div>
<div>u</div>
</div>
<!-- s t u -->
<style type="text/css">
.flexBox{
display: flex;
}
</style>
flex
flex
属性是flex-grow
, flex-shrink
和flex-basis
的简写,默认值0 1 auto
。后两个属性可选。
<div class="flexBox">
<div style="flex: 1;">v</div>
<div style="flex: 1;">w</div>
<div style="flex: 1;">x</div>
</div>
<!-- v w x -->
<style type="text/css">
.flexBox{
display: flex;
}
</style>
align-self
align-self
属性允许单个成员有与其他成员不一样的对齐方式,可覆盖align-items
属性。默认值为auto
,表示继承父元素的align-items
属性,如果没有父元素,则等同于stretch
。
<div class="flexBox" style="height: 50px;">
<div>y</div>
<div style="align-self: center;">z</div>
<div>0</div>
</div>
<!-- y z 0 -->
<style type="text/css">
.flexBox{
display: flex;
}
</style>
Grid布局
目前CSS
布局方案中,网格布局可以算得上是最强大的布局方案了。它可以将网页分为一个个网格,然后利用这些网格组合做出各种各样的布局。Grid
布局与Flex
布局有一定的相似性,都可以指定容器内部多个成员的位置。不同之处在于,Flex
布局是轴线布局,只能指定成员针对轴线的位置,可以看作是一维布局。Grid
布局则是将容器划分成行和列,产生单元格,然后指定成员所在的单元格,可以看作是二维布局。
1.基础
通过指定display: grid;
指定容器使用Grid
布局,Grid
布局中采用网格布局的区域,称为容器
,容器内部采用网格定位的子元素,称为成员
。容器中水平区域称为行
,垂直区域称为列
,可以将其看作二位数组。划分网格的线就称为网格线
,正常情况下n
行有n + 1
根水平网格线,m
列有m + 1
根垂直网格线。注意当容器设置为Grid
布局以后,容器子元素的float、display: inline-block、display: table-cell、vertical-align和column-*
等设置都将失效。
2.容器属性
grid-template-rows grid-template-columns
grid-template-rows
属性定义每一行的行高,设定为多少行就设置多少个值,取值可以为固定像素,也可以为百分比,grid-template-columns
属性定义每一列的列宽,设定为多少列就设置多少个值,取值可以为固定像素,也可以为百分比
<div id="t1">
<div>0</div>
<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>
<!--
0 1 2
3 4 5
6 7 8
-->
<style type="text/css">
#t1{
display: grid;
grid-template-rows: 30px 30px 30px;
grid-template-columns: 30px 30px 30px;
}
</style>
repeat
repeat()
函数可以简化重复的值,其可以自动重复设定的规则
.container {
display: grid;
grid-template-columns: 33.33% 33.33% 33.33%;
grid-template-rows: 33.33% 33.33% 33.33%;
}
有时候,重复写同样的值非常麻烦,尤其网格很多时。这时,可以使用repeat()函数,简化重复的值。上面的代码用repeat()改写如下。
.container {
display: grid;
grid-template-columns: repeat(3, 33.33%);
grid-template-rows: repeat(3, 33.33%);
}
auto-fill
有时,单元格的大小是固定的,但是容器的大小不确定。如果希望每一行或每一列容纳尽可能多的单元格,这时可以使用auto-fill关键字表示自动填充
,当容器不足容纳成员时会自适应换行。
<div id="t3" style="width: 60px;">
<div>f</div>
<div>g</div>
<div>h</div>
</div>
<!--
f g
h
-->
<style type="text/css">
#t3{
display: grid;
grid-template-columns: repeat(auto-fill,30px);
}
</style>
fr关键字
为表示比例关系,网格布局提供了fr
关键字。如果两列的宽度分别为1fr
和2fr
,就表示后者是前者的两倍。
<div id="t4">
<div>i</div>
<div>j</div>
<div>k</div>
</div>
<!--
i j k
-->
<style type="text/css">
#t4{
display: grid;
grid-template-columns: 1fr 2fr 3fr;
}
</style>
minmax函数
minmax()
函数产生一个长度范围,表示长度就在这个范围之中。它接受两个参数,分别为最小值和最大值,当距离不够时会从最大值自动减少长度或宽度到设定最小值为止。
minmax( [ <length> | <percentage> | min-content | max-content | auto ] , [ <length> | <percentage> | <flex> | min-content | max-content | auto ] )
<div id="t5">
<div>l</div>
<div>m</div>
<div>n</div>
</div>
<!--
l m n
-->
<style type="text/css">
#t5{
display: grid;
grid-template-columns: 30px minmax(30px,100px) 30px;
}
</style>
auto关键字
auto
关键字表示由浏览器自己决定长度,基本上等于该列单元格的最大宽度,除非单元格内容设置了min-width
,且这个值大于最大宽度。
<div id="t6">
<div>o</div>
<div>p</div>
<div>q</div>
</div>
<!--
o p q
-->
<style type="text/css">
#t6{
display: grid;
grid-template-columns: 10px auto 30px;
}
</style>
grid-row-gap / grid-column-gap/ grid-gap
grid-row-gap
属性设置行与行的间隔,即行间距
grid-column-gap
属性设置列与列的间隔,即列间距
grid-gap
属性是grid-column-gap
和grid-row-gap
的合并简写形式,如果grid-gap
省略了第二个值,浏览器认为第二个值等于第一个值
<div id="t7">
<div>r</div>
<div>s</div>
<div>t</div>
</div>
<!--
r
s
t
-->
<style type="text/css">
#t7{
display: grid;
grid-template-rows: 30px 30px 30px;
grid-row-gap: 10px;
}
</style>
grid-template-areas
网格布局允许指定区域area
,一个区域由单个或多个单元格组成,grid-template-areas
属性用于定义区域。区域的命名会影响到网格线。每个区域的起始网格线,会自动命名为{areaName}-start
,终止网格线自动命名为{areaName}-end
<div id="t10">
<div>B</div>
<div>C</div>
<div>D</div>
<div>E</div>
</div>
<!--
B C
D E
-->
<style type="text/css">
#t10{
display: grid;
grid-template-columns: repeat(2,30px);
grid-template-rows: repeat(2,30px);
/* 先划分出4个单元格,然后将其定名为a到d的4个区域,分别对应这4个单元格。*/
grid-template-areas: 'a b' 'c d';
}
</style>
grid-auto-flow
划分网格以后,容器的子元素会按照顺序,自动放置在每一个网格。默认的放置顺序是先行后列,通过设置grid-auto-flow
可以更改为先列后行,grid-auto-flow
属性除了设置成row
和column
,还可以设成row dense
和column dense
,这两个值主要用于某些项目指定位置以后,剩下的项目怎么自动放置。
<div id="t11">
<div>F</div>
<div>G</div>
<div>H</div>
<div>I</div>
</div>
<!--
F H
G I
-->
<style type="text/css">
#t11{
display: grid;
grid-template-columns: repeat(2,30px);
grid-template-rows: repeat(2,30px);
grid-auto-flow: column;
}
</style>
justify-items / align-items / place-items
justify-items
属性设置成员中内容的水平位置,取值为start | end | center | stretch
align-items
属性设置成员中内容的垂直位置,取值为start | end | center | stretch
place-items
属性是align-items
属性和justify-items
属性的合并简写形式,如果省略第二个值,则浏览器认为与第一个值相等。
stretch
默认值:拉伸,占满单元格的整个宽度。start
:对齐单元格的起始边缘。end
:对齐单元格的结束边缘。center
:单元格内部居中。
<div id="t12">
<div>J</div>
</div>
<!--
J
-->
<style type="text/css">
#t12{
display: grid;
justify-items: center;
}
</style>
justify-content / align-content / place-content
justify-content
属性是整个内容区域在容器里面的水平位置,也就是成员的水平分布,取值为start | end | center | stretch | space-around | space-between | space-evenly
align-content
属性是整个内容区域在容器里面的垂直位置,也就是成员的垂直分布,取值为start | end | center | stretch | space-around | space-between | space-evenly
place-content
属性是align-content
属性和justify-content
属性的合并简写形式,如果省略第二个值,则浏览器认为与第一个值相等。
<div id="t15">
<div>M</div>
<div>N</div>
</div>
<!--
M N
-->
<style type="text/css">
#t15{
display: grid;
grid-template-columns: repeat(2,30px);
justify-content: space-around;
}
</style>
space-around
- 每个项目两侧的间隔相等。所以,项目之间的间隔比项目与容器边框的间隔大一倍。space-between
- 项目与项目的间隔相等,项目与容器边框之间没有间隔。space-evenly
- 项目与项目的间隔相等,项目与容器边框之间也是同样长度的间隔。
grid-auto-columns grid-auto-rows
有时候,一些项目的指定位置,在现有网格的外部。比如网格只有3行,但是某一个项目指定在第5行。这时,浏览器会自动生成多余的网格,以便放置项目。grid-auto-columns
属性和grid-auto-rows
属性用来设置,浏览器自动创建的多余网格的列宽和行高。它们的写法与grid-template-columns
和grid-template-rows
完全相同。如果不指定这两个属性,浏览器完全根据单元格内容的大小,决定新增网格的列宽和行高。
<div id="t18">
<div style="grid-row-start: 2;grid-column-start: 2;">S</div>
</div>
<!--
S
-->
<style type="text/css">
#t18{
display: grid;
grid-template-columns: repeat(1,30px);
grid-template-rows: repeat(1,30px);
grid-auto-rows: 100px;
grid-auto-columns: 100px;
}
</style>
3.项目属性
grid-column-start / grid-column-end
·grid-column-start·属性指定左边框所在的垂直网格线,·grid-column-end·属性指定右边框所在的垂直网格线
<div class="gridBox">
<div style="grid-row-start: 2;grid-column-start: 2;">T</div>
</div>
<!--
T
-->
<style type="text/css">
.gridBox{
display: grid;
grid-template-columns: repeat(2,30px);
grid-template-rows: repeat(2,30px);
}
</style>
grid-row-start / grid-row-end
grid-row-start
属性指定上边框所在的水平网格线,grid-row-end
属性指定下边框所在的水平网格线
<div class="gridBox">
<div style="grid-row-start: 2;">U</div>
</div>
<!--
U
-->
<style type="text/css">
.gridBox{
display: grid;
grid-template-columns: repeat(2,30px);
grid-template-rows: repeat(2,30px);
}
</style>
还可以给轴线命名来指定位置
<div class="gridBox" style="">
<div style="grid-column-start: c2;grid-row-start: r2;">V</div>
</div>
<!--
V
-->
<style type="text/css">
.gridBox{
display: grid;
grid-template-columns:[c1] 30px [c2] 30px [c3]; /* 指定列并为轴线命名 */
grid-template-rows:[r1] 30px [r2] 30px [r3]; /* 指定行并为轴线命名 */
}
</style>
grid-column / grid-row
grid-column
属性是grid-column-start
和grid-column-end
的合并简写形式,grid-row
属性是grid-row-start
属性和grid-row-end
的合并简写形式。
<div class="gridBox">
<div style="grid-column: 2 / 3;grid-row: 2 / 3;">W</div>
</div>
<!--
W
-->
<style type="text/css">
.gridBox{
display: grid;
grid-template-columns: repeat(2,30px);
grid-template-rows: repeat(2,30px);
}
</style>
grid-area
grid-area
属性指定项目放在grid-template-areas
指定的区域,还可用作grid-row-start、grid-column-start、grid-row-end、grid-column-end
的合并简写形式,直接指定项目的位置。
<div class="gridBox" style="grid-template-areas: 'a b' 'c d';">
<div style="grid-area: b;">X</div>
<div style="grid-area: 2 / 2 / 3 / 3;">Y</div>
</div>
<!--
X
Y
-->
<style type="text/css">
.gridBox{
display: grid;
grid-template-columns: repeat(2,30px);
grid-template-rows: repeat(2,30px);
}
</style>
justify-self / align-self / place-self
justify-self
属性设置单元格内容的水平位置,跟justify-items
属性的用法完全一致,但只作用于单个项目,取值为start | end | center | stretch;
。
align-self
属性设置单元格内容的垂直位置,跟align-items
属性的用法完全一致,也是只作用于单个项目,取值为start | end | center | stretch;
。
stretch
默认值:拉伸,占满单元格的整个宽度。start
:对齐单元格的起始边缘。end
:对齐单元格的结束边缘。center
:单元格内部居中。place-self
属性是align-self
属性和justify-self
属性的合并简写形式。
<div class="gridBox">
<div style="place-self: center end;">Z</div>
</div>
<!--
Z
-->
<style type="text/css">
.gridBox{
display: grid;
grid-template-columns: repeat(2,30px);
grid-template-rows: repeat(2,30px);
}
</style>
Table布局
<table>
最常用的使用方法是制作表格,由于其对占据的空间有着划分的作用,便可以使用<table>
来布局。
实例
实现一个简单的布局,将表格的border
、cellpadding
、cellspacing
全部设置为0
,表格的边框和间距就不占有页面空间,它只起到划分空间的作用,如果布局复杂,可以在单元格中再嵌套表格,单元格中的元素或者嵌套的表格用align
和valign
设置对齐方式。要注意的是,在HTML5标准中,<table>
的align
、bgcolor
、cellpadding
、cellspacing
、frame
、rules
、summary
、width
属性皆已不再支持,由CSS设置相关属性来呈现效果。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>TABLE布局</title>
</head>
<body>
<table border="0" style="width: 100%;">
<tr>
<td style="width: 200px;">导航栏</td>
<td>内容</th>
</tr>
</table>
</body>
</html>
问题
使用<table>
来布局绝对不是一个好的解决方案,对于布局方案首选Flex
布局,稍微复杂的布局可以选择Grid
布局方案,<table>
本身是为呈现表格化的数据而设计的,如果使用<table>
来呈现数据表格是完全没有问题的。
<table>
要比其它html标记占更多的字节,代码的复杂度会大大提升。<table>
会阻塞浏览器渲染引擎的渲染顺序,<table>
是整体载入后才开始显示的,没有加载完毕前,<table>
为一片空白,而<div>
等标签可以逐行渲染,一边加载一边显示。<table
>经常需要多个关口,因为<table>
可以影响在它们之前已经进入的DOM
元素的显示的元素。假设因为表格最后一个单元格的内容过宽而导致纵列大小完全改变,这会造成浏览器的回流从而引发渲染性能问题。<table>
里显示图片时有可能需要你把单个、有逻辑性的图片切成多个图,这个主要看需求,<table>
中进行单元格合并操作也是可行的方案。<table>
会影响其单元格内部的某些布局属性的生效。<table>
的各种属性逐渐不受支持,需要使用CSS
控制显示相应效果。<table>
的语义是数据表格,使用<table>
来布局不利于SEO
。- 若布局较为复杂,则可能造成多层
<table>
嵌套,代码嵌套过多表现的过于复杂。
display
倘若需要类似于表格的布局,可以使用display: table;
来呈现,display
的table
属性值只是声明了某些元素在浏览器中的样式,其并不包含语义,他的属性基本能够对应<table>
系列标签,并且还能将缺少的表格元素会被浏览器以匿名方式创建,CSS2.1
规范中写道:CSS2.1
表格模型中的元素,可能不会全部包含在除HTML
之外的文档语言中。这时,那些“丢失”的元素会被模拟出来,从而使得表格模型能够正常工作。所有的表格元素将会自动在自身周围生成所需的匿名table
对象,使其符合table/inline-table、table-row、table-cel
l的三层嵌套关系。
table
类似<table>
:此元素会作为块级表格来显示,表格前后带有换行符。inline-table
类似<table>
:此元素会作为内联表格来显示,表格前后没有换行符。table-header-group
类似<thead>
:此元素会作为一个或多个行的分组来显示。table-footer-group
类似<tfoot>
:此元素会作为一个或多个行的分组来显示。table-row
类似<tr>
:此元素会作为一个表格行显示。table-row-group
类似<tbody>
:此元素会作为一个或多个行的分组来显示。table-column
类似<col>
:此元素会作为一个单元格列显示。table-column-group
类似<colgroup>
:此元素会作为一个或多个列的分组来显示。table-cell
类似<td>
和<th>
:此元素会作为一个表格单元格显示。table-caption
类似<caption>
:此元素会作为一个表格标题显示。
布局垂直居中
首先将<html>
与<body>
的高度设置为100%
(为演示父元素不定宽高的效果),并清除<body>
的默认样式
html,body{
margin: 0;
height: 100%;
}
垂直居中大致分为两类,父元素定宽高与父元素不定宽高,将两类样式以及子容器设定好
.set-parent,.dy-parent{
width: 300px;
height: 200px;
background: #eee;
margin: 10px 0;
}
.child{
width: 20px;
height: 10px;
background: #fff;
}
.dy-parent{
width: 30%;
height: 20%;
}
1. 父元素定宽高 position + margin
使用margin: auto
使水平居中,将子容器设定为relative
以在不脱离文档流的情况下偏移50%
,由于本身子容器占用一定宽高,会将其撑下,使用margin
使其向上偏移。
若是子容器使用absolute
定位,则父容器应设置为relative
,否则会其相对于static
定位以外的第一个父元素进行定位,在本Demo中会以浏览器为基准定位;此外absolute
无法使用margin: auto
水平居中。
<!-- 父元素定宽高 position+margin -->
<div class="set-parent" >
<div class="child" style="position: relative;top: 50%;margin: auto;margin-top: -5px;"></div>
</div>
2. 父元素定宽高 position + transform
原理与position
+margin
相同,CSS3的transform
使得div
向上平移自身高度的50%
。
<div class="set-parent" >
<div class="child" style="position: relative;top: 50%;margin: auto;transform: translateY(-50%);"></div>
</div>
3. 父元素定宽高 position + calc
css3提供calc
函数,能够进行动态计算
<div class="set-parent" >
<div class="child" style="position: relative;top: calc(50% - 5px);left: calc(50% - 10px);"></div>
</div>
4. 父元素不定宽高 flex
flex
布局可以说是布局神器,极其强大,现在大部分浏览器都兼容性flex
布局
<div class="dy-parent" style="display: flex;justify-content: center;align-items: center;">
<div class="child" ></div>
</div>
5. 父元素不定宽高 grid
Grid
布局将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局
Grid
布局与Flex
布局有一定的相似性,都可以指定容器内部多个项目的位置。但是,它们也存在重大区别。
Flex
布局是轴线布局,只能指定"项目"针对轴线的位置,可以看作是一维布局。Grid
布局则是将容器划分成"行"和"列",产生单元格,然后指定"项目所在"的单元格,可以看作是二维布局。Grid
布局远比Flex
布局强大。
<div class="dy-parent" style="display: grid;justify-content: center;align-content: center;">
<div class="child" ></div>
</div>
6. 父元素不定宽高 table
table
中有vertical-align
属性设置垂直对齐方式
<div class="dy-parent" style="display: table;">
<div style="display: table-cell;vertical-align: middle;">
<div class="child" style="margin: auto;" ></div>
</div>
</div>
响应式布局
响应式布局指的是同一页面在不同屏幕尺寸或者在不同的设备下有不同的布局,能够在大屏设备以及小屏设备获得更好的浏览体验,简单来说就是页面适应终端而无需为每个终端制作单独的页面。
1.媒体查询
通过使用CSS媒体查询来实现响应式布局,针对不同的媒体类型设置不同的样式规则,可以根据视窗、设备高度与宽度、设备方向、分辨率等进行不同CSS适配。
使用link链接
<!--<link rel="stylesheet" media="mediatype and|not|only (media feature)" href="example.css">-->
<link rel="stylesheet" type="text/css" href="example.css" media="all and (max-width:600px)"/>
直接在CSS中使用
<!--
@media mediatype and|not|only (media feature){
/* css样式 */
}
-->
<div id="t1"></div>
<style type="text/css">
@media screen and (min-width:600px){
#t1{
height: 100px;
width: 100px;
border: 1px solid #eee;
background: red;
transition: all .5s;
}
}
@media screen and (max-width:600px) {
#t1{
height: 100px;
width: 100px;
border: 1px solid #eee;
background: yellow;
transition: all .5s;
}
}
</style>
使用@import导入
/* @import url("example.css") mediatype and|not|only (media feature); */
@import url("example.css") all and (max-width:600px);
媒体类型
- all: 用于所有设备。
- print: 用于打印机和打印预览。
- screen: 用于电脑屏幕,平板电脑,智能手机等。
- speech: 应用于屏幕阅读器等发声设备。
逻辑操作符
- and: 表示且,当所有的条件满足的时候返回true。
- not: 是用来排除某种制定的媒体类型。
- only: 用来指定某种特定的媒体类型,可以用来排除不支持媒体查询的浏览器。
- ,: 逗号用于将多个媒体查询合并为一个规则,逗号分隔效果等同于or逻辑操作符。
媒体功能
- aspect-ratio: 定义输出设备中的页面可见区域宽度与高度的比率。
- color: 定义输出设备每一组彩色原件的个数。如果不是彩色设备,则值等于0。
- color-index: 定义在输出设备的彩色查询表中的条目数,如果没有使用彩色查询表,则值等于0。
- device-aspect-ratio: 定义输出设备的屏幕可见宽度与高度的比率。
- device-height: 定义输出设备的屏幕可见高度。
- device-width: 定义输出设备的屏幕可见宽度。
- grid: 用来查询输出设备是否使用栅格或点阵。
- height: 定义输出设备中的页面可见区域高度。
- max-aspect-ratio: 定义输出设备的屏幕可见宽度与高度的最大比率。
- max-color: 定义输出设备每一组彩色原件的最大个数。
- max-color-index: 定义在输出设备的彩色查询表中的最大条目数。
- max-device-aspect-ratio: 定义输出设备的屏幕可见宽度与高度的最大比率。
- max-device-height: 定义输出设备的屏幕可见的最大高度。
- max-device-width: 定义输出设备的屏幕最大可见宽度。
- max-height: 定义输出设备中的页面最大可见区域高度。
- max-monochrome: 定义在一个单色框架缓冲区中每像素包含的最大单色原件个数。
- max-resolution: 定义设备的最大分辨率。
- max-width: 定义输出设备中的页面最大可见区域宽度。
- min-aspect-ratio: 定义输出设备中的页面可见区域宽度与高度的最小比率。
- min-color: 定义输出设备每一组彩色原件的最小个数。
- min-color-index: 定义在输出设备的彩色查询表中的最小条目数。
- min-device-aspect-ratio: 定义输出设备的屏幕可见宽度与高度的最小比率。
- min-device-width: 定义输出设备的屏幕最小可见宽度。
- min-device-height: 定义输出设备的屏幕的最小可见高度。
- min-height: 定义输出设备中的页面最小可见区域高度。
- min-monochrome: 定义在一个单色框架缓冲区中每像素包含的最小单色原件个数
- min-resolution: 定义设备的最小分辨率。
- min-width: 定义输出设备中的页面最小可见区域宽度。
- monochrome: 定义在一个单色框架缓冲区中每像素包含的单色原件个数。如果不是单色设备,则值等于0。
- orientation: 定义输出设备中的页面可见区域高度是否大于或等于宽度。
- resolution: 定义设备的分辨率。
- scan: 定义电视类设备的扫描工序。
- width: 定义输出设备中的页面可见区域宽度。
2.单位
百分比单位
当度量单位设置为百分比时,即可使浏览器组件宽高随着浏览器的大小相应变化。
- 子元素的height或width中使用百分比,是相对于子元素的直接父元素,width相对于父元素的width,height相对于父元素的height。
- 子元素的top和bottom如果设置百分比,则相对于直接非static定位的父元素的高度,同样子元素的left和right如果设置百分比,则相对于直接非static定位父元素的宽度。
- 子元素的padding如果设置百分比,不论是垂直方向或者是水平方向,都相对于直接父亲元素的width,而与父元素的height无关。
- 子元素的margin如果设置成百分比,不论是垂直方向还是水平方向,都相对于直接父元素的width。
- 设置border-radius为百分比,则是相对于自身的宽度,还有translate、background-size等都是相对于自身的。
em单位
em是相对长度单位,相对于当前对象内文本的字体尺寸,若未设置则相对于浏览器默认字体尺寸16px,em是会继承父元素的字体的尺寸,使用时需要重新计算子元素的em值避免1.2*1.2=1.44的现象,使用em可以使元素根据字体大小的动态调整来制作响应式布局。
rem单位
rem单位都是相对于根元素html的font-size来决定大小的,根元素的font-size相当于提供了一个基准,当页面的size发生变化时,只需要改变font-size的值,那么以rem为固定单位的元素的大小也会发生相应的变化。因此,如果通过rem来实现响应式的布局,只需要根据视图容器的大小,动态的改变根元素的font-size即可。
vh vw vmin vmax
- vh: 相对于视窗的高度,1vh等于视窗高度的1%。
- vw: 相对于视窗的宽度,1vw等于视窗宽度的1%。
- vmin: vw和vh中的较小值。
- vmax: vw和vh中的较大值。
缩放比例
通过动态地控制网页视图的缩放比例来制作响应式布局。
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0" />
自适应布局
自适应布局一般是通过检测User-Agent
来判断当前访问的设备是PC端还是平板或者是手机,或者是通过检测窗口分辨率而请求服务器,从而服务端重定向或者返回不同的页面,需要开发多个页面来适应不同的设备,通常自适应布局与响应式布局并不是单独使用的,可以通过开发一套PC端页面与一套移动端页面来实现自适应布局,而两套页面都实现对于不同范围分辨率的响应式布局,可以避免过大的CSS样式表又可以获得较好的浏览体验,
box-sizing属性
box-sizing
是用于告诉浏览器如何计算一个元素是总宽度和总高度
- 对于给定
width
和height
的元素,设置box-sizing
属性会影响盒子content width
和content height
。 - 浏览器默认使用标准盒子模型,即
box-sizing: content-box
, 就是我们所写的宽度和高度就是对content
进行设置的。 - 在一些响应式布局中,我们修改了浏览器计算元素宽度、高度的方式,认为元素的宽度和高度是包括内边距
padding
和边框border