一、HTML
请求的资源类型不同
浏览器解析方式不同
二、CSS
盒子的总宽度=width+左右padding+左右border之和+左右margin之和
盒子的总高度=height+上下padding之和+上下border之和+上下margin之和
box-sizing:content-box(默认) 即标准盒子模式
box-sizing:border-box 是IE盒模型
标准盒模型 vs IE盒模型
BFC(Block formatting context),块级格式化上下文。
BFC就是页面上的一个隔离的独立渲染容器,容器内的子元素与外面的元素互不影响。
BFC是一种css的布局方式,只是我们常用它来解决外边距折叠的问题,BFC并不是专门用来解决这个问题而创的;
当开启元素的BFC以后,元素将会具有如下的特性:
float: left/ right; overflow: auto/ hidden;display: flex/ inline-block/ table-cell/ table-caption/ inline-flex (inline-block可以解决高度塌陷问题,但是会导致宽度丢失,不推荐使用这种方式)position: absolute/ fixed可以用来自适应布局:利用BFC的这一个原理就可以实现两栏布局,左边定宽,右边自适应。不会相互影响,哪怕高度不相等。
可以清除浮动
可以解决垂直边距重叠
边距重叠:两个box如果都设置了边距,那么在垂直方向上,两个box的边距会发生重叠,以绝对值大的那个为最终结果显示在页面上。
有两种边距重叠的情况:
父子关系,如果子元素设置了外边距,在没有把父元素变成BFC的情况下,父元素也会产生外边距
解决1:给父元素添加 overflow:hidden,这样父元素就变为 BFC,不会随子元素产生外边距
解决2: 可以添加伪元素,通过display: table,来实现父子边框隔断:
.box1::before{
display: table;
content:"";
}
同级兄弟关系的重叠:
同级元素在垂直方向上外边距会出现重叠情况,最后外边距的大小取两者绝对值大的那个
解决1:
因为属于同一个BFC的两个相邻Box的margin会发生重叠,所以可以在其中一个box的外面包裹一个容器,并使用其触发一个BFC,这样两者就处于不同的BFC中,也就不会相互影响了。
思考:
.box1{
overflow: hidden;
}
为什么这样给box1开启了BFC,还是不行呢?非要给box1套上一个div再给div开启BFC呢?
答案:
因为给box1开启BFC时,相当于将其变成了一个特殊的容器,容器内的子元素不会影响到外面的元素,而box1和box2并非是box1的子元素与box1/box2。
开发中,如果有父元素和子元素且子元素会浮动的情况下,就要注意高度塌陷问题
缺点:一旦高度写死,父元素的高度将不能自动适应子元素的高度,所以这种方案是不推荐使用的。
在父元素里面最底下创建一个空元素(块级元素),p/div,对该块级元素清除浮动
div {
clear: both;
}
缺点:
为父元素开启BFC,BFC见上面第2大点
当开启元素的BFC以后,元素将会具有如下的特性:
1.父元素的垂直外边距不会和子元素重叠
2.开启BFC的元素不会被浮动元素所覆盖
3.开启BFC的元素可以包含浮动的子元素 !!!
那如何开启元素的BFC呢?
1.设置元素浮动:使用这种方式开启,虽然可以撑开父元素,但是会导致父元素的宽度丢失,而且使用这种方式也会导致下边的元素上移,不能解决问题
2.设置元素绝对定位
3.设置元素为inline-block:可以解决问题,但是会导致宽度丢失,不推荐使用这种方式
4.将元素的overflow设置为一个非visible的值
推荐方式:
div{
overflow: hidden;
}
缺点:
IE6不支持BFC,但是具有另一个隐含的属性叫做hasLayout,直接将元素的zoom设置为1即可
zoom表示放大的意思,后边跟着一个数值,写几就将元素放大几倍。
zoom: 1表示不放大元素,但是通过该样式可以开启hasLayout
zoom这个样式,只在IE中支持,其他浏览器都不支持。
.box1{
/*为box1设置一个边框*/
border: 10px red solid;
/*开启元素BFC属性*/
overflow: hidden;
/*IE6*/
zoom: 1;
}
可以通过after伪类向父元素的最后添加一个空白的块元素,然后对其清除浮动,这样做和添加一个div的原理一样,可以达到一个相同的效果,而且不会在页面中添加多余的div,这是最推荐使用的方式,几乎没有副作用。
.clearfix::after{
content:"";
display: block;
clear: both;
}
//终极写法:既可以解决高度塌陷,又可以解决父子边距重叠:
.clearfix::before,
.clearfix::after{
content: "";
display: table; //block还是table对于解决高度塌陷无影响
clear: both;
}
/*想要兼容IE6*/
.clearfix{
zoom: 1;
}
缺点:
IE6不支持after伪类,还需hasLayout来处理
伪类与伪元素的主要区别在于:有没有创建一个DOM树之外的元素
伪类:用于DOM元素处于某种状态时为其添加对应的样式。
伪元素:用于创建一些不在DOM树中的元素。
a:link | :hover | :active | :focus | :visited
:nth-child(n) - 查找所有父元素第n个子元素,不管是什么都选中
div:nth-child(n) - 查找所有父元素第n个子元素,如果是div即选中
.box :nth-child(n) 选择父元素box的第n个子元素,不管是什么都选中
.box div:nth-child(n) 选择父元素box的第n个子元素,如果是div元素即选中
:nth-last-child(n) 同理
div:nth-last-child(n) 同理
//问题:我们想选中第二个div,但它实际是第三个子元素,第二是span
div:nth-type-of(2)
F div:first-child 父元素F的第一个子元素div,与F div:nth-child(1)等同
F div:last-child 父元素F的最后一个子元素div,与F div:nth-last-child(1)等同
:empty选择空标签 :focus选择获得焦点的元素
:enabled选择当前有效的表单元素
:disabled选择当前无效的表单元素
:checked选择当前已经勾选的单选按钮或复选框
:root选择根元素,即标签
伪元素顾名思义伪装成元素,但不是元素,这与生成内容相关。生成内容主要指由浏览器创建的内容,而不是由标志或内容来表示。生成内容主要由:before和:after伪元素来实现,当然伪元素还包括:first-line :first-letter和::selection
用于创建一些不在DOM树中的元素,并为其添加样式
::before {content:"第一章:";}
::after {content:"Hot!";}
::first-line {background:red;} /*设置元素中第一行文本的样式, 注:只能与块级元素关联*/
::first-letter {font-size:30px;} /*指定一个元素第一个字母的样式*/
::selection{color: red}/*匹配被用户选择的部分, 注:只支持颜色和背景颜色两个样式*/
.father{
width: 300px;
height: 300px;
background-color: #bfa;
position: relative;
}
.son{
width: 200px;
height: 200px;
background-color: red;
position: absolute;
/*写法一二:已知子元素宽高*/
top: 50%;
left: 50%;
margin-top: -100px;
margin-left: -100px;
/*写法二 */
top: 0;
bottom: 0;
left: 0;
right: 0;
margin: auto;
/*写法三 未知子元素宽高*/
top: 50%;
left: 50%;
transform: translateX(-50%) translateY(-50%);
}
*{
margin: 0;
padding: 0;/*不设置会出现滚动条*/
}
html,body{
height: 100%; /*默认为0*/
}
/*当给body中的盒子设置时,必须要有上面两个设置,若给盒子中的盒子设置时,则不需要*/
body{
display: flex;
justify-content: center;
align-items: center;
}