css3之坑
填坑1:
块级元素、行内元素、行内块元素的特点
块级元素特点
- 总是从新行开始
- 高度、行高、外边距以及内边距都可以控制
- 宽度默认是容器的100%
- 可以容纳内联元素和其他块元素
行内元素特点:
- 和相邻行内元素在一行上
- 宽、高无效,但水平方向的padding和margin可以设置,垂直方向的无效
- 默认宽度就是它本身内容的宽度
- 行内元素只能容纳文本或其他行内元素
- 在行内元素中有几个特殊的标签
<img/>
、input/>
、<td>
,可以对它们设置宽高和对齐属性
行内块元素特点:
- 和相邻行内元素在一行上,但是之间会有空白缝隙
- 默认宽度就是它本身内容的宽度
- 高度、行高、外边距以及内边距都可以控制
填坑2:
css3优先级总结
- 使用了!important声明的规则
- 内嵌在HTML元素的style属性里面的声明
- 使用了id选择器的规则
- 使用了类选择器、属性选择器、伪元素和伪类选择器的规则
- 使用了元素选择器的规则
- 只包含一个通用选择器的规则
- 同一类选择器遵循就近原则
总结:权重是优先级的算法,层叠是优先级的表现
填坑3:
在一行内的盒子内,设定行高等于盒子的高度,就可以使文字垂直居中(只有一行文字)
填坑4:
外边距实现盒子居中对齐
可以让一个盒子水平居中,需要满足以下两个条件:
- 必须是块级元素
- 盒子必须指定宽度
给左右外边距都设置auto
,就可以使块级元素水平居中
实际工作中,常用这种方式进行网页布局,示例代码如下:
.header {
width: 960px;
margin: 0 auto;
}
填坑5:
行内元素只有左右内外边距,没有上下外边距。内边距在ie6等低版本浏览器也会有问题。
总结:我们尽量不要给行内元素指定上下内外边距。
填坑6:
外边距合并
相邻块元素垂直外边距的合并
当上下相邻的两个块元素相遇时,如果上面的元素有下外边距margin-bottom,下面的元素有上外边距margin-top,则它们的垂直间距不是margin-bottom与margin-top之和,而是两者中的较大者。这种现象被称为相邻块元素垂直外边距的合并(也称外边距塌陷)
解决方案:避免就好了(只给一个块元素指定外边距)
嵌套块元素垂直外边距的合并
对于两个嵌套关系的块元素,如果父元素没有上内边距及边框,则父元素的上外边距会与子元素的上外边距发生合并,合并后的外边距为两者中的较大者,即使父元素的上外边距为0,也会发生合并。
解决方案:
- 可以为父元素定义1px的上边框或上内边距
- 可以为父元素添加
overflow: hidden
填坑7:
内容宽度和高度
使用宽度属性width和高度属性height可以对盒子的大小进行控制
width和height的属性值可以为不同的数值或相对于父元素的百分比,实际工作中最常用的是像素值
大多数浏览器,如Firefox、IE6及以上版本都采用了W3C规定,符合CSS规范的盒子模型的总宽度和总高度的计算原则是:
/*外盒尺寸计算(元素空间尺寸)*/
Element空间高度=content height + padding + boder + margin;
Element空间宽度=content width + padding + boder + margin;
/*内盒尺寸计算(元素实际尺寸)*/
Element实际高度=content height + padding + boder;
Element实际宽度=content width + padding + boder;
注意:
-
宽度属性width和高度属性height仅适用于块级元素,对于行内元素无效(img和input除外)
-
计算盒子模型的总高度时,还应考虑上下两个盒子垂直外边距合并的情况
-
如果一个盒子没有指定宽度/高度或者继承父亲的宽度/高度,则padding不会影响本盒子的大小
填坑8:
盒子模型布局稳定性
开始学习盒子模型,同学们最大的困惑就是,分不清内外边距的使用,什么情况下使用内边距,什么情况下使用外边距?
答案是,其实它们大部分情况下是可以混用的,就是说,你用内边距也可以,用外边距也可以,你觉得哪个方便,就用哪个。
但是总有一个最好用的吧,我们根据稳定性来分,建议如下:
按照优先使用宽度(width)、其次使用内边距(padding)、再次外边距(margin)
width>padding>margin
原因:
- margin会有外边距合并,还有IE6下面margin加倍的bug(讨厌)所以最后使用
- padding会影响盒子的大小,需要进行加减计算(麻烦)其次使用(不指定盒子宽度,padding不影响本身盒子的大小)
- width没有问题(嗨皮)我们经常使用宽度剩余法、高度剩余法来做
填坑9:
清除浮动的本质
清除浮动主要是为了解决父元素因为子元素浮动引起父元素内部高度为0的问题(不指定父元素高度,由子元素内容撑开盒子)
填坑10:
清除浮动的方法
其实本质叫做闭合浮动更好一些,记住,清除浮动就是把浮动的盒子圈到里面,让父盒子闭合出口和入口不让它们出来影响其他元素。
在CSS中,clear属性用于清除浮动,其基本语法格式如下:
选择器{clear:属性值};
属性值 | 描述 |
---|---|
left | 不允许左侧有浮动元素(清除左侧浮动的影响) |
right | 不允许右侧有浮动元素(清除右侧浮动的影响) |
both | 同时清除左右两侧浮动的影响 |
1.额外标签法
W3C推荐的做法是通过在浮动元素末尾添加一个空的标签,例如<div style="clear:both"></div>
,或者其他标签<br/>
等亦可。
优点:通俗易懂,书写方便
缺点:添加许多无意义的标签,结构化较差
2.父级添加overflow属性方法
通过触发BFC的方式,可以实现清除浮动的效果。
可以给父级添加overflow:hidden|auto|scroll都可以实现
优点:代码简介
缺点:内容增多时候容易造成不会自动换行导致内容被隐藏掉,无法显示需要溢出的元素
3.使用after伪元素清除浮动
::after方式为空元素的升级版。好像是不用单独添加标签了
使用方法:
.clearfix:after {
content: ".";
display: block;
height: 0;
visibility: hidden;
clear: both;
}
.clearfix {
*zoom: 1; /* IE6、7专用*/
}
优点:符合闭合浮动思想,结构语义化正确
缺点:由于IE6-7不支持after,使用zoom:1触发hasLayout
代表网站:百度、网易、淘宝等
注意:content:"."里面尽量跟一个小点,或者其他量不要为空,否则在firefox7.0前的版本会生成空格
4.使用before和after双伪元素清除浮动
使用方法:
.clearfix:before, .clearfix:after {
content: "";
display: table;
}
.clearfix:after{
clear: both;
}
.clearfix {
*zoom: 1;
}
优点:代码更简洁
缺点:由于IE6-7不支持:after,使用zoom:1触发hasLayout
代表网站:小米、腾讯等
填坑11
定位(position)
如果说浮动关键在一个“浮”字上面,那么我们的定位关键在于一个“位”上。
1.为什么要用定位?
那么定位最常用的场景在哪里呢?来看几幅图片。你一定会有感悟!
第一幅图,小黄色块可以在图片上移动:
第二幅图,左右箭头压住图片:
第三幅图,hot在盒子外面多出一块,更加突出:
以上三个小地方,如果用标准流或者浮动,实现会比较复杂或者难以实现,此时我们用定位来做,just soso!
2.元素的定位属性
元素的定位属性主要包括定位模式和边偏移两部分。
1.边偏移
边偏移属性 | 描述 |
---|---|
top | 顶端偏移量,定义元素相对于其父元素上边线的距离 |
bottom | 底部偏移量,定义元素相对于其父元素下边线的距离 |
left | 左侧偏移量,定义元素相对于其父元素左边线的距离 |
right | 右侧偏移量,定义元素相对于其父元素右边线的距离 |
也就说,以后定位要和这偏移量搭配使用了,比如:top:100px;left:30px;等等
2.定位模式
在CSS中,position属性用于定位元素的定位模式,其基本语法格式如下:
选择器{position:属性值;}
position属性的常用值
值 | 描述 |
---|---|
static | 自动定位(默认定位方式) |
relative | 相对定位,相对于其原文档流的位置进行定位 |
absolute | 绝对定位,相对于其上一个已经定位的父元素进行定位 |
fixed | 固定定位,相对于浏览器窗口进行定位 |
静态定位(static)
静态定位是所有元素的默认定位方式,当position属性的取值为static时,可以将元素定位于静态位置,所以静态位置就是各个元素在HTML文档流中默认的位置。
上面的话翻译成白话,就是网页中所有元素都默认的是静态定位哦!其实就是标准流的特性。
在静态定位状态下,无法通过边偏移属性(top、bottom、left或right)来改变元素的位置。
PS:静态定位其实没啥可说的
相对定位(relative)自恋型(占有位置,不脱标)
小笑话:
刚刚看到一个超级超级帅的帅哥,看得我都忍不住想和他搞基了。世间怎会有如此之完美的男人,我和他就这样一动不动的对视着,就仿佛一见钟情。时间也在这一瞬间停止了。直到我的手麻了,才恋恋不舍的放下镜子......'
相对定位是将元素相对于它在标准流的位置进行定位,当position属性的取值为relative时,可以将元素定位于相对位置。
对元素设置相对定位后,可以通过边偏移属性改变元素的位置,但是它在文档流的位置仍然保留。如下图所示,即是一个相对定位的效果展示:
注意:
- 相对定位最重要的一点是,它可以通过边偏移移动位置,但是原来的所占的位置,继续占有。
- 其次,每次移动的位置,是以自己的左上角为基点移动(相对于自己来移动位置)
就是说,相对定位的盒子仍在标准流中,它后面的盒子仍以标准流方式对待它。(相对定位不脱标)
如果说浮动的主要目的是让多个块级元素在一行显示,那么定位的主要价值就是移动位置,让盒子到我们想要的位置上去。
绝对定位(absolute)拼爹型(不占有位置,完全脱标)
小笑话:
吃早饭时,老婆往儿子碗里放了两个煎蛋,儿子全给了我,还一本正经地说:“爸爸,多吃点,男人养家不容易。”我一阵感动,刚想夸他两句。儿子接着说:“以后全靠你让我拼爹了!”
[注意]如果文档可以滚动,绝对定位元素随着它滚动,因为元素最终会相对于正常流的某一部分定位。
当position属性的取值为absolute时,可以将元素的定位模式设置为绝对定位。
注意:绝对定位最重要的一点是,它可以通过边偏移移动位置,但是它完全脱标,完全不占位置。
父级没有定位
若所有父元素都没有定位,则以浏览器为准对齐(document文档)
父级有定位
绝对定位是将元素依据最近的已经定位(绝对、固定或相对定位)的元素(祖先)进行定位。
子绝父相
这个“子绝父相”太重要了,是我们学习定位的口诀,时时刻刻记住的。
这句话的意思是子级是绝对定位的话,父级要用相对定位。
首先,我们说下,绝对定位是将元素依据最近的已经定位绝对、固定或相对定位的父元素(祖先)进行定位。
就是说,子级是绝对定位,父亲只要是定位即可(不管父亲是绝对定位还是相对定位,甚至是固定定位都可以),就是说,子绝父绝,子绝父相都是正确的。
但是,在我们网页布局的时候,最常说的子绝父相是怎么来的呢?请看下图:
所以,我们可以得出如下结论:
因为子级是绝对定位,不会占有位置,可以放到父盒子里面的任何一个地方。
父盒子布局时,需要占有位置,因此父亲只能是相对定位。
这就是子绝父相的由来。
绝对定位的盒子水平/垂直居中
普通的盒子是左右margin改为auto就可以垂直居中,但是对于绝对定位就无效了
定位的盒子也可以水平或者垂直居中,有一个算法。
- 首先left50%(父级盒子一半的大小)
- 然后走自己外边距负的一半值就可以了(margin-left)
固定定位(fixed)认死理型
固定定位是绝对定位的一种特殊形式,它以浏览器窗口作为参照来定义网页元素。当position属性的取值为fixed时,即可将元素的定位模式设置为固定定位。
当元素设置固定定位后,它将脱离文档流的控制,始终依据浏览器窗口来定义自己的显示位置,不管浏览器滚动条如何滚动也不管浏览器窗口的大小如何变化,该元素都会始终显示在浏览器窗口的固定位位置。
总结:
- 固定定位的元素跟父亲没有任何关系,只认浏览器
- 固定定位完全脱标,不占有位置,不随着滚动条滚动
- 固定定位的盒子一定要写宽和高,除非有内容撑开不用写
记忆法:类似于孙猴子,无父无母,好不容易找到一个可靠的师傅(浏览器),就听师傅的,别的不听。
IE6等比版本浏览器不支持固定定位
叠放次序(z-index)
当对多个元素同时设置定位时,定位元素之间有可能发生重叠
在CSS中,要想调整重叠定位元素的堆叠顺序,可以对定位元素应用z_index层叠等级属性,其取值可为正整数、负整数和0
比如:z-index:2;
注意:
- z-index的默认属性值是0,取值越大,定位元素在层叠元素中越居上
- 如果取值相同,则根据书写顺序,后来者居上
- 后面数字一定不能加单位
- 只有相对定位、绝对定位和固定定位有此属性,其余标准流、浮动、静态定位都无此属性,亦不可指定此属性
四种定位总结:
定位模式 | 是否脱标占有位置 | 是否可以使用边偏移 | 移动位置基准 |
---|---|---|---|
static | 不脱标,正常模式 | 不可以 | 正常模式 |
relative | 不脱标,占有位置 | 可以 | 相对自身位置移动 |
absolute | 完全脱标,不占有位置 | 可以 | 相对于定位父级移动位置 |
fixed | 完全脱标,不占有位置 | 可以 | 相对于浏览器移动位置 |
填坑12
定位模式转换
跟浮动一样,元素添加了绝对定位和固定定位之后,元素模式也会发生转换,都转换为行内块元素
行内元素如果添加了绝对定位、固定定位或者浮动后,不用转换模式,直接给高度和宽度就可以了
填坑13
元素的显示与隐藏
在CSS中有三个显示和隐藏的单词比较常见,我们要区分开,它们分别是display、visibility和overflow
它们的主要目的是让一个元素在页面中消失,但是不在文档源码中删除。最常见的网站广告,当我们点击类似关闭不见了,但是我们重新刷新页面,它们又会出现和你玩躲猫猫!
display显示
display 设置或检索对象是否以及如何显示
display:none隐藏对象与它相反的是display:block除了转换为块级元素之外,同时还有显示元素的意思
特点:隐藏之后,不再保留位置
visibility 可见性
设置或检索是否显示对象
visible: 对象可视
hidden: 对象隐藏
特点:隐藏之后,继续保留原有位置
overflow 溢出
检索或设置当对象超过其指定高度及宽度时如何管理内容
visible:不剪切内容也不添加滚动条
auto:超出自动显示滚动条,不超出不显示滚动条
hidden:不显示超过对象尺寸的内容,超出的部分隐藏掉
scroll:不管超出内容与否,总是显示滚动条
┆ 凉 ┆ 暖 ┆ 降 ┆ 等 ┆ 幸 ┆ 我 ┆ 我 ┆ 里 ┆ 将 ┆ ┆ 可 ┆ 有 ┆ 谦 ┆ 戮 ┆ 那 ┆ ┆ 大 ┆ ┆ 始 ┆ 然 ┆
┆ 薄 ┆ 一 ┆ 临 ┆ 你 ┆ 的 ┆ 还 ┆ 没 ┆ ┆ 来 ┆ ┆ 是 ┆ 来 ┆ 逊 ┆ 没 ┆ 些 ┆ ┆ 雁 ┆ ┆ 终 ┆ 而 ┆
┆ ┆ 暖 ┆ ┆ 如 ┆ 地 ┆ 站 ┆ 有 ┆ ┆ 也 ┆ ┆ 我 ┆ ┆ 的 ┆ 有 ┆ 精 ┆ ┆ 也 ┆ ┆ 没 ┆ 你 ┆
┆ ┆ 这 ┆ ┆ 试 ┆ 方 ┆ 在 ┆ 逃 ┆ ┆ 会 ┆ ┆ 在 ┆ ┆ 清 ┆ 来 ┆ 准 ┆ ┆ 没 ┆ ┆ 有 ┆ 没 ┆
┆ ┆ 生 ┆ ┆ 探 ┆ ┆ 最 ┆ 避 ┆ ┆ 在 ┆ ┆ 这 ┆ ┆ 晨 ┆ ┆ 的 ┆ ┆ 有 ┆ ┆ 来 ┆ 有 ┆
┆ ┆ 之 ┆ ┆ 般 ┆ ┆ 不 ┆ ┆ ┆ 这 ┆ ┆ 里 ┆ ┆ 没 ┆ ┆ 杀 ┆ ┆ 来 ┆ ┆ ┆ 来 ┆