本文记录了一直以来CSS走过的各种坑,以及各种前端CSS面试问题(因为是不定时补充,想起什么就写什么了,所以顺序没有特定排列,可能有点乱,可以关键词快速搜索),持续更新中~~~
css加载不会阻塞DOM树的 解析
css加载会阻塞DOM树的 渲染
css加载会阻塞后面js语句的执行
盒模型
盒模型有两种,标准模型(box-sizing:content-box)和IE模型(box-sizing:border-box)。假设页面有一个div,其样式如下:
div { width: 50px; height: 50px; background: #ff00ff; border: 1px solid #ffff00; padding: 20px 10px; margin: 20px; }
标准模型下,盒子的宽度为50px+(12)px+(102)px=72px,高度为50px+(12)px+(202)px=92px,也就是默认把border和padding算在了盒子最后的宽高内。
IE模型下,盒子的宽度为50px,高度为50px,也就是在某一方向的(padding+border)*2小于盒子的width时,最后的宽高依然等于盒子原始的width和height,如果某一方向的(padding+border)*2大于盒子的width时,此时宽高计算方式为(padding+border)*2。
除了模型本身外需要关注的一点就是margin。如果盒子是上下结构,则之间的间距为拥有较大margin的盒子,如果是左右结构,则间距为两个盒子的margin值相加。
水平垂直居中
方法1:div绝对定位水平垂直居中【margin:auto实现绝对定位元素的居中】
div { width: 200px; height: 200px; position:absolute; left:0; top:0; right:0; bottom:0; margin:auto; }
方法2:div绝对定位水平垂直居中【margin 负间距】
div { width: 200px; height: 200px; position:absolute; left:50%; top:50%; margin-left: -100px; margin-top: -100px; }
方法3:div绝对定位水平垂直居中【Transforms 变形】
div { width: 200px; height: 200px; position:absolute; left:50%; top:50%; transform: translate(-50%,-50%); }
方法4:css不定宽高水平垂直居中
.box { diplay:flex; justify-content: content; align-items: center; } .box>div{ width: 200px; height: 200px; }
方法5:将父盒子设置为table-cell元素,可以使用text-align:center和vertical-align:middle实现水平、垂直居中。比较完美的解决方案是利用三层结构模拟父子结构
.A .B .C /* table-cell实现居中 将父盒子设置为table-cell元素,设置 text-align:center,vertical-align: middle; 子盒子设置为inline-block元素 */ .A{ diplay: table; } .A .B{ diplay:table-cell; text-align: center; vertical-align: middle; } .A .C{ display:inline-block; }
方法6:未知div宽高在div中上下左右居中,把父元素设为display:flex,里面的div设为margin:auto
position
static :是默认值
relative :相对定位 相对于自身原有位置进行偏移,仍处于标准文档流中
absolute :绝对定位 相对于最近的已定位的祖先元素, 有已定位(指position不是static的元素)祖先元素, 以最近的祖先元素为参考标准。如果无已定位祖先元素, 以body元素为偏移参照基准, 完全脱离了标准文档流。
fixed :固定定位的元素会相对于视窗来定位,这意味着即便页面滚动,它还是会停留在相同的位置。一个固定定位元素不会保留它原本在页面应有的空隙。
inherit :规定应该从父元素继承 position 属性的值。
absolute当一直向上查找都没有非static的父元素的时候,是相对于初始包含块来定位的,而初始包含块并不是以html或body进行定位的。
relative是相对于他之前的起始位置来定位的,我们可以设置它的水平或垂直偏移量,让这个元素相对于它在文档流中的位置的起始点进行移动。有一点要注意, 在使用相对定位时,就算元素被偏移了,但是他仍然占据着它没偏移前的空间。
块级,行级,内联元素
块级:div,ul,li,p,button,dl,dt,dd,h1-h5,table,td,th,tr,form,fields
行级:a,img,span,input,iframe,strong
内联:a,span,strong,br (不支持宽高,可转换成display:block 或者 display:inline-block)
移动端问题
1.iOS页面滑动卡顿:-webkit-overflow-scrolling: touch;
2.iOS下margin属性某些情况下无效:(1)html,body的高度是百分比的时候,margin-bottom在safari里失效(2)可以用padding代替margin
3.iOS绑定事件不执行:添加样式cursor: pointer,点击后可能有背景闪一下的问题:-webkit-tap-highlight-color:transparent;
IE问题
IE8以下不支持getElementByClassName; IE用 currentStyle,其他浏览器用getComputedStyle;
IE(8及以下)有自己私有的滤镜:filter:alpha(opacity=0~100); border-radius IE8没用,解决方法设背景图片;
清除浮动
清浮动,最好给浮动元素的父级加 .clear{zoom:1;}.clear:after{content:””;display:block;clear:both;}
两列布局,一边固定一边自适应
1.父元素display:flex,自适应边flex:1
2.固定边用float/absolute,自适应边用margin
例:左边固定,右边自适应(float/position方法)
但是如果是右边固定,左边自适应,HTML结构中的right需要写在前面,而且position方法,还需要加上right:0
伪类,伪元素
伪类:用于向某些选择器添加特殊的效果。:hover,:active,:focus,:first-child,:link,:vistited
伪元素:用于将特殊的效果添加到某些选择器。:before,:after,:first-letter,:first-line
CSS3新增的伪类:例:
p:first-of-type 选择属于其父元素的首个 <p> 元素的每个 <p> 元素。
p:last-of-type 选择属于其父元素的最后 <p> 元素的每个 <p> 元素。
p:only-of-type 选择属于其父元素唯一的 <p> 元素的每个 <p> 元素。
p:only-child 选择属于其父元素的唯一子元素的每个 <pre> 元素。
p:nth-child(2) 选择属于其父元素的第二个子元素的每个 <pre> 元素。
:enabled、:disabled 控制表单控件的禁用状态。
:checked,单选框或复选框被选中。
CSS3新增的伪元素: ::selection
超出省略号,换行等
overflow: hidden; text-overflow: ellipsis; white-space: nowrap; word-break: break-all; //自动换行 text-transform: uppercase/lowercase //强制大/小写 border-collapse:collapse //table里相邻td的border合并为一条
border
border:none;与border:0;的区别:
1.性能方面:
【border:0;】把border设为“0”像素虽然在页面上看不见,但按border默认值理解,浏览器依然对border-width/border-color进行了渲染,即已经占用了内存值。
【border:none;】把border设为“none”即没有,浏览器解析“none”时将不作出渲染动作,即不会消耗内存值。
2.兼容性方面:
【border:none;】当border为“none”时对IE6/7无效,边框依然存在。
【border:0;】所有浏览器都一致把边框隐藏。
对于border:0;与border:none;个人更向于使用,border:none;,因为border:none;毕竟在性能消耗没有争议,而且兼容性可用背景属性解决不足以成为障碍(只需要在同一选择符上添加背景属性即可)。
display
display:none与visibility:hidden的区别 :(可以类比于Vue中的v-if和v-show)
display:none ,不为被隐藏的对象保留其物理空间
visibility:hidden ,为被隐藏的对象保留其物理空间
也就是display当他的值变成block 的时候,它所在的结构才会被加载进来。而visibility就会在加载页面的同时就已经把它加载进来了,因为他的值为hidden的时候,它所占的空间还在。
display:inline的元素,垂直方向上的padding/margin无效,水平方向的有。
jquery语法转换为原生语法
append()的参数可以是节点或者字符串,而appendChild()的参数只能是节点,如果想传入字符串,可以用insertAdjacentHTML(“afterEnd”,string)代替: beforeBegin: 插入到标签开始前,afterBegin:插入到标签开始标记之后,beforeEnd:插入到标签结束标记前,afterEnd:插入到标签结束标记后
响应式布局 媒体查询
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0,user-scalable=no">
首先这句代码在移动端开发是基本会出现的,它意思就是:整个网站的宽度让它默认等于屏幕宽度(width=device-width),原始缩放比例(initial-scale=1)为1.0,即网页初始大小占屏幕面积的100%。基本所有常用的浏览器都能设置这句话,IE9也是可以的。
零碎
readonly 属性规定输入字段为只读。只读字段是不能修改的。不过,用户仍然可以使用 tab 键切换到该字段,还可以选中或拷贝其文本。
input,img,iframe等元素都不能包含其他元素,所以不能通过伪元素插入内容
使用dataURL技术,图片数据以base64字符串格式嵌入到了页面中,与HTML成为一体。Base64编码的数据体积通常是原数据的体积4/3,也就是dataURL形式的图片会比二进制格式的图片体积大1/3。dataURL形式的图片不会被浏览器缓存,这意味着每次访问这样页面时都被下载一次。这是一个使用效率方面的问题——尤其当这个图片被整个网站大量使用的时候。
H5新增的img属性,srcset(根据不同像素比的设备,使用不同的src地址),sizes,picture属性
<img
srcset="http://placehold.it/2000 2000w,
http://placehold.it/1500 1500w,
http://placehold.it/1000 1000w,
http://placehold.it/500 500w
"
sizes="(max-width: 500px) 500px,
(max-width: 1000px) 1000px,
(max-width: 1500px) 1500px,
2000px
"
src="http://placehold.it/500/abc"
/>
//picture 元素内部的 source 与 img 的关系像是相片与相框的关系
<picture>
<source media="(max-width: 500px)" srcset="http://placehold.it/500” />
<source media="(max-width: 1000px)" srcset="http://placehold.it/1000” />
<source media="(max-width: 1500px)" srcset="http://placehold.it/1500” />
<img src="http://placehold.it/500/abc” />
</picture>