总纲:前端面试知识点大全
目录
2.请问 "resetting" 和 "normalizing" CSS 之间的区别?你会如何选择,为什么?
6.请描述 BFC(Block Formatting Context, 块格式化上下文) 及其如何工作?
1.CSS 中类 (class) 和ID 的区别
class是类选择器,可以作为通用样式,在文档中多次使用。ID是id选择器,理论上应该具有唯一性(即一个ID在文档中只能出现一次),如果出现多个也能同时应用样式,但如果涉及到JS操作时会存在问题,JS只会选择文档从上到下的第一个具有该ID的dom对象。
在CSS样式权重中,类选择器是10,而ID选择器的权重是100。
正常实际开发时,class用于定义css样式,而id选择器用于JS操作
https://blog.csdn.net/sinat_36521655/article/details/80693167
https://blog.csdn.net/sinat_36521655/article/details/80140221
2.请问 "resetting" 和 "normalizing" CSS 之间的区别?你会如何选择,为什么?
这两个都是用于CSS样式初始化的插件(算是吧),为了兼容各浏览器在布局和渲染是的不同,设置统一的标准。
resetting:直接重置所有格式,没有任何前提性质的。无前提重置所有样式,无视任何 user agent 预置样式
normalizing:重置部分格式的。只做适当重置,认为存在即有道理
所以建议在设置的时候使用 normalizing进行重置,避免造成所有数据丢失。resetting 这个需要谨慎使用
https://github.com/necolas/normalize.css
https://github.com/shannonmoeller/reset-css/blob/master/reset.css
3.请解释浮动 (Floats) 及其工作原理
浮动元素脱离文档流,不占据空间。浮动元素碰到包含它的边框或者浮动元素的边框停留。
脱离文档流,浮动元素会生成块级框(即变成display:block);float:left | right | none | inherit,初始值none不浮动。存在一个父元素高度坍塌问题。浮动元素碰到包含它的元素的边框或者其他浮动元素的边框会停留下来。
浮动的9个规则(算是原理吧)(css权威指南上有写):
1)浮动元素的左(或右)外边界不能超出其包含块的左(或右)内边界。(父元素content的边界)
2)浮动元素的左(或右)外边界必须是源文档中之前出现的左浮动(或右浮动)元素的右(左)外边界。除非后出现浮动元素的顶端在先出现浮动元素的底端下面。(避免浮动覆盖)
3)左浮动元素的右外边界不会在其右边右浮动元素的左外边界的右边。右浮动元素的左外边界也不会在其左边任何左浮动元素的右外边界的左边。(元素一定不会重叠)
4)左(或右)浮动元素左边(右边)有另一个浮动元素,前者右外边界不能在其包含块右(左)边界的右边(左边)
5)一个浮动元素的顶端不能比其父元素的内顶端更高。如果一个浮动元素在两个合并外边距之间,放置这个浮动元素时就好像在两个元素之间有一个块级父元素
6)浮动元素的顶端不能比之前所有浮动元素或块级元素的顶端更高。(限制上浮)
7)如果源文档中一个浮动元素之前出现另一个元素,浮动元素的顶端不能比包含该元素所生成框的任何行框的顶端要高
8)浮动元素必须尽可能高地放置
9)左浮动元素必须向左尽可能远,右浮动元素则必须向右尽可能远。位置越高,就会向右或向左浮动得越远
4.清除浮动
clear:both <br clear="all"> overflow:auto和dispaly:inline-block(形成BFC,后面有讲)。
使用伪类:after, 比如在父元素上使用.clear,下面五个属性都必须有,同时子元素设置:zoom:1,为了触发IE 6/7的hasLayout。
.clear:after {
content: '';
height:0;
display:block;
clear:both;
visibility:hidden;
}
https://blog.csdn.net/sinat_36521655/article/details/80107453
清除浮动overflow慎用!!https://swordair.com/on-clearing-float-again/
5.描述z-index和叠加上下文是如何形成的?
z-index是z轴上的距离调整,数值越大,距离读者越近。其值可以为负值,但是存在背景覆盖的问题,所以一般不使用负值,默认值为auto(一般情况下可认为是0)。
但是也有别的属性会影响z-index的情况:
z-index值不为auto的flex项(父元素display:flex|inline-flex).
元素的opacity值不是1.
元素的transform值不是none.
元素mix-blend-mode值不是normal.
元素的filter值不是none.
元素的isolation值是isolate.
will-change指定的属性值为上面任意一个.
元素的-webkit-overflow-scrolling设为touch.
同时记住一点z-index和叠加上下文的区别,z-index只是影响叠加上下文,而元素本身就存在叠加上下文的情况。
https://www.w3cplus.com/css/what-no-one-told-you-about-z-index.html
http://www.zhangxinxu.com/wordpress/2016/01/understand-css-stacking-context-order-z-index/
6.请描述 BFC(Block Formatting Context, 块格式化上下文) 及其如何工作?
BFC,块级格式化上下文,一个创建了新的BFC的盒子是独立布局的,盒子里面的子元素的样式不会影响到外面的元素。在同一个 BFC 中的两个毗邻的块级盒在垂直方向(和布局方向有关系)的 margin 会发生折叠。
BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
6.1 BFC布局规则:
1) 内部的Box会在垂直方向,一个接一个地放置。
2) Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠(数值符号相同取绝对值较大的,数值一正一负相加)
3) 每个元素的margin box的左边, 与包含块border box的左边相接触(border和padding夹着的地方。对于从左往右的格式化,否则相反)。即使存在浮动也是如此。
4) BFC的区域不会与float box重叠。
5) BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
6) 计算BFC的高度时,浮动元素也参与计算
6.2 会形成BFC的元素:
1) 根元素
2) float属性不为none
3) position为absolute或者fixed
4) display为inline-block,table-cell,table-caption,flex,inline-flex
5) overflow不为visible
之所以利用父元素的overflow属性清除浮动产生的高度坍塌,就是将父元素变成一个BFC,这样计算高度时,浮动元素也参与计算(即BFC规则第七条)
7.CSS的属性继承问题
7.1 无继承性的属性
1、display:规定元素应该生成的框的类型
2、文本属性:
vertical-align:垂直文本对齐
text-decoration:规定添加到文本的装饰
text-shadow:文本阴影效果
white-space:空白符的处理
unicode-bidi:设置文本的方向
3、盒子模型的属性:width、height、margin 、margin-top、margin-right、margin-bottom、margin-left、border、border-style、border-top-style、border-right-style、border-bottom-style、border-left-style、border-width、border-top-width、border-right-right、border-bottom-width、border-left-width、border-color、border-top-color、border-right-color、border-bottom-color、border-left-color、border-top、border-right、border-bottom、border-left、padding、padding-top、padding-right、padding-bottom、padding-left
4、背景属性:background、background-color、background-image、background-repeat、background-position、background-attachment
5、定位属性:float、clear、position、top、right、bottom、left、min-width、min-height、max-width、max-height、overflow、clip、z-index
6、生成内容属性:content、counter-reset、counter-increment
7、轮廓样式属性:outline-style、outline-width、outline-color、outline
8、页面样式属性:size、page-break-before、page-break-after
9、声音样式属性:pause-before、pause-after、pause、cue-before、cue-after、cue、play-during
7.2 有继承性的属性
1、字体系列属性
font:组合字体
font-family:规定元素的字体系列
font-weight:设置字体的粗细
font-size:设置字体的尺寸
font-style:定义字体的风格
font-variant:设置小型大写字母的字体显示文本,这意味着所有的小写字母均会被转换为大写,但是所有使用小型大写字体的字母与其余文本相比,其字体尺寸更小。
font-stretch:对当前的 font-family 进行伸缩变形。所有主流浏览器都不支持。
font-size-adjust:为某个元素规定一个 aspect 值,这样就可以保持首选字体的 x-height。
2、文本系列属性
text-indent:文本缩进
text-align:文本水平对齐
line-height:行高
word-spacing:增加或减少单词间的空白(即字间隔)
letter-spacing:增加或减少字符间的空白(字符间距)
text-transform:控制文本大小写
direction:规定文本的书写方向
color:文本颜色
3、元素可见性:visibility
4、表格布局属性:caption-side、border-collapse、border-spacing、empty-cells、table-layout
5、列表布局属性:list-style-type、list-style-image、list-style-position、list-style
6、生成内容属性:quotes
7、光标属性:cursor
8、页面样式属性:page、page-break-inside、windows、orphans
9、声音样式属性:speak、speak-punctuation、speak-numeral、speak-header、speech-rate、volume、voice-family、pitch、pitch-range、stress、richness、、azimuth、elevation
7.3 所有元素可以继承的属性
1、元素可见性:visibility
2、光标属性:cursor
7.4 内联元素可以继承的属性
1、字体系列属性
2、除text-indent、text-align之外的文本系列属性
7.5 块级元素可以继承的属性
1、text-indent、text-align
8.CSS sprites(雪碧图)
CSS sprites(雪碧图,也叫CSS精灵),是利用PS等工具将许多小图片整合成一张大的PNG图片,然后利用background-position:[左(x轴) 上(y轴)]属性移动背景图,显示整幅图中的不同小图标。
8.1优点:
1、利用CSS Sprites能很好地减少网页的http请求,从而大大的提高页面的性能,这也是CSS Sprites最大的优点,也是其被广泛传播和应用的主要原因;
2、CSS Sprites能减少图片的字节,曾经比较过多次3张图片合并成1张图片的字节总是小于这3张图片的字节总和。
3、解决了网页设计师在图片命名上的困扰,只需对一张集合的图片上命名就可以了,不需要对每一个小元素进行命名,从而提高了网页的制作效率。
4、更换风格方便,只需要在一张或少张图片上修改图片的颜色或样式,整个网页的风格就可以改变。维护起来更加方便。
8.2 缺点:
1、在图片合并的时候,你要把多张图片有序的合理的合并成一张图片,还要留好足够的空间,防止板块内出现不必要的背景;这些还好,最痛苦的是在宽屏,高分辨率的屏幕下的自适应页面,你的图片如果不够宽,很容易出现背景断裂;
2、至于可维护性,这是一般双刃剑。可能有人喜欢,有人不喜欢,因为每次的图片改动都得往这个图片删除或添加内容,显得稍微繁琐。而且算图片的位置(尤其是这种上千px的图)也是一件颇为不爽的事情。当然,在性能的口号下,这些都是可以克服的。
3、由于图片的位置需要固定为某个绝对数值,这就失去了诸如center之类的灵活性。
4、前面我们也提到了,必须限制盒子的大小才能使用CSS Sprites,否则可能会出现出现干扰图片的情况。这就是说,在一些需要非单向的平铺背景和需要网页缩放的情况下,CSS Sprites并不合适。YUI的解决方式是,加大图片之间的距离,这样可以保持有限度的缩放。
9.图片替换文字方案
图片替换文体就是在样式中使用背景图片来替换掉HTML模板中的文本内容,从而达到一种样式无法实现的页面渲染效果。
参考链接:https://www.w3cplus.com/css/ten-image-replace-text-with-css
方案一:FIR(Fahrner Image Replacement),引入外标签,将图片设为外标签的背景图,内标签的文本设置为display:none隐藏。缺点是不利于阅读器浏览网页
方案二:Phark方法,目前常用方法。其关键之处使用“text-indent属性,并且给其设置一个较大的负值,达到隐藏文本的效果“。
10.你会如何解决特定浏览器的样式问题?
浏览器的样式兼容问题多是因为初始值不同导致的,所以可以引用normalize.css或者reset.css。
还有部分老版本和旧版本不兼容的问题,可以采用<!-[if IE 7]> <![endif]->注释的方式。
网上参考连接:https://zhidao.baidu.com/question/1694848753518174268.html
1. CSS中几种浏览器对不同关键字的支持,可进行浏览器兼容性重复定义 !important 可被FireFox和IE7识别 * 可被IE6、IE7识别 _ 可被IE6识别 *+ 可被IE7识别
区别IE6与FF: background:orange;*background:blue;
区别IE6与IE7: background:green !important;background:blue;
区别IE7与FF: background:orange; *background:green;
区别FF,IE7,IE6: background:orange;*background:green !important;*background:blue;
IE7,IE8兼容: <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
最新兼容方案如下:
.e{
color:#FFF;/* FF,OP */
[;color:#0F0;]/* Sa,CH */
color:#FFF\9;/*IE6、7、8*/
*color:#FF0;/* IE7、6 */
_color:#F00;/* IE6 */
}
2. 应用条件注释,因为IE各版本的浏览器对我们制作的WEB标准的页面解释不一样,具体就是对CSS的解释不同,我们为了兼容这些,可运用条件注释来各自定义,最终达到兼容的目的。
比如:
<!– 默认先调用css.css样式表 –>
<link rel="stylesheet" type="text/css" href="css.css" />
<!–[if IE 7]>
<!– 如果IE浏览器版是7,调用ie7.css样式表 –>
<link rel="stylesheet" type="text/css" href="ie7.css" />
<![endif]–>
<!–[if lte IE 6]>
<!– 如果IE浏览器版本小于等于6,调用ie.css样式表 –>
<link rel="stylesheet" type="text/css" href="ie.css" />
<![endif]–>
这其中就区分了IE7和IE6向下的浏览器对CSS的执行,达到兼容的目的。同时,首行默认的css.css还能与其他非IE浏览器实现兼容。
注意:默认的CSS样式应该位于HTML文档的首行,进行条件注释判断的所有内容必须位于该默认样式之后。
3. 几个浏览器对实际像素的解释 IE/Opera:对象的实际宽度 = (margin-left) + width + (margin-right) Firefox/Mozilla:对象的实际宽度= (margin-left) + (border-left-width) + (padding- left) + width + (padding-right) + (border-right-width) + (margin-right)
4. 鼠标手势问题:FireFox的cursor属性不支持hand,但是支持pointer,IE两个都支持;所以为了兼容都用pointer
5. FireFox中设置HTML标签的Style属性时,所有位置、宽高和尺寸值必须后跟px,IE也支持此写法,因此统一加px单位。如 Obj.Style.Height = imgObj.Style.Height + ‘px';
6. FireFox无法解析简写的padding属性设置,如padding 5px 4px 3px 1px;必须改为 padding-top:5px; padding-right:4px; padding-bottom:3px; padding-left:1px0;
7. 消除ul、ol等列表的缩进时,样式应写成:list-style:none;margin:0px;padding:0px;其中margin属性对IE有效,padding属性对FireFox有效
8. CSS控制透明:IE:filter:progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=60); FireFox:opacity:0.6;
9. CSS控制圆角:IE:不支持圆角; FireFox: -moz-border-radius:4px;或 -moz-border-radius-topleft:4px; -moz-border-radius-topright:4px; -moz-border-radius-bottomleft:4px; -moz-border-radius- bottomright:4px;
10. CSS双线凹凸边框:IE:border:2px outset; FireFox: -moz-border-top-colors: #d4d0c8 white; -moz-border-left-colors: #d4d0c8 white; -moz-border-right-colors:#404040 #808080; -moz-border-bottom-colors:#404040 #808080;
11. IE支持CSS方法cursor:url()自定义光标样式文件和滚动条颜色风格;FireFox对以上两者均不支持
12. IE有Select控件永远处于最上层的bug,且所有CSS对Select控件都不起作用
13. IE支持Form中的Label标签,包括图片和文字内容;FireFox不支持包含图片的Label,点击图片不能让标记 label for 的Radio或CheckBox产生效果
14. FireFox中的TextArea不支持onScroll事件
15. FireFox不支持display的inline和block
16. FireFox对Div设置margin-left, margin-right为auto时已经居中, IE中不行
17. FireFox对Body设置text-align时, Div需要设置margin: auto(主要是margin-left margin-right) 方可居中
18. 对超链接的CSS样式设置最好遵从这样的顺序:L-V-H-A。即 <style type="text/css"> <!-- a:link {} a:visited {} a:hover {} a:active {} --> </style> 这样可以避免一些访问过后的超链接就不具备hover和active样式了
19. IE中设置长段落自动换行在CSS中设置word-wrap:break-word;FireFox中使用JS插入 的方法来实现,具体代码如下:
<script type="text/javascript">
/* <![CDATA[ */ function toBreakWord(el, intLen){ var obj=document.getElementById(el); var strContent=obj.innerHTML; var strTemp=""; while(strContent.length>intLen){ strTemp+=strContent.substr(0,intLen)+" "; strContent=strContent.substr(intLen,strContent.length); } strTemp+=" "+strContent; obj.innerHTML=strTemp; } if(document.getElementById && !document.all) toBreakWord("div_id", 37); /* ]]> */
</script>
20. 在子容器加了浮动属性后,该容器将不能自动撑开解决方法:在标签结束后下一个标签中加上一个清除浮动的CSS clear:both;
21. 浮动后IE6解释外边距为实际边距的双倍 解决办法:加上display:inline
22. IE6下图片下方会有空隙 解决办法:为img加上display:block或设置vertical-align 属性为vertical-align:top | bottom |middle |text-bottom
23. IE6下两个层中间有空隙 解决办法:设置右侧div也同样浮动float:left或者相对IE6定义 margin-right:-3px;
24. LI中内容超过长度后以省略号的显示方法 <style type="text/css"> <!-- li { width:200px; white-space:nowrap; text-overflow:ellipsis; -o-text-overflow:ellipsis; overflow: hidden; } --> </style> (只适用与IE)
25. 将元素的高度和行高设为相同值,即可垂直居中文本 <style type="text/css"> <!-- div { height:30px; line-height:30px; } --> </style>
26. 对齐文本与文本输入框,须在CSS中增加vertical-align:middle;属性设置 <style type="text/css"> <!-- … … vertical-align:middle; } --> </style>
27. 支持WEB标准的浏览器设置了固定高度值就不会像IE6那样被撑开,但是又想设置固定高度又想能够被撑开呢?解决办法是去掉height属性而设置min-height,为了兼容不支持min-height的IE6可以这样定义: { height:auto!important; height:200px; min-height:200px; }
28. web标准中IE无法设置滚动条颜色 解决办法:在CSS中对body的设置改为对html的 <style type="text/css"> <!-- html { scrollbar-face-color:#f6f6f6; scrollbar-highlight-color:#fff; scrollbar-shadow-color:#eeeeee; scrollbar-3dlight-color:#eeeeee; scrollbar-arrow-color:#000; scrollbar-track-color:#fff; scrollbar-darkshadow-color:#fff; } --> </style>
29. IE6由于默认行高问题无法定义1px左右高度的容器,解决办法:在CSS中对容器设置如:overflow:hidden | zoom:0.08 | line-height:1px
30. 给Flash设置透明属性可使层显示在Flash之上 <param name="wmode" value="transparent" /> <!-- 解决IE上的问题 //> <embed wmode="transparent" …… > <!-- 解决FireFox上的问题 //>
31. FireFox设置Padding属性后会相应的增加Width和Height属性值,IE不会解决办法:用!important方法多定义一套Height和Width
32. FireFox对div与div之间的空格是忽略的,但IE是处理的;因此尽量在两个相连的div之间不要有空格和回车,否则可能会造成不同浏览器之间格式不正确,比如著名的3px偏差;而且原因很难查明
33. 形如如下格式 <div id="parent"> <div id="content"> </div> </div> 当Content内容多时,即使parent设置了高度100%或auto,在不同浏览器下还是不能完好的自动伸展;解决办法在层的最下方产生一个高度为1的空格,代码如下 <div id="parent"> <div id="content"> </div> <div style="font: 0px/0px sans-serif;clear: both;display: block"> </div> </div>
34. IE和FireFox对字体small的尺寸解释不同,FireFox为13px,IE中为16px
35. IE和FireFox对空格的尺寸解释不同,FireFox为4px,IE中为8px