内的字符间隔设为默认letter-spacing:normal。
li与li之间有看不见的空白间隔
19.为什么要初始化 CSS 样式?
-因为浏览器的兼容问题,不同浏览器对有些标签的默认值是不同的,如果没对CSS初始化往往会出现浏览器之间的页面显示差异。
-当然,初始化样式会对SEO有一定的影响,但鱼和熊掌不可兼得,但力求影响最小的情况下初始化。
最简单的初始化方法:*{padding:0;margin:0;}(强烈不建议)
为什么不建议使用统配符初始化 css 样式。 采用*{pading:0;margin:0;}这样的写法好处是写起来很简单,但是通配符,需要把所有的标签都遍历一遍,当网站较大时,样式比较多,这样写就大大的加强了网站运行的负载,会使网站加载的时候需要很长一段时间,因此一般大型的网站都有分层次的一套初始化样式。
出于性能的考虑,并不是所有标签都会有padding和margin,因此对常见的具有默认padding和margin的元素初始化即 可,并不需使用通配符*来初始化。
淘宝的样式初始化代码:
body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, dl, dt, dd, ul, ol, li, pre, form, fieldset, legend
, button, input, textarea, th, td{
margin: 0 ; padding: 0 ; }
body, button, input, select, textarea{
font: 12 px/ 1.5 tahoma, arial, \5 b8b\4 f53; }
h1, h2, h3, h4, h5, h6{
font- size: 100 % ; }
address, cite, dfn, em, var {
font- style: normal; }
code, kbd, pre, samp{
font- family: couriernew, courier, monospace; }
small{
font- size: 12 px; }
ul, ol{
list- style: none; }
a{
text- decoration: none; }
a: hover{
text- decoration: underline; }
sup{
vertical- align: text- top; }
sub{
vertical- align: text- bottom; }
legend{
color: #000 ; }
fieldset, img{
border: 0 ; }
button, input, select, textarea{
font- size: 100 % ; }
table{
border- collapse: collapse; border- spacing: 0 ; }
初始化css样式
20.什么是包含块,对于包含块的理解?
包含块(containingblock)就是元素用来计算和定位的一个框。
(1)根元素(很多场景下可以看成是)被称为“初始包含块”,其尺寸等同于浏览器可视窗口的大小。
(2)对于其他元素,如果该元素的position是relative或者static,则“包含块”由其最近的块容器祖先盒的contentbox边界形成。
(3)如果元素position:fixed,则“包含块”是“初始包含块”。
(4)如果元素position:absolute,则“包含块”由最近的position不为static的祖先元素建立,具体方式如下:
如果该祖先元素是纯inline元素,则规则略复杂: •假设给内联元素的前后各生成一个宽度为0的内联盒子(inlinebox),则这两个内联盒子的paddingbox外面的包 围盒就是内联元素的“包含块”; •如果该内联元素被跨行分割了,那么“包含块”是未定义的,也就是CSS2.1规范并没有明确定义,浏览器自行发挥 否则,“包含块”由该祖先的paddingbox边界形成。
如果没有符合条件的祖先元素,则“包含块”是“初始包含块”。
21.CSS 里的 visibility 属性有个 collapse 属性值是干嘛用的?在不同浏览器下以后什么区别?
(1)对于一般的元素,它的表现跟visibility:hidden;是一样的。元素是不可见的,但此时仍占用页面空间。
(2)但例外的是,如果这个元素是table相关的元素,例如table行,tablegroup,table列,tablecolumngroup,它的 表现却跟display:none一样,也就是说,它们占用的空间也会释放。
在不同浏览器下的区别:
在谷歌浏览器里,使用collapse值和使用hidden值没有什么区别。
在火狐浏览器、Opera和IE11里,使用collapse值的效果就如它的字面意思:table的行会消失,它的下面一行会补充它的位 置。
22.width:auto 和 width:100%的区别
一般而言 width:100%会使元素box的宽度等于父元素的contentbox的宽度。
width:auto会使元素撑满整个父元素,margin、border、padding、content区域会自动分配水平空间。
23.绝对定位元素与非绝对定位元素的百分比计算的区别
绝对定位元素的宽高百分比是相对于临近的position不为static的祖先元素的paddingbox来计算的。
非绝对定位元素的宽高百分比则是相对于父元素的contentbox来计算的。
24.简单介绍使用图片 base64 编码的优点和缺点。
base64编码是一种图片处理格式,通过特定的算法将图片编码成一长串字符串,在页面上显示的时候,可以用该字符串来代替图片的url属性。
使用base64的优点是:
(1)减少一个图片的HTTP请求
使用base64的缺点是:
(1)根据base64的编码原理,编码后的大小会比原文件大小大1/3,如果把大图片编码到html/css中,不仅会造成文件体 积的增加,影响文件的加载速度,还会增加浏览器对html或css文件解析渲染的时间。
(2)使用base64无法直接缓存,要缓存只能缓存包含base64的文件,比如HTML或者CSS,这相比直接缓存图片的效果要差很多。
(3)兼容性的问题,ie8以前的浏览器不支持。
一般一些网站的小图标可以使用base64图片来引入。
玩转图片Base64编码
25.‘display’、'position’和’float’的相互关系?
(1)首先我们判断display属性是否为none,如果为none,则position和float属性的值不影响元素最后的表现。
(2)然后判断position的值是否为absolute或者fixed,如果是,则float属性失效,并且display的值应该被设置为table或者block,具体转换需要看初始转换值。
(3)如果position的值不为absolute或者fixed,则判断float属性的值是否为none,如果不是,则display的值则按上面的规则转换。注意,如果position的值为relative并且float属性的值存在,则relative相对于浮动后的最终位置定位。
(4)如果float的值为none,则判断元素是否为根元素,如果是根元素则display属性按照上面的规则转换,如果不是,则保持指定的display属性值不变。
总的来说,可以把它看作是一个类似优先级的机制,"position:absolute"和"position:fixed"优先级最高,有它存在 的时候,浮动不起作用,'display’的值也需要调整;其次,元素的’float’特性的值不是"none"的时候或者它是根元素的时候,调整’display’的值;最后,非根元素,并且非浮动元素,并且非绝对定位的元素,'display’特性值同设置值。
position跟display、margin collapse、overflow、float这些特性相互叠加后会怎么样?
26.margin 重叠问题的理解。
块级元素的上外边距(margin-top)与下外边距(margin-bottom)有时会合并为单个外边距,这样的现象称为“margin合 并”。
产生折叠的必备条件:margin必须是邻接的!
而根据w3c规范,两个margin是邻接的必须满足以下条件:
•必须是处于常规文档流(非float和绝对定位)的块级盒子,并且处于同一个BFC当中。 •没有线盒,没有空隙,没有padding和border将他们分隔开 •都属于垂直方向上相邻的外边距,可以是下面任意一种情况 •元素的margin-top与其第一个常规文档流的子元素的margin-top •元素的margin-bottom与其下一个常规文档流的兄弟元素的margin-top •height为auto的元素的margin-bottom与其最后一个常规文档流的子元素的margin-bottom •高度为0并且最小高度也为0,不包含常规文档流的子元素,并且自身没有建立新的BFC的元素的margin-top 和margin-bottom
margin合并的3种场景:
(1)相邻兄弟元素margin合并。
解决办法: •设置块状格式化上下文元素(BFC)
(2)父级和第一个/最后一个子元素的margin合并。
解决办法:
对于margin-top合并,可以进行如下操作(满足一个条件即可): •父元素设置为块状格式化上下文元素; •父元素设置border-top值; •父元素设置padding-top值; •父元素和第一个子元素之间添加内联元素进行分隔。
对于margin-bottom合并,可以进行如下操作(满足一个条件即可): •父元素设置为块状格式化上下文元素; •父元素设置border-bottom值; •父元素设置padding-bottom值; •父元素和最后一个子元素之间添加内联元素进行分隔; •父元素设置height、min-height或max-height。
(3)空块级元素的margin合并。
解决办法: •设置垂直方向的border; •设置垂直方向的padding; •里面添加内联元素(直接Space键空格是没用的); •设置height或者min-height。
总结:
margin重叠指的是在垂直方向上,两个相邻元素的margin发生重叠的情况。
一般来说可以分为四种情形:
第一种是相邻兄弟元素的marin-bottom和margin-top的值发生重叠。这种情况下我们可以通过设置其中一个元素为BFC 来解决。
第二种是父元素的margin-top和子元素的margin-top发生重叠。它们发生重叠是因为它们是相邻的,所以我们可以通过这一点来解决这个问题。我们可以为父元素设置border-top、padding-top值来分隔它们,当然我们也可以将父元素设置为BFC 来解决。
第三种是高度为auto的父元素的margin-bottom和子元素的margin-bottom发生重叠。它们发生重叠一个是因为它们相 邻,一个是因为父元素的高度不固定。因此我们可以为父元素设置border-bottom、padding-bottom来分隔它们,也可以为 父元素设置一个高度,max-height和min-height也能解决这个问题。当然将父元素设置为BFC是最简单的方法。
第四种情况,是没有内容的元素,自身的margin-top和margin-bottom发生的重叠。我们可以通过为其设置border、pa dding或者高度来解决这个问题。
27.对 BFC 规范(块级格式化上下文:blockformattingcontext)的理解?
块格式化上下文(BlockFormattingContext,BFC)是Web页面的可视化CSS渲染的一部分,是布局过程中生成块级盒 子的区域,也是浮动元素与其他元素的交互限定区域。
通俗来讲
•BFC是一个独立的布局环境,可以理解为一个容器,在这个容器中按照一定规则进行物品摆放,并且不会影响其它环境中的物品。 •如果一个元素符合触发BFC的条件,则BFC中的元素布局不受外部影响。
布局规则如下: 1.内部的盒子会在垂直方向,一个个地放置; 2.盒子垂直方向的距离由margin决定,属于同一个BFC的两个相邻Box的上下margin会发生重叠; 3.每个元素的左边,与包含的盒子的左边相接触,即使存在浮动也是如此; 4.BFC的区域不会与float重叠; 5.BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,反之也如此; 6.计算BFC的高度时,浮动元素也参与计算。
创建BFC
(1)根元素或包含根元素的元素 (2)浮动元素float=left|right或inherit(≠none) (3)绝对定位元素position=absolute或fixed (4)display=inline-block|flex|inline-flex|table-cell或table-caption (5)overflow=hidden|auto或scroll(≠visible)
BFC(块格式化上下文)
28.IFC 是什么?
IFC指的是行级格式化上下文,它有这样的一些布局规则:
(1)行级上下文内部的盒子会在水平方向,一个接一个地放置。 (2)当一行不够的时候会自动切换到下一行。 (3)行级上下文的高度由内部最高的内联盒子的高度决定。
29.请解释一下为什么需要清除浮动?清除浮动的方式
浮动元素可以左右移动,直到遇到另一个浮动元素或者遇到它外边缘的包含框。浮动框不属于文档流中的普通流,当元素浮动之后,不会影响块级元素的布局,只会影响内联元素布局 。此时文档流中的普通流就会表现得该浮动框不存在一样的布局模式。当包含框 的高度小于浮动框的时候,此时就会出现“高度塌陷”。
清除浮动是为了清除使用浮动元素产生的影响。浮动的元素,高度会塌陷,而高度的塌陷使我们页面后面的布局不能正常显示。
清除浮动的方式
(1)使用clear属性清除浮动。
(2)使用BFC块级格式化上下文来清除浮动。
因为BFC元素不会影响外部元素的特点,所以BFC元素也可以用来清除浮动的影响,因为如果不清除,子元素浮动则父元素高度塌陷,必然会影响后面元素布局和定位,这显然有违BFC元素的子元素不会影响外部元素的设定。
30.使用 clear 属性清除浮动的原理?
使用clear属性清除浮动,其语法如下:
clear:none|left|right|both
如果单看字面意思,clear:left应该是“清除左浮动”,clear:right应该是“清除右浮动”的意思,实际上,这种解释是有问题的,因为浮动一直还在,并没有清除。
官方对clear属性的解释是:“元素盒子的边不能和前面的浮动元素相邻。”,我们对元素设置clear属性是为了避免浮动元素对该元素的影响,而不是清除掉浮动。
还需要注意的一点是clear属性指的是元素盒子的边不能和前面的浮动元素相邻,注意这里“前面的”3个字,也就是clear属性对“后面的”浮动元素是不闻不问的。考虑到float属性要么是left,要么是right,不可能同时存在,同时由于clear属性对“后面的”浮动元素不闻不问,因此,当clear:left有效的时候,clear:right必定无效,也就是此时clear:left 等同于设置clear:both;同样地,clear:right如果有效也是等同于设置clear:both。由此可见,clear:left和clear:right这两个声明就没有任何使用的价值,至少在CSS世界中是如此,直接使用clear:both吧。
一般使用伪元素的方式清除浮动
. clear: : after{
content: '' ;
display: table;
clear: both;
}
clear属性只有块级元素才有效的,而::after等伪元素默认都是内联水平 ,这就是借助伪元素清除浮动影响时需要设置display属性值的原因。
利用clear清除浮动的一些问题
31.zoom:1 的清除浮动原理?
清除浮动,触发hasLayout; zoom属性是IE浏览器的专有属性,它可以设置或检索对象的缩放比例。解决ie下比较奇葩的bug。譬如外边距(margin) 的重叠,浮动清除,触发ie的haslayout属性等。
来龙去脉大概如下: 当设置了zoom的值之后,所设置的元素就会就会扩大或者缩小,高度宽度就会重新计算了,这里一旦改变zoom值时其实也会发 生重新渲染,运用这个原理,也就解决了ie下子元素浮动时候父元素不随着自动扩大的问题。
zoom属性是IE浏览器的专有属性,火狐和老版本的webkit核心的浏览器都不支持这个属性。然而,zoom现在已经被逐步标 准化,出现在CSS3.0规范草案中。
目前非ie由于不支持这个属性,它们又是通过什么属性来实现元素的缩放呢?可以通过css3里面的动画属性scale进行缩放。
32.移动端的布局用过媒体查询吗?
假设你现在正用一台显示设备来阅读这篇文章,同时你也想把它投影到屏幕上,或者打印出来,而显示设备、屏幕投影和打印等这些 媒介都有自己的特点,CSS就是为文档提供在不同媒介上展示的适配方法
当媒体查询为真时,相关的样式表或样式规则会按照正常的级联规被应用。当媒体查询返回假,标签上带有媒体查询的样式表仍将被 下载(只不过不会被应用)。
包含了一个媒体类型和至少一个使用宽度、高度和颜色等媒体属性来限制样式表范围的表达式。CSS3加入的媒体查询使得无需修改 内容便可以使样式应用于某些特定的设备范围。
响应式布局和自适应布局详解 CSS3 @media 查询
33.CSS 预处理器
CSS 预处理器是一种语言用来为 CSS 增加一些编程的的特性,无需考虑浏览器的兼容性问题,例如你可以在 CSS 中使用变量、简单的程序逻辑、函数等等在编程语言中的一些基本技巧,可以让你的 CSS 更见简洁,适应性更强,代码更直观等诸多好处。
sass和less有什么区别? 1.编译环境不一样 Sass的安装需要Ruby环境,是在服务端处理的,而Less是需要引入less.js来处理Less代码输出css到浏览器,也可以在开发环节使用Less,然后编译成css文件,直接放到项目中。
2.变量符不一相,less是@,而scss是$,而且它们的作用域也不一样,less是块级作用域
3.输出设置,Less没有输出设置,sass提供4种输出选项,nested,compact,compressed和expanded nested:嵌套缩进的css代码(默认) expanded:展开的多行css代码 compact:简洁格式的css代码 compressed:压缩后的css代码
4.sass支持条件语句,可以使用if{}else{},for{}循环等等,而less不行
5.引用外部css文件,sass引用外部文件必须以_开头,文件名如果以下划线_形状,sass会认为该文件是一个引用文件,不会将其编译为css文件。less引用外部文件和css中的@import没什么差异。
6.sass和less的工具库不同。sass有工具库Compass, 简单说,sass和Compass的关系有点像Javascript和jQuery的关系,Compass是sass的工具库。在它的基础上,封装了一系列有用的模块和模板,补充强化了sass的功能。less有UI组件库Bootstrap,Bootstrap是web前端开发中一个比较有名的前端UI组件库,Bootstrap的样式文件部分源码就是采用less语法编写。
总结:不管是sass,还是less,都可以视为一种基于CSS之上的高级语言,其目的是使得CSS开发更灵活和更强大,sass的功能比less强大,基本可以说是一种真正的编程语言了,less则相对清晰明了,易于上手,对编译环境要求比较宽松。考虑到编译sass要安装Ruby,而Ruby官网在国内访问不了,个人在实际开发中更倾向于选择less。
CSS 预处理器文档 CSS预处理器使用 Sass、Less和Stylus
34.CSS 优化、提高性能的方法有哪些?
加载性能:
(1)css压缩:将写好的css进行打包压缩,可以减少很多的体积。 (2)css单一样式:当需要下边距和左边距的时候,很多时候选择:margin:top0bottom0;但margin-bottom:bottom;margin-left:left;执行的效率更高。 (3)减少使用@import,而建议使用link,因为后者在页面加载时一起加载,前者是等待页面加载完成之后再进行加载。
选择器性能:
(1)关键选择器(keyselector)。选择器的最后面的部分为关键选择器(即用来匹配目标元素的部分)。CSS选择符是从右到 左进行匹配的 。当使用后代选择器的时候,浏览器会遍历所有子元素来确定是否是指定的元素等等;
(2)如果规则拥有ID选择器作为其关键选择器,则不要为规则增加标签。过滤掉无关的规则(这样样式系统就不会浪费时间去匹配它们了)。
(3)避免使用通配规则,如*{}计算次数惊人!只对需要用到的元素进行选择。
(4)尽量少的去对标签进行选择,而是用class。
(5)尽量少的去使用后代选择器,降低选择器的权重值。后代选择器的开销是最高的 ,尽量将选择器的深度降到最低,最高不要超过三层,更多的使用类来关联每一个标签元素。
(6)了解哪些属性是可以通过继承而来的,然后避免对这些属性重复指定规则。
渲染性能:
(1)慎重使用高性能属性:浮动、定位。
(2)尽量减少页面重排、重绘。
(3)去除空规则:{}。空规则的产生原因一般来说是为了预留样式。去除这些空规则无疑能减少css文档体积。
(4)属性值为0时,不加单位。
(5)属性值为浮动小数0.**,可以省略小数点之前的0。
(6)标准化各种浏览器前缀:带浏览器前缀的在前。标准属性在后。
(7)不使用@import前缀,它会影响css的加载速度。
(8)选择器优化嵌套,尽量避免层级过深。
(9)css雪碧图,同一页面相近部分的小图标,方便使用,减少页面的请求次数,但是同时图片本身会变大,使用时,优劣考虑清楚,再使用。
(10)正确使用display的属性,由于display的作用,某些样式组合会无效,徒增样式体积的同时也影响解析性能。
(11)不滥用web字体。对于中文网站来说WebFonts可能很陌生,国外却很流行。webfonts通常体积庞大,而且一些浏 览器在下载webfonts时会阻塞页面渲染损伤性能。
可维护性、健壮性:
(1)将具有相同属性的样式抽离出来,整合并通过class在页面中进行使用,提高css的可维护性。 (2)样式与内容分离:将css代码定义到外部css中。
35.浏览器是怎样解析 CSS 选择器的?
样式系统从关键选择器开始匹配,然后左移查找规则选择器的祖先元素。只要选择器的子树一直在工作,样式系统就会持续左移,直 到和规则匹配,或者是因为不匹配而放弃该规则。
试想一下,如果采用从左至右的方式读取CSS规则,那么大多数规则读到最后(最右)才会发现是不匹配的,这样做会费时耗能, 最后有很多都是无用的;而如果采取从右向左的方式,那么只要发现最右边选择器不匹配,就可以直接舍弃了,避免了许多无效匹配。
探究 CSS 解析原理
36.在网页中应该使用奇数还是偶数的字体?为什么呢?
(1)偶数字号相对更容易和web设计的其他部分构成比例关系。比如:当我用了14px的正文字号,我可能会在一些地方用14 ×0.5=7px的margin,在另一些地方用14×1.5=21px的标题字号。 (2)浏览器缘故,低版本的浏览器ie6会把奇数字体强制转化为偶数,即13px渲染为14px。 (3)系统差别,早期的Windows里,中易宋体点阵只有12和14、15、16px,唯独缺少13px。
37.margin 和 padding 分别适合什么场景使用?
margin是用来隔开元素与元素的间距;padding是用来隔开元素与内容的间隔。 margin用于布局分开元素使元素与元素互不相干。 padding用于元素与内容之间的间隔,让内容(文字)与(包裹)元素之间有一段距离。
何时应当使用margin: •需要在border外侧添加空白时。 •空白处不需要背景(色)时。 •上下相连的两个盒子之间的空白,需要相互抵消时。如15px+20px的margin,将得到20px的空白。
何时应当时用padding: •需要在border内测添加空白时。 •空白处需要背景(色)时。 •上下相连的两个盒子之间的空白,希望等于两者之和时。如15px+20px的padding,将得到35px的空白。
38.抽离样式模块怎么写,说出思路,有无实践经验?[阿里航旅的面试题]
我的理解是把常用的css样式单独做成css文件……通用的和业务相关的分离出来,通用的做成样式模块儿共享,业务相关的,放 进业务相关的库里面做成对应功能的模块儿。
39.简单说一下 css3 的 all 属性。
all属性实际上是所有CSS属性的缩写,表示,所有的CSS属性都怎样怎样,但是,不包括unicode-bidi和direction 这两个CSS属性。支持三个CSS通用属性值,initial,inherit,unset。
initial是初始值的意思,也就是该元素元素都除了unicode-bidi和direction以外的CSS属性都使用属性的默认初始值。
inherit是继承的意思,也就是该元素除了unicode-bidi和direction以外的CSS属性都继承父元素的属性值。
unset是取消设置的意思,也就是当前元素浏览器或用户设置的CSS忽略,然后如果是具有继承特性的CSS,如color,则使用继承值;如果是没有继承特性的CSS属性,如background-color,则使用初始值。
简单了解CSS3的all属性
40.absolute 的 containingblock(包含块)计算方式跟正常流有什么不同?
(1)内联元素也可以作为“包含块”所在的元素;
(2)“包含块”所在的元素不是父块级元素,而是最近的position不为static的祖先元素或根元素;
(3)边界是paddingbox而不是contentbox。
41.对于 hasLayout 的理解?
hasLayout是IE特有的一个属性。很多的IE下的cssbug都与其息息相关。在IE中,一个元素要么自己对自身的内容进行计算大小和组织,要么依赖于父元素来计算尺寸和组织内容。当一个元素的hasLayout属性值为true时,它负责对自己和可能的子孙元素进行尺寸计算和定位。虽然这意味着这个元素需要花更多的代价来维护自身和里面的内容,而不是依赖于祖先元素来完 成这些工作。
CSS基础篇–CSS中IE浏览器的hasLayout,IE低版本的bug根源 CSS魔法堂:hasLayout原来是这样的!
42.元素竖向的百分比设定是相对于容器的高度吗?
如果是height的话,是相对于包含块的高度。
如果是padding或者margin竖直方向的属性则是相对于包含块的宽度。
43.全屏滚动的原理是什么?用到了 CSS 的哪些属性?(待深入实践)
原理:有点类似于轮播,整体的元素一直排列下去,假设有5个需要展示的全屏页面,那么高度是500%,只是展示100%,容器及容器内的页面取当前可视区高度,同时容器的父级元素overflow属性值设为hidden,通过更改容器可视区的位置来实现全屏滚动效果。主要是响应鼠标事件,页面通过CSS的动画效果,进行移动。
overflow:hidden;transition:all1000msease;
js实现网页全屏切换(平滑过渡),鼠标滚动切换 用 ES6 写全屏滚动插件
44.什么是响应式设计?响应式设计的基本原理是什么?如何兼容低版本的 IE?(待深入了解)
响应式网站设计是一个网站能够兼容多个终端,而不是为每一个终端做一个特定的版本。基本原理是通过媒体查询检测不同的设备屏幕尺寸做处理。页面头部必须有meta声明的viewport。
响应式布局原理 响应式布局的实现方法和原理
45.视差滚动效果,如何给每页做不同的动画?(回到顶部,向下滑动要再次出现,和只出现一次分别怎么做?)
视差滚动是指多层背景以不同的速度移动,形成立体的运动效果,带来非常出色的视觉体验。 如何实现视差滚动效果的网页?
46.如何修改 chrome 记住密码后自动填充表单的黄色背景?
chrome表单自动填充后,input文本框的背景会变成黄色的,通过审查元素可以看到这是由于chrome会默认给自动填充的input表单加上input:-webkit-autofill私有属性,然后对其赋予以下样式:
{ background-color:rgb(250,255,189)!important; background-image:none!important; color:rgb(0,0,0)!important; }
对chrome默认定义的background-color,background-image,color使用important是不能提高其优先级的,但是其他属性可使用。
使用足够大的纯色内阴影来覆盖input输入框的黄色背景,处理如下
input:-webkit-autofill,textarea:-webkit-autofill,select:-webkit-autofill{ -webkit-box-shadow:000px1000pxwhiteinset; border:1pxsolid#CCC!important; }
修改谷歌浏览器chrome记住密码后自动填充表单的黄色背景 去掉chrome记住密码后的默认填充样式
47.怎么让 Chrome 支持小于 12px 的文字?
在谷歌下css设置字体大小为12px及以下时,显示都是一样大小,都是默认12px。
解决办法:
(1)可以使用Webkit的内核的-webkit-text-size-adjust的私有CSS属性来解决,只要加了-webkit-text-size-adjust:none;字体大小就不受限制了。但是chrome更新到27版本之后就不可以用了。所以高版本chrome谷歌浏览器已经不再支持-webkit-text-size-adjust样式,所以要使用时候慎用。
(2)还可以使用css3的transform缩放属性-webkit-transform:scale(0.5);注意-webkit-transform:scale(0. 75);收缩的是整个元素的大小,这时候,如果是内联元素,必须要将内联元素转换成块元素,可以使用display:block/ inline-block/…;
(3)使用图片:如果是内容固定不变情况下,使用将小于12px文字内容切出做图片,这样不影响兼容也不影响美观。
谷歌浏览器不支持CSS设置小于12px的文字怎么办?
48.让页面里的字体变清晰,变细用 CSS 怎么做?
webkit内核的私有属性:-webkit-font-smoothing,用于字体抗锯齿,使用后字体看起来会更清晰舒服。
在MacOS测试环境下面设置-webkit-font-smoothing:antialiased;但是这个属性仅仅是面向MacOS,其他操作系统设 置后无效。
让字体变的更清晰CSS 中 -webkit-font-smoothing
49.font-style 属性中 italic 和 oblique 的区别?
italic和oblique这两个关键字都表示“斜体”的意思。
它们的区别在于,italic是使用当前字体的斜体字体,而oblique只是单纯地让文字倾斜。如果当前字体没有对应的斜体字体,则退而求其次,解析为oblique,也就是单纯形状倾斜。
50.设备像素、css 像素、设备独立像素、dpr、ppi 之间的区别?
设备像素指的是物理像素,一般手机的分辨率指的就是设备像素,一个设备的设备像素是不可变的。
设备独立像素(Device Independent Pixel):与设备无关的逻辑像素,代表可以通过程序控制使用的虚拟像素,是一个总体概念,包括了CSS像素。
不管在何种分辨率的设备上,css像素的大小应该是一致的,css像素是一个相对单位,它是相 对于设备像素的,一个css像素的大小取决于页面缩放程度和dpr的大小。
dpr指的是设备像素和设备独立像素的比值,一般的pc屏幕,dpr=1。在iphone4时,苹果推出了retina屏幕,它的dpr 为2。屏幕的缩放会改变dpr的值。
ppi指的是每英寸的物理像素的密度,ppi越大,屏幕的分辨率越大。
前端开发中像素的概念 前端工程师需要明白的「像素」 CSS像素、物理像素、逻辑像素、设备像素比、PPI、Viewport 什么是物理像素、虚拟像素、逻辑像素、设备像素,什么又是 PPI, DPI, DPR 和 DIP
51.layoutviewport、visualviewport 和 idealviewport 的区别?
如果把移动设备上浏览器的可视区域设为viewport的话,某些网站就会因为viewport太窄而显示错乱,所以这些浏览器就决定 默认情况下把viewport设为一个较宽的值,比如980px,这样的话即使是那些为桌面设计的网站也能在移动浏览器上正常显示了。ppk把这个浏览器默认的viewport叫做layoutviewport。
layoutviewport的宽度是大于浏览器可视区域的宽度的,所以我们还需要一个viewport来代表浏览器可视区域的大小,ppk把 这个viewport叫做visualviewport。
idealviewport是最适合移动设备的viewport,idealviewport的宽度等于移动设备的屏幕宽度,只要在css中把某一元素的宽度设为idealviewport的宽度(单位用px),那么这个元素的宽度就是设备屏幕的宽度了,也就是宽度为100%的效果。idealviewport的意义在于,无论在何种分辨率的屏幕下,那些针对idealviewport而设计的网站,不需要用户手动缩放,也不需要出现横向滚动条,都可以完美的呈现给用户。
总结: 移动端一共需要理解三个viewport的概念的理解。
第一个视口是布局视口,在移动端显示网页时,由于移动端的屏幕尺寸比较小,如果网页使用移动端的屏幕尺寸进行布局的话,那么整个页面的布局都会显示错乱。所以移动端浏览器提供了一个layoutviewport布局视口的概念,使用这个视口来对页面进行布局展示,一般layoutviewport的大小为980px,因此页面布局不会有太大的变化,我们可以通过拖动和缩放来查看到这个页面。
第二个视口指的是视觉视口,visualviewport指的是移动设备上我们可见的区域的视口大小,一般为屏幕的分辨率的大小。visu alviewport和layoutviewport的关系,就像是我们通过窗户看外面的风景,视觉视口就是窗户,而外面的风景就是布局视口中的网页内容。
第三个视口是理想视口,由于layoutviewport一般比visualviewport要大,所以想要看到整个页面必须通过拖动和缩放才能实现。所以又提出了idealviewport的概念,idealviewport下用户不用缩放和滚动条就能够查看到整个页面,并且页面在不同分辨率下显示的内容大小相同。idealviewport其实就是通过修改layoutviewport的大小,让它等于设备的宽度,这个宽度可以理解为是设备独立像素,因此根据idealviewport设计的页面,在不同分辨率的屏幕下,显示应该相同。
说说移动前端中 viewport (视口) 移动端适配知识你到底知多少 移动前端开发之viewport的深入理解
52.position:fixed;在 android 下无效怎么处理?
因为移动端浏览器默认的viewport叫做layoutviewport。在移动端显示时,因为layoutviewport的宽度大于移动端屏幕的宽度,所以页面会出现滚动条左右移动,fixed的元素是相对layoutviewport来固定位置的,而不是移动端屏幕来固定位置的 ,所以会出现感觉fixed无效的情况。
如果想实现fixed相对于屏幕的固定效果,我们需要改变的是viewport的大小为idealviewport,可以如下设置:
53.如果需要手动写动画,你认为最小时间间隔是多久,为什么?(阿里)
多数显示器默认频率是60Hz,即1秒刷新60次,所以理论上最小间隔为1/60*1000ms=16.7ms
54.如何让去除 inline-block 元素间间距?
移除空格、使用margin负值、使用font-size:0、letter-spacing、word-spacing
去除inline-block元素间间距的N种方法
55.overflow:scroll 时不能平滑滚动的问题怎么处理?
以下代码可解决这种卡顿的问题:-webkit-overflow-scrolling:touch;是因为这行代码启用了硬件加速特性,所以滑动很流畅。
解决页面使用overflow: scroll在iOS上滑动卡顿的问题
56.有一个高度自适应的 div,里面有两个 div,一个高度 100px,希望另一个填满剩下的高度。
(1)外层div使用position:relative;高度要求自适应的div使用position:absolute;top:100px;bottom:0; left:0;right:0;
(2)使用flex布局,设置主轴为竖轴,第二个div的flex-grow为1。
有一个高度自适应的div,里面有两个div,一个高度100px,希望另一个填满剩下的高度 flex-grow 属性深入探讨
57.png、jpg、gif 这些图片格式解释一下,分别什么时候用。有没有了解过 webp?
(1)BMP,是无损的、既支持索引色也支持直接色 的、点阵图。这种图片格式几乎没有对数据进行压缩,所以BMP格式的图片通常具有较大的文件大小。
(2)GIF是无损的、采用索引色的、点阵图 。采用LZW压缩算法进行编码。文件小,是GIF格式的优点,同时,GIF格式还具 有支持动画以及透明的优点。但,GIF格式仅支持8bit的索引色,所以GIF格式适用于对色彩要求不高同时需要文件体积较小的场景。
(3)JPEG是有损的、采用直接色的、点阵图 。JPEG的图片的优点,是采用了直接色,得益于更丰富的色彩,JPEG非常适合用来存储照片,与GIF相比,JPEG不适合用来存储企业Logo、线框类的图。因为有损压缩会导致图片模糊,而直接色的选用,又会导致图片文件较GIF更大。
(4)PNG-8是无损的、使用索引色的、点阵图 。PNG是一种比较新的图片格式,PNG-8是非常好的GIF格式替代者,在可能的情况下,应该尽可能的使用PNG-8而不是GIF,因为在相同的图片效果下,PNG-8具有更小的文件体积。除此之外,PNG-8还支持透明度的调节,而GIF并不支持。现在,除非需要动画的支持,否则我们没有理由使用GIF而不是PNG-8。
(5)PNG-24是无损的、使用直接色的、点阵图 。PNG-24的优点在于,它压缩了图片的数据,使得同样效果的图片,PNG-24格式的文件大小要比BMP小得多。当然,PNG24的图片还是要比JPEG、GIF、PNG-8大得多。
(6)SVG是无损的、矢量图 。SVG是矢量图。这意味着SVG图片由直线和曲线以及绘制它们的方法组成。当你放大一个SVG图 片的时候,你看到的还是线和曲线,而不会出现像素点。这意味着SVG图片在放大时,不会失真,所以它非常适合用来绘制企 业Logo、Icon等。
(7)WebP是谷歌开发的一种新图片格式,WebP是同时支持有损和无损压缩的、使用直接色的、点阵图。从名字就可以看出来它是为Web而生的,什么叫为Web而生呢?就是说相同质量的图片,WebP具有更小的文件体积。现在网站上充满了大量的图片,如果能够降低每一个图片的文件大小,那么将大大减少浏览器和服务器之间的数据传输量,进而降低访问延迟,提升访问体验。
•在无损压缩的情况下,相同质量的WebP图片,文件大小要比PNG小26%; •在有损压缩的情况下,具有相同图片精度的WebP图片,文件大小要比JPEG小25%~34%; •WebP图片格式支持图片透明度,一个无损压缩的WebP图片,如果要支持透明度只需要22%的格外文件大小。
但是目前只有Chrome浏览器和Opera浏览器支持WebP格式,兼容性不太好。
总结:
我了解到的一共有七种常见的图片的格式。
(1)第一种是BMP格式,它是无损压缩的,支持索引色和直接色的点阵图。由于它基本上没有进行压缩,因此它的文件体积一般比较大。
(2)第二种是GIF格式,它是无损压缩的使用索引色的点阵图。由于使用了LZW压缩方法,因此文件的体积很小。并且GIF还支持动画和透明度。但因为它使用的是索引色,所以它适用于一些对颜色要求不高且需要文件体积小的场景。
(3)第三种是JPEG格式,它是有损压缩的使用直接色的点阵图。由于使用了直接色,色彩较为丰富,一般适用于来存储照片。但由于使用的是直接色,可能文件的体积相对于GIF格式来说更大。
(4)第四种是PNG-8格式,它是无损压缩的使用索引色的点阵图。它是GIF的一种很好的替代格式,它也支持透明度的调整,并且文件的体积相对于GIF格式更小。一般来说如果不是需要动画的情况,我们都可以使用PNG-8格式代替GIF格式。
(5)第五种是PNG-24格式,它是无损压缩的使用直接色的点阵图。PNG-24的优点是它使用了压缩算法,所以它的体积比BMP 格式的文件要小得多,但是相对于其他的几种格式,还是要大一些。
(6)第六种格式是svg格式,它是矢量图,它记录的图片的绘制方式,因此对矢量图进行放大和缩小不会产生锯齿和失真。它一般适合于用来制作一些网站logo或者图标之类的图片。
(7)第七种格式是webp格式,它是支持有损和无损两种压缩方式的使用直接色的点阵图。使用webp格式的最大的优点是,在相同质量的文件下,它拥有更小的文件体积。因此它非常适合于网络图片的传输,因为图片体积的减少,意味着请求时间的减小,这样会提高用户的体验。这是谷歌开发的一种新的图片格式,目前在兼容性上还不是太好。
图片格式那么多,哪种更适合你?
58.浏览器如何判断是否支持 webp 格式图片
(1)宽高判断法。通过创建image对象,将其src属性设置为webp格式的图片,然后在onload事件中获取图片的宽高,如果能够获取,则说明浏览器支持webp格式图片。如果不能获取或者触发了onerror函数,那么就说明浏览器不支持webp格式的图片。
(2)canvas判断方法。我们可以动态的创建一个canvas对象,通过canvas的toDataURL将设置为webp格式,然后判断返回值中是否含有image/webp字段,如果包含则说明支持WebP,反之则不支持。
判断浏览器是否支持WebP图片 HTMLCanvasElement.toDataURL()
59.什么是 Cookie 隔离?(或者说:请求资源的时候不要让它带 cookie 怎么做)
网站向服务器请求的时候,会自动带上cookie这样增加表头信息量,使请求变慢。
如果静态文件都放在主域名下,那静态文件请求的时候都带有的cookie的数据提交给server的,非常浪费流量,所以不如隔离开 ,静态资源放CDN。
因为cookie有域的限制,因此不能跨域提交请求,故使用非主要域名的时候,请求头中就不会带有cookie数据,这样可以降低请求头的大小,降低请求时间,从而达到降低整体请求延时的目的。
同时这种方式不会将cookie传入WebServer,也减少了WebServer对cookie的处理分析环节,提高了webserver的http请求的解析速度。
CDN 是什么?使用 CDN 有什么优势?
60.style 标签写在 body 后与 body 前有什么区别?
页面加载自上而下当然是先加载样式。写在body标签后由于浏览器以逐行方式对HTML文档进行解析,当解析到写在尾部的样式表(外联或写在style标签)会导致浏览器停止之前的渲染,等待加载且解析样式表完成之后重新渲染,在windows的IE下可能会出现FOUC现象(即样式失效导致的页面闪烁问题)
61.什么是 CSS 预处理器/后处理器?
CSS预处理器定义了一种新的语言,其基本思想是,用一种专门的编程语言,为CSS增加了一些编程的特性,将CSS作为目标生成文件,然后开发者就只要使用这种语言进行编码工作。通俗的说,CSS预处理器用一种专门的编程语言,进行Web页面样式设计,然后再编译成正常的CSS文件。
预处理器例如:LESS、Sass、Stylus,用来预编译Sass或lesscsssprite,增强了css代码的复用性,还有层级、mixin、变量、循环、函数等,具有很方便的UI组件模块化开发能力,极大的提高工作效率。
CSS后处理器是对CSS进行处理,并最终生成CSS的预处理器,它属于广义上的CSS预处理器。我们很久以前就在用CSS后处理器了,最典型的例子是CSS压缩工具(如clean-css),只不过以前没单独出来说过。还有最近比较火的Autoprefixer,以CanIUse上的浏览器支持数据为基础,自动处理兼容性问题。
后处理器例如:PostCSS,通常被视为在完成的样式表中根据CSS规范处理CSS,让其更有效;目前最常做的是给CSS属性添加浏 览器私有前缀,实现跨浏览器兼容性的问题。
CSS预处理器和后处理器
62.阐述一下 CSSSprites
将一个页面涉及到的所有图片都包含到一张大图中去,然后利用CSS的background-image,background-repeat,background-position的组合进行背景定位。利用CSSSprites能很好地减少网页的http请求,从而很好的提高页面的性能;CSSSprites能减少图片的字节。
优点:
减少HTTP请求数,极大地提高页面加载速度 增加图片信息重复度,提高压缩比,减少图片大小 更换风格方便,只需在一张或几张图片上修改颜色或样式即可实现
缺点:
图片合并麻烦 维护麻烦,修改一个图片可能需要重新布局整个图片,样式
63.使用 rem 布局的优缺点?
优点: 在屏幕分辨率千差万别的时代,只要将rem与屏幕分辨率关联起来就可以实现页面的整体缩放,使得在设备上的展现都统一起来了。 而且现在浏览器基本都已经支持rem了,兼容性也非常的好。
缺点: (1)在奇葩的dpr设备上表现效果不太好,比如一些华为的高端机型用rem布局会出现错乱。 (2)使用iframe引用也会出现问题。 (3)rem在多屏幕尺寸适配上与当前两大平台的设计哲学不一致。即大屏的出现到底是为了看得又大又清楚,还是为了看的更多的问 题。
css3 的字体大小单位 rem 到底好在哪? VW: 是时候放弃REM布局了 为什么设计稿是 750px 使用Flexible实现手淘H5页面的终端适配 rem是如何实现自适应布局的?
64.几大经典布局
几种常见的CSS布局
65.画一条 0.5px 的线
采用metaviewport的方式
采用border-image的方式
采用transform:scale()的方式
怎么画一条0.5px的边
66.transition 和 animation 的区别
transition关注的是CSSproperty的变化,property值和时间的关系是一个三次贝塞尔曲线。
animation作用于元素本身而不是样式属性,可以使用关键帧的概念,应该说可以实现更自由的动画效果。
CSS animation 与 CSS transition 有何区别? CSS3 Transition 和Animation区别及比较 CSS动画简介 CSS动画:animation、transition、transform、translate傻傻分不清
67.什么是首选最小宽度?
“首选最小宽度”,指的是元素最适合的最小宽度。
东亚文字(如中文)最小宽度为每个汉字的宽度。
西方文字最小宽度由特定的连续的英文字符单元决定。并不是所有的英文字符都会组成连续单元,一般会终止于空格(普通空格)、短横线、问号以及其他非英文字符等。
如果想让英文字符和中文一样,每一个字符都用最小宽度单元,可以试试使用CSS中的word-break:break-all。
68.为什么 height:100%会无效?
对于普通文档流中的元素,百分比高度值要想起作用,其父级必须有一个可以生效的高度值。
原因是如果包含块的高度没有显式指定(即高度由内容决定),并且该元素不是绝对定位,则计算值为auto,因为解释成了auto,所以无法参与计算。
使用绝对定位的元素会有计算值,即使祖先元素的height计算为auto也是如此。
为啥你的height:100%不起作用?
69.min-width/max-width 和 min-height/max-height 属性间的覆盖规则?
(1)max-width会覆盖width,即使width是行类样式或者设置了!important。
(2)min-width会覆盖max-width,此规则发生在min-width和max-width冲突的时候。
70.内联盒模型基本概念
(1)内容区域(contentarea)。内容区域指一种围绕文字看不见的盒子,其大小仅受字符本身特性控制,本质上是一个字符盒子(characterbox);但是有些元素,如图片这样的替换元素,其内容显然不是文字,不存在字符盒子之类的,因此,对于这些 元素,内容区域可以看成元素自身。
(2)内联盒子(inlinebox)。“内联盒子”不会让内容成块显示,而是排成一行,这里的“内联盒子”实际指的就是元素的“外在盒 子”,用来决定元素是内联还是块级。该盒子又可以细分为“内联盒子”和“匿名内联盒子”两类。
(3)行框盒子(linebox),每一行就是一个“行框盒子”(实线框标注),每个“行框盒子”又是由一个一个“内联盒子”组成的。
(4)包含块(containingbox),由一行一行的“行框盒子”组成。
71.什么是幽灵空白节点?
“幽灵空白节点”是内联盒模型中非常重要的一个概念,具体指的是:在HTML5文档声明中,内联元素的所有解析和渲染表现就如同每个行框盒子的前面有一个“空白节点”一样。这个“空白节点”永远透明,不占据任何宽度,看不见也无法通过脚本获取,就好像幽灵一样,但又确确实实地存在,表现如同文本节点一样,因此,我称之为“幽灵空白节点”。
72.什么是替换元素?
通过修改某个属性值呈现的内容就可以被替换的元素就称为“替换元素”。因此, 、、、
替换元素除了内容可替换这一特性以外,还有以下一些特性。
(1)内容的外观不受页面上的CSS的影响。用专业的话讲就是样式表现在CSS作用域之外。如何更改替换元素本身的外观需要类似appearance属性,或者浏览器自身暴露的一些样式接口,
(2)有自己的尺寸。在Web中,很多替换元素在没有明确尺寸设定的情况下,其默认的尺寸(不包括边框)是300像素×150像 素,如、
(3)在很多CSS属性上有自己的一套表现规则。比较具有代表性的就是vertical-align属性,对于替换元素和非替换元素,vertical-align属性值的解释是不一样的。比方说vertical-align的默认值的baseline,很简单的属性值,基线之意,被定义为字符x的下边缘,而替换元素的基线却被硬生生定义成了元素的下边缘。
(4)所有的替换元素都是内联水平元素,也就是替换元素和替换元素、替换元素和文字都是可以在一行显示的。但是,替换元素默认的display值却是不一样的,有的是inline,有的是inline-block。
73.替换元素的计算规则?
替换元素的尺寸从内而外分为3类:固有尺寸、HTML尺寸和CSS尺寸。
(1)固有尺寸指的是替换内容原本的尺寸。例如,图片、视频作为一个独立文件存在的时候,都是有着自己的宽度和高度的。
(2)HTML尺寸只能通过HTML原生属性改变,这些HTML原生属性包括 的width和height属性、 的size属性、
(3)CSS尺寸特指可以通过CSS的width和height或者maxwidth/min-width和max-height/min-height设置的尺寸,对应盒尺寸中的contentbox。
这3层结构的计算规则具体如下
(1)如果没有CSS尺寸和HTML尺寸,则使用固有尺寸作为最终的宽高。
(2)如果没有CSS尺寸,则使用HTML尺寸作为最终的宽高。
(3)如果有CSS尺寸,则最终尺寸由CSS属性决定。
(4)如果“固有尺寸”含有固有的宽高比例,同时仅设置了宽度或仅设置了高度,则元素依然按照固有的宽高比例显示。
(5)如果上面的条件都不符合,则最终宽度表现为300像素,高度为150像素。
(6)内联替换元素和块级替换元素使用上面同一套尺寸计算规则。
74.content 与替换元素的关系?
content属性生成的对象称为“匿名替换元素”。
(1)我们使用content生成的文本是无法选中、无法复制的,好像设置了userselect:none声明一般,但是普通元素的文本却可以被轻松选中。同时,content生成的文本无法被屏幕阅读设备读取,也无法被搜索引擎抓取,因此,千万不要自以为是地把重要的文本信息使用content属性生成,因为这对可访问性和SEO都很不友好。
(2)content生成的内容不能左右:empty伪类。
(3)content动态生成值无法获取。
知道css有个content属性吗?有什么作用?有什么应用?
75.margin:auto 的填充规则?
margin的’auto’可不是摆设,是具有强烈的计算意味的关键字,用来计算元素对应方向应该获得的剩余间距大小。但是触发margin:auto计算有一个前提条件,就是width或height为auto时,元素是具有对应方向的自动填充特性的。
(1)如果一侧定值,一侧auto,则auto为剩余空间大小。 (2)如果两侧均是auto,则平分剩余空间。
76.margin 无效的情形
(1)display计算值inline的非替换元素的垂直margin是无效的。对于内联替换元素,垂直margin有效,并且没有margin合并的问题。
(2)表格中的和元素或者设置display计算值是table-cell或table-row的元素的margin都是无效的。
(3)绝对定位元素非定位方位的margin值“无效”(效果微乎其微)。
77.border 的特殊性?
(1)border-width不支持百分比。
(2)border-style的默认值是none,有一部分人可能会误以为是solid。这也是单纯设置border-width或border-color没有边框显示的原因。
(3)border-style:double的表现规则:双线宽度永远相等,中间间隔±1。
(4)border-color默认颜色就是color色值。
(5)默认background背景图片是相对于paddingbox定位的。
78.什么是基线和 x-height?
字母x的下边缘(线)就是我们的基线。
x-height指的就是小写字母x的高度,术语描述就是基线和等分线(meanline)(也称作中线,midline)之间的距离。在CSS世界中,middle指的是基线往上1/2x-height高度。我们可以近似理解为字母x交叉点那个位置。
ex是CSS中的一个相对单位,指的是小写字母x的高度,没错,就是指x-height。ex的价值就在其副业上不受字体和字号影响的内联元素的垂直居中对齐效果。内联元素默认是基线对齐的,而基线就是x的底部,而1ex就是一个x的高度。
79.line-height 的特殊性?
(1)对于非替换元素的纯内联元素,其可视高度完全由line-height决定。对于文本这样的纯内联元素,line-height就是高度计算的基石,用专业说法就是指定了用来计算行框盒子高度的基础高度。
(2)内联元素的高度由固定高度和不固定高度组成,这个不固定的部分就是这里的“行距”。换句话说,line-height之所以起作用,就是通过改变“行距”来实现的。在CSS中,“行距”分散在当前文字的上方和下方,也就是即使是第一行文字,其上方也是有“行距”的,只不过这个“行距”的高度仅仅是完整“行距”高度的一半,因此,也被称为“半行距”。
(3)行距=line-height-font-size。
(4)border以及line-height等传统CSS属性并没有小数像素的概念。如果标注的是文字上边距,则向下取整;如果是文字下边距,则向上取整。
(5)对于纯文本元素,line-height直接决定了最终的高度。但是,如果同时有替换元素,则line-height只能决定最小高度。
(6)对于块级元素,line-height对其本身是没有任何作用的,我们平时改变line-height,块级元素的高度跟着变化实际上是通过改变块级元素里面内联级别元素占据的高度实现的。
(7)line-height的默认值是normal,还支持数值、百分比值以及长度值。为数值类型时,其最终的计算值是和当前font-size相乘后的值。为百分比值时,其最终的计算值是和当前font-size相乘后的值。为长度值时原意不变。
(8)如果使用数值作为line-height的属性值,那么所有的子元素继承的都是这个值;但是,如果使用百分比值或者长度值作为属性值,那么所有的子元素继承的是最终的计算值。
(9)无论内联元素line-height如何设置,最终父级元素的高度都是由数值大的那个line-height决定的。
(10)只要有“内联盒子”在,就一定会有“行框盒子”,就是每一行内联元素外面包裹的一层看不见的盒子。然后,重点来了,在每个“行框盒子”前面有一个宽度为0的具有该元素的字体和行高属性的看不见的“幽灵空白节点”。
80.vertical-align 的特殊性?
(1)vertical-align的默认值是baseline,即基线对齐,而基线的定义是字母x的下边缘。因此,内联元素默认都是沿着字母x的下边缘对齐的。对于图片等替换元素,往往使用元素本身的下边缘作为基线。:一个inline-block元素,如果里面没有内联元素,或者overflow不是visible,则该元素的基线就是其margin底边缘;否则其基线就是元素里面最后一行内联元素的基线。
(2)vertical-align:top就是垂直上边缘对齐,如果是内联元素,则和这一行位置最高的内联元素的顶部对齐;如果display计算值是table-cell的元素,我们不妨脑补成元素,则和元素上边缘对齐。
(3)vertical-align:middle是中间对齐,对于内联元素,元素的垂直中心点和行框盒子基线往上1/2x-height处对齐。对于table-cell元素,单元格填充盒子相对于外面的表格行居中对齐。
(4)vertical-align支持数值属性,根据数值的不同,相对于基线往上或往下偏移,如果是负值,往下偏移,如果是正值,往上偏移。
(5)vertical-align属性的百分比值则是相对于line-height的计算值计算的。
(6)vertical-align起作用是有前提条件的,这个前提条件就是:只能应用于内联元素以及display值为table-cell的元素。
(7)table-cell元素设置vertical-align垂直对齐的是子元素,但是其作用的并不是子元素,而是table-cell元素自身。
81.overflow 的特殊性?
(1)一个设置了overflow:hidden声明的元素,假设同时存在border属性和padding属性,则当子元素内容超出容器宽度高度限制的时候,剪裁的边界是borderbox的内边缘,而非paddingbox的内边缘。
(2)HTML中有两个标签是默认可以产生滚动条的,一个是根元素,另一个是文本域
(3)滚动条会占用容器的可用宽度或高度。
(4)元素设置了overflow:hidden声明,里面内容高度溢出的时候,滚动依然存在,仅仅滚动条不存在!
82.无依赖绝对定位是什么?
没有设置left/top/right/bottom属性值的绝对定位称为“无依赖绝对定位”。
无依赖绝对定位其定位的位置和没有设置position:absolute时候的位置相关。
83.absolute 与 overflow 的关系?
(1)如果overflow不是定位元素,同时绝对定位元素和overflow容器之间也没有定位元素,则overflow无法对absolute元素进行剪裁。
(2)如果overflow的属性值不是hidden而是auto或者scroll,即使绝对定位元素高宽比overflow元素高宽还要大,也都不会出现滚动条。
(3)overflow元素自身transform的时候,Chrome和Opera浏览器下的overflow剪裁是无效的。
84.clip 裁剪是什么?
所谓“可访问性隐藏”,指的是虽然内容肉眼看不见,但是其他辅助设备却能够进行识别和访问的隐藏。
clip剪裁被我称为“最佳可访问性隐藏”的另外一个原因就是,它具有更强的普遍适应性,任何元素、任何场景都可以无障碍使用。
85.relative 的特殊性?
(1)相对定位元素的left/top/right/bottom的百分比值是相对于包含块计算的,而不是自身。注意,虽然定位位移是相对自身,但是百分比值的计算值不是。
(2)top和bottom这两个垂直方向的百分比值计算跟height的百分比值是一样的,都是相对高度计算的。同时,如果包含块的高度是auto,那么计算值是0,偏移无效,也就是说,如果父元素没有设定高度或者不是“格式化高度”,那么relative类似top:20%的代码等同于top:0。
(3)当相对定位元素同时应用对立方向定位值的时候,也就是top/bottom和left/right同时使用的时候,只有一个方向的定位属性会起作用。而谁起作用则是与文档流的顺序有关的,默认的文档流是自上而下、从左往右,因此top/bottom同时使用的时候,bottom失效;left/right同时使用的时候,right失效。
86.什么是层叠上下文?
层叠上下文,英文称作stackingcontext,是HTML中的一个三维的概念。如果一个元素含有层叠上下文,我们可以理解为这个元素在z轴上就“高人一等”。
层叠上下文元素有如下特性:
(1)层叠上下文的层叠水平要比普通元素高(原因后面会说明)。 (2)层叠上下文可以阻断元素的混合模式。 (3)层叠上下文可以嵌套,内部层叠上下文及其所有子元素均受制于外部的“层叠上下文”。 (4)每个层叠上下文和兄弟元素独立,也就是说,当进行层叠变化或渲染的时候,只需要考虑后代元素。 (5)每个层叠上下文是自成体系的,当元素发生层叠的时候,整个元素被认为是在父层叠上下文的层叠顺序中。
层叠上下文的创建:
(1)页面根元素天生具有层叠上下文,称为根层叠上下文。根层叠上下文指的是页面根元素,可以看成是元素。因此,页面中所有的元素一定处于至少一个“层叠结界”中。
(2)对于position值为relative/absolute以及Firefox/IE浏览器(不包括Chrome浏览器)下含有position:fixed声明的定位元素,当其z-index值不是auto的时候,会创建层叠上下文。Chrome等WebKit内核浏览器下,position:fixed元素天然层叠上下文元素,无须z-index为数值。根据我的测试,目前IE和Firefox仍是老套路。
(3)其他一些CSS3属性,比如元素的opacity值不是1。
87.什么是层叠水平?
层叠水平,英文称作stackinglevel,决定了同一个层叠上下文中元素在z轴上的显示顺序。
显而易见,所有的元素都有层叠水平,包括层叠上下文元素,也包括普通元素。然而,对普通元素的层叠水平探讨只局限在当前层叠上下文元素中。
88.元素的层叠顺序?
层叠顺序,英文称作 stackingorder,表示元素发生层叠时有着特定的垂直显示顺序。
89.层叠准则?
(1)谁大谁上:当具有明显的层叠水平标识的时候,如生效的z-index属性值,在同一个层叠上下文领域,层叠水平值大的那一个覆盖小的那一个。
(2)后来居上:当元素的层叠水平一致、层叠顺序相同的时候,在DOM流中处于后面的元素会覆盖前面的元素。
90.font-weight 的特殊性?
如果使用数值作为font-weight属性值,必须是100~900的整百数。因为这里的数值仅仅是外表长得像数值,
91.text-indent 的特殊性?
(1)text-indent仅对第一行内联盒子内容有效。
(2)非替换元素以外的display计算值为inline的内联元素设置text-indent值无效,如果计算值inline-block/inline-table则会生效。
(3)标签按钮text-indent值无效。
(4)标签按钮text-indent值有效。
(5)text-indent的百分比值是相对于当前元素的“包含块”计算的,而不是当前元素。
92.letter-spacing 与字符间距?
letter-spacing可以用来控制字符之间的间距,这里说的“字符”包括英文字母、汉字以及空格等。
letter-spacing具有以下一些特性。
(1)继承性。 (2)默认值是normal而不是0。虽然说正常情况下,normal的计算值就是0,但两者还是有差别的,在有些场景下,letter-spacing会调整normal的计算值以实现更好的版面布局。 (3)支持负值,且值足够大的时候,会让字符形成重叠,甚至反向排列。 (4)和text-indent属性一样,无论值多大或多小,第一行一定会保留至少一个字符。 (5)支持小数值,即使0.1px也是支持的。 (6)暂不支持百分比值。
93.word-spacing 与单词间距?
letter-spacing作用于所有字符,但word-spacing仅作用于空格字符。换句话说,word-spacing的作用就是增加空格的间隙宽度。
94.white-space 与换行和空格的控制?
white-space属性声明了如何处理元素内的空白字符,这类空白字符包括Space(空格)键、Enter(回车)键、Tab(制表符)键产生的空白。因此,white-space可以决定图文内容是否在一行显示(回车空格是否生效),是否显示大段连续空白(空格是否生效)等。
其属性值包括下面这些。 •normal:合并空白字符和换行符。 •pre:空白字符不合并,并且内容只在有换行符的地方换行。 •nowrap:该值和normal一样会合并空白字符,但不允许文本环绕。 •pre-wrap:空白字符不合并,并且内容只在有换行符的地方换行,同时允许文本环绕。 •pre-line:合并空白字符,但只在有换行符的地方换行,允许文本环绕。
95.隐藏元素的 background-image 到底加不加载?
根据测试,一个元素如果display计算值为none,在IE浏览器下(IE8~IE11,更高版本不确定)依然会发送图片请求,Firefox浏览器不会,至于Chrome和Safari浏览器则似乎更加智能一点:如果隐藏元素同时又设置了background-image,则图片依然会去加载;如果是父元素的display计算值为none,则背景图不会请求,此时浏览器或许放心地认为这个背景图暂时是不会使用的。
如果不是background-image,而是 元素,则设置display:none在所有浏览器下依旧都会请求图片资源。
还需要注意的是如果设置的样式没有对应的元素,则background-image也不会加载。hover情况下的background-image,在触 发时加载。
总结:
-(1)元素的背景图片
-元素本身设置 display:none,会请求图片 -父级元素设置 display:none,不会请求图片 -样式没有元素使用,不会请求 -:hover 样式下,触发时请求
-(2)img 标签图片任何情况下都会请求图片
CSS控制前端图片HTTP请求的各种情况示例
96.如何实现单行/多行文本溢出的省略(…)?
p {
overflow: hidden;
text- overflow: ellipsis;
white- space: nowrap;
}
p {
position: relative;
line- height: 1.5 em;
height: 3 em;
overflow: hidden;
}
p: after {
content: "..." ;
position: absolute;
bottom: 0 ;
right: 0 ;
background- color: #fff;
}
如何实现单行/多行文本溢出的省略(…) CSS多行文本溢出省略显示
97.常见的元素隐藏方式?
-(1)使用 display:none;隐藏元素,渲染树不会包含该渲染对象,因此该元素不会在页面中占据位置,也不会响应绑定的监听事件。
-(2)使用 visibility:hidden;隐藏元素。元素在页面中仍占据空间,但是不会响应绑定的监听事件。
-(3)使用 opacity:0;将元素的透明度设置为 0,以此来实现元素的隐藏。元素在页面中仍然占据空间,并且能够响应元素绑定的监听事件。
-(4)通过使用绝对定位将元素移除可视区域内,以此来实现元素的隐藏。
-(5)通过 z-index 负值,来使其他元素遮盖住该元素,以此来实现隐藏。
-(6)通过 clip/clip-path 元素裁剪的方法来实现元素的隐藏,这种方法下,元素仍在页面中占据位置,但是不会响应绑定的监听事件。
-(7)通过 transform:scale(0,0)来将元素缩放为 0,以此来实现元素的隐藏。这种方法下,元素仍在页面中占据位置,但是不会响应绑定的监听事件。
CSS 隐藏元素的八种方法
98.css 实现上下固定中间自适应布局?
利用绝对定位实现
body {
padding: 0 ;
margin: 0 ;
}
. header {
position: absolute;
top: 0 ;
width: 100 % ;
height: 100 px;
background: red;
}
. container {
position: absolute;
top: 100 px;
bottom: 100 px;
width: 100 % ;
background: green;
}
. footer {
position: absolute;
bottom: 0 ;
height: 100 px;
width: 100 % ;
background: red;
}
利用flex布局实现html,
body {
height: 100 % ;
}
body {
display: flex;
padding: 0 ;
margin: 0 ;
flex- direction: column;
}
. header {
height: 100 px;
background: red;
}
. container {
flex- grow: 1 ;
background: green;
}
. footer {
height: 100 px;
background: red;
}
css实现上下固定中间自适应布局
99.css 两栏布局的实现?
两栏布局一般指的是页面中一共两栏,左边固定,右边自适应的布局,一共有四种实现的方式。 以左边宽度固定为200px为例
(1)利用浮动,将左边元素宽度设置为200px,并且设置向左浮动。将右边元素的margin-left设置为200px,宽度设置为auto(默认为auto,撑满整个父元素)。
. outer {
height: 100 px;
}
. left {
float: left;
height: 100 px;
width: 200 px;
background: tomato;
}
. right {
margin- left: 200 px;
width: auto;
height: 100 px;
background: gold;
}
(2)第二种是利用flex布局,将左边元素的放大和缩小比例设置为0,基础大小设置为200px。将右边的元素的放大比例设置为1,缩小比例设置为1,基础大小设置为auto。
. outer {
display: flex;
height: 100 px;
}
. left {
flex- shrink: 0 ;
flex- grow: 0 ;
flex- basis: 200 px;
background: tomato;
}
. right {
flex: auto;
background: gold;
}
(3)第三种是利用绝对定位布局的方式,将父级元素设置相对定位。左边元素设置为absolute定位,并且宽度设置为 200px。将右边元素的margin-left的值设置为200px。
. outer {
position: relative;
height: 100 px;
}
. left {
position: absolute;
width: 200 px;
height: 100 px;
background: tomato;
}
. right {
margin- left: 200 px;
height: 100 px;
background: gold;
}
(4)第四种还是利用绝对定位的方式,将父级元素设置为相对定位。左边元素宽度设置为200px,右边元素设置为绝对定位,左边定位为200px,其余方向定位为0。
. outer {
position: relative;
height: 100 px;
}
. left {
width: 200 px;
height: 100 px;
background: tomato;
}
. right {
position: absolute;
top: 0 ;
right: 0 ;
bottom: 0 ;
left: 200 px;
background: gold;
}
回答:
两栏布局一般指的是页面中一共两栏,左边固定,右边自适应的布局,一共有四种实现的方式。
以左边宽度固定为 200px 为例
-(1)利用浮动,将左边元素宽度设置为 200px,并且设置向左浮动。将右边元素的 margin-left 设置为 200px,宽度设置为 auto(默认为 auto,撑满整个父元素)。
-(2)第二种是利用 flex 布局,将左边元素的放大和缩小比例设置为 0,基础大小设置为 200px。将右边的元素的放大比例设置为 1,缩小比例设置为 1,基础大小设置为 auto。
-(3)第三种是利用绝对定位布局的方式,将父级元素设置相对定位。左边元素设置为 absolute 定位,并且宽度设置为 200px。将右边元素的 margin-left 的值设置为 200px。
-(4)第四种还是利用绝对定位的方式,将父级元素设置为相对定位。左边元素宽度设置为 200px,右边元素设置为绝对定位,左边定位为 200px,其余方向定位为 0。
100.css 三栏布局的实现?
三栏布局一般指的是页面中一共有三栏,左右两栏宽度固定,中间自适应的布局,一共有五种实现方式。
这里以左边宽度固定为100px,右边宽度固定为200px为例。
(1)利用绝对定位的方式,左右两栏设置为绝对定位,中间设置对应方向大小的margin的值。
. outer {
position: relative;
height: 100 px;
}
. left {
position: absolute;
width: 100 px;
height: 100 px;
background: tomato;
}
. right {
position: absolute;
top: 0 ;
right: 0 ;
width: 200 px;
height: 100 px;
background: gold;
}
. center {
margin- left: 100 px;
margin- right: 200 px;
height: 100 px;
background: lightgreen;
}
(2)利用flex布局的方式,左右两栏的放大和缩小比例都设置为0,基础大小设置为固定的大小,中间一栏设置为auto
. outer {
display: flex;
height: 100 px;
}
. left {
flex: 00100 px;
background: tomato;
}
. right {
flex: 00200 px;
background: gold;
}
. center {
flex: auto;
background: lightgreen;
}
(3)利用浮动的方式,左右两栏设置固定大小,并设置对应方向的浮动。中间一栏设置左右两个方向的margin值,注意这种方式,中间一栏必须放到最后。
. outer {
height: 100 px;
}
. left {
float: left;
width: 100 px;
height: 100 px;
background: tomato;
}
. right {
float: right;
width: 200 px;
height: 100 px;
background: gold;
}
. center {
height: 100 px;
margin- left: 100 px;
margin- right: 200 px;
background: lightgreen;
}
(4)双飞翼布局,利用浮动和负边距来实现。父级元素设置左右的pedding,三列均设置向左浮动,中间一列放在最前面,宽度设置为父级元素的宽度,因此后面两列都被挤到了下一行,通过设置margin负值将其移动到上一行,再利用相对定位,定位到两边。
. outer {
height: 100 px;
padding- left: 100 px;
padding- right: 200 px;
}
. left {
position: relative;
left: - 100 px;
float: left;
margin- left: - 100 % ;
width: 100 px;
height: 100 px;
background: tomato;
}
. right {
position: relative;
left: 200 px;
float: right;
margin- left: - 200 px;
width: 200 px;
height: 100 px;
background: gold;
}
. center {
float: left;
width: 100 % ;
height: 100 px;
background: lightgreen;
}
(5)双飞翼布局,双飞翼布局相对于圣杯布局来说,左右位置的保留是通过中间列的margin值来实现的,而不是通过父元 素的pedding来实现的。本质上来说,也是通过浮动和外边距负值来实现的。
. outer {
height: 100 px;
}
. left {
float: left;
margin- left: - 100 % ;
width: 100 px;
height: 100 px;
background: tomato;
}
. right {
float: left;
margin- left: - 200 px;
width: 200 px;
height: 100 px;
background: gold;
}
. wrapper {
float: left;
width: 100 % ;
height: 100 px;
background: lightgreen;
}
. center {
margin- left: 100 px;
margin- right: 200 px;
height: 100 px;
}
回答:
三栏布局一般指的是页面中一共有三栏,左右两栏宽度固定,中间自适应的布局,一共有五种实现方式。
这里以左边宽度固定为100px,右边宽度固定为200px为例。
(1)利用绝对定位的方式,左右两栏设置为绝对定位,中间设置对应方向大小的margin的值。
(2)利用flex布局的方式,左右两栏的放大和缩小比例都设置为0,基础大小设置为固定的大小,中间一栏设置为auto。
(3)利用浮动的方式,左右两栏设置固定大小,并设置对应方向的浮动。中间一栏设置左右两个方向的margin值,注意这种方式,中间一栏必须放到最后。
(4)圣杯布局,利用浮动和负边距来实现。父级元素设置左右的pedding,三列均设置向左浮动,中间一列放在最前面,宽度设置为父级元素的宽度,因此后面两列都被挤到了下一行,通过设置margin负值将其移动到上一行,再利用相对定位,定位到两边。双飞翼布局中间列的宽度不能小于两边任意列的宽度,而双飞翼布局则不存在这个问题。
(5)双飞翼布局,双飞翼布局相对于圣杯布局来说,左右位置的保留是通过中间列的margin值来实现的,而不是通过父元素的pedding来实现的。本质上来说,也是通过浮动和外边距负值来实现的。
101.实现一个宽高自适应的正方形
1.第一种方式是利用vw来实现
. square {
width: 10 % ;
height: 10 vw;
background: tomato;
}
2.第二种方式是利用元素的margin/padding百分比是相对父元素width的性质来实现
. square {
width: 20 % ;
height: 0 ;
padding- top: 20 % ;
background: orange;
}
3.第三种方式是利用子元素的margin-top的值来实现的
. square {
width: 30 % ;
overflow: hidden;
background: yellow;
}
. square: : after {
content: "" ;
display: block;
margin- top: 100 % ;
}
102.css的三大特性:
1.继承性
2.成叠性
3.优先级
103.列出 display 的值,说明他们的作用。 position 的值,relative 和 absolute 定位原点是?
1、display的值
block 块类型。默认宽度为父元素宽度,可设置宽高,换行显示。
none 缺省值。象行内元素类型一样显示。
inline 行内元素类型。默认宽度为内容宽度,不可设置宽高,同行显示。
inline-block 默认宽度为内容宽度,可以设置宽高,同行显示。
list-item 象块类型元素一样显示,并添加样式列表标记。
table 此元素会作为块级表格来显示。
inherit 规定应该从父元素继承display 属性的值。
2、position 的值
absolute:生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位。
fixed: (老 IE 不支持) 生成绝对定位的元素,相对于浏览器窗口进行定位。
relative :生成相对定位的元素,相对于其正常位置进行定位。
static :默认值。没有定位,元素出现在正常的流中
*(忽略 top, bottom, left, right z-index 声明)。
inherit 规定从父元素继承 position 属性的值。
104.content-box和border-box,为什么看起来content-box更合理,但还是经常使用border-box?
content-box是W3C的标准盒模型 元素宽度+padding+border
border-box 是ie的怪异盒模型,他的元素宽度等于内容宽度 内容宽度包含了padding和border
比如有时候在元素基础上添加内边距padding或border会将布局撑破 但是使用border-box就可以轻松完成
border-box和content-box最直观的区别和解释
105.描述一下下面盒子的大小,颜色什么的(content-box模型)
有一说一,当时被字节面试官问到这个问题,我是挺蒙蔽的,因为他这里不指考了一点,问题列一下:
整个盒子的大小 padding的颜色 border的颜色 height为0了,看得见盒子吗? 答案:如图所示 整个盒子的大小 = 0 (因为height为0) padding的颜色 = pink(继承content的颜色) border的颜色 = blue(继承color字体的颜色,默认为black) height为0了,看得见盒子吗? (虽然height为0,但是看得见盒子,因为有border和padding) 这里需要注意:
如果没有写border-style,那么边框的宽度不管设置成多少,都是无效的。 border-color的颜色默认跟字体颜色相同 padding颜色跟背景颜色相同
js
1.介绍JavaScript的数据类型
基本数据类型:Undefined、Null、Boolean、Number、String 值类型:数值、布尔值、null、undefined。 引用类型:对象、数组、函数。 新类型:Symbol
Object 是 JavaScript 中所有对象的父对象 数据封装类对象:Object、Array、Boolean、Number 和 String 其他对象:Function、Arguments、Math、Date、RegExp、Error
JS最新基本数据类型:BigInt JS基本数据类型和引用数据类型的区别及深浅拷贝
2.栈和堆的区别
栈(stack):由编译器自动分配释放,存放函数的参数值,局部变量等; 堆(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由操作系统释放。
基本数据类型存储在栈中,引用数据类型(对象)存储在堆中,指针放在栈中。 两种类型的区别是:存储位置不同;原始数据类型直接存储在栈中的简单数据段,占据空间小、大小固定,属于被频繁使用数据,所以放入栈中存储;引用数据类型存储在堆中的对象,占据空间大、大小不固定,如果存储在栈中,将会影响程序运行的性能 引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。
3.Ajax使用
全称 : Asynchronous Javascript And XML 所谓异步,就是向服务器发送请求的时候,我们不必等待结果,而是可以同时做其他的事情,等到有了结果它自己会根据设定进行后续操作,与此同时,页面是不会发生整页刷新的,提高了用户体验。 创建Ajax的过程:
创建XMLHttpRequest对象(异步调用对象)
var xhr = new XMLHttpRequest ( ) ;
创建新的Http请求(方法、URL、是否异步)
xhr. open ( ‘get ’, ’example. php’, false ) ;
设置响应HTTP请求状态变化的函数。 onreadystatechange事件中readyState属性等于4。 响应的HTTP状态为200(OK)或者304(Not Modified)。
发送http请求
xhr. send ( data) ;
获取异步调用返回的数据 注意:
页面初次加载时,尽量在web服务器一次性输出所有相关的数据,只在页面加载完成之后,用户进行操作时采用ajax进行交互。
同步ajax在IE上会产生页面假死的问题。所以建议采用异步ajax。
尽量减少ajax请求次数
ajax安全问题,对于敏感数据在服务器端处理,避免在客户端处理过滤。对于关键业务逻辑代码也必须放在服务器端处理。
4. 如何创建一个对象/js的几种继承方式
工厂模式
构造函数模式
原型模式
混合构造函数和原型模式
动态原型模式
寄生构造函数模式
稳妥构造函数模式
程序的设计模式?工厂模式?发布订阅? 1)设计模式并不是某种语言的某块代码,设计模式是一种思想,提供给在编码时候遇到的各种问题是可以采取的解决方案,更倾向于一种逻辑思维,而不是万能代码块。 设计模式主要分三个类型:创建型、结构型和行为型。 创建型模式:单例模式,抽象工厂模式,建造者模式,工厂模式与原型模式。 结构型模式:适配器模式,桥接模式,装饰者模式,组合模式,外观模式,享元模式以及代理模式。 行为型模式:模板方法模式,命令模式,迭代器模式,观察者模式,中介者模式,备忘录模式,解释器模式,状态模式,策略模式,职责链模式和访问者模式。
2)与创建型模式类似,工厂模式创建对象(视为工厂里的产品)是无需指定创建对象的具体类。 工厂模式定义一个用于创建对象的接口,这个接口由子类决定实例化哪一个类。该模式使一个类的实例化延迟到了子类。而子类可以重写接口方法以便创建的时候指定自己的对象类型。
3)观察者模式又叫做发布订阅模式,它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生改变时就会通知所有观察着对象。它是由两类对象组成,主题和观察者,主题负责发布事件,同时观察者通过订阅这些事件来观察该主体,发布者和订阅者是完全解耦的,彼此不知道对方的存在,两者仅仅共享一个自定义事件的名称。
JavaScript实现类与继承的方法
5. Javascript作用域链
作用域链的原理和原型链很类似,如果这个变量在自己的作用域中没有,那么它会寻找父级的,直到最顶层。 注意:JS没有块级作用域,若要形成块级作用域,可通过(function(){})();立即执行的形式实现。
深入理解JavaScript作用域和作用域链
6.谈谈this的理解
this总是指向函数的直接调用者(而非间接调用者)
如果有new关键字,this指向new出来的那个对象
在事件中,this指向目标元素,特殊的是IE的attachEvent中的this总是指向全局对象window。
7.eval是做什么的?
它的功能是把对应的字符串解析成JS代码并运行;应该避免使用eval,不安全,非常耗性能(2次,一次解析成js语句,一次执行)。
8.什么是window对象? 什么是document对象?
window对象代表浏览器中打开的一个窗口。document对象代表整个html文档。实际上,document对象是window对象的一个属性。
9.null,undefined的区别?
null表示一个对象被定义了,但存放了空指针,转换为数值时为0。 undefined表示声明的变量未初始化,转换为数值时为NAN。 typeof(null) – object; typeof(undefined) – undefined
10.事件流?事件捕获?事件冒泡?
事件流:从页面中接收事件的顺序。也就是说当一个事件产生时,这个事件的传播过程,就是事件流。
IE中的事件流叫事件冒泡;事件冒泡:事件开始时由最具体的元素接收,然后逐级向上传播到较为不具体的节点(文档)。对于html来说,就是当一个元素产生了一个事件,它会把这个事件传递给它的父元素,父元素接收到了之后,还要继续传递给它的上一级元素,就这样一直传播到document对象(亲测现在的浏览器到window对象,只有IE8及下不这样
事件捕获是不太具体的元素应该更早接受到事件,而最具体的节点应该最后接收到事件。他们的用意是在事件到达目标之前就捕获它;也就是跟冒泡的过程正好相反,以html的click事件为例,document对象(DOM级规范要求从document开始传播,但是现在的浏览器是从window对象开始的)最先接收到click事件的然后事件沿着DOM树依次向下传播,一直传播到事件的实际目标;
关于事件,IE与火狐的事件机制有什么区别? 如何阻止冒泡? IE为事件冒泡,Firefox同时支持事件捕获和事件冒泡。但并非所有浏览器都支持事件捕获。jQuery中使用event.stopPropagation()方法可阻止冒泡;(旧IE的方法 ev.cancelBubble = true;)
js–事件–事件流
11. 什么是闭包(closure),为什么要用它?
闭包指的是一个函数可以访问另一个函数作用域中变量。常见的构造方法,是在一个函数内部定义另外一个函数。内部函数可以引用外层的变量;外层变量不会被垃圾回收机制回收。 注意,闭包的原理是作用域链,所以闭包访问的上级作用域中的变量是个对象,其值为其运算结束后的最后一个值。
优点:避免全局变量污染。缺点:容易造成内存泄漏。
例子:
function makeFunc ( ) {
var name = "Mozilla" ;
function displayName ( ) {
console. log ( name) ;
}
return displayName;
}
var myFunc = makeFunc ( ) ;
myFunc ( ) ;
myFunc 变成一个 闭包。闭包是一种特殊的对象。 它由两部分构成:函数,以及创建该函数的环境。 环境由闭包创建时在作用域中的任何局部变量组成。 在我们的例子中,myFunc 是一个闭包,由 displayName 函数和闭包创建时存在的 “Mozilla” 字符串形成。
12.javascript 代码中的"use strict";是什么意思 ? 使用它区别是什么?
除了正常模式运行外,ECMAscript添加了第二种运行模式:“严格模式”。
作用:
消除js不合理,不严谨地方,减少怪异行为
消除代码运行的不安全之处,
提高编译器的效率,增加运行速度
为未来的js新版本做铺垫。
13.如何判断一个对象是否属于某个类?
使用instanceof 即if(a instanceof Person){alert(‘yes’);}
14.new操作符具体干了什么呢?
创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型。
属性和方法被加入到 this 引用的对象中。
新创建的对象由 this 所引用,并且最后隐式的返回 this 。
15.对JSON的了解?
全称:JavaScript Object Notation JSON中对象通过“{}”来标识,一个“{}”代表一个对象,如{“AreaId”:”123”},对象的值是键值对的形式(key:value)。 JSON是JS的一个严格的子集,一种轻量级的数据交换格式,类似于xml。数据格式简单,易于读写,占用带宽小。
两个函数: JSON.parse(str) 解析JSON字符串 把JSON字符串变成JavaScript值或对象
JSON.stringify(obj) 将一个JavaScript值(对象或者数组)转换为一个 JSON字符串
eval(’(‘+json+’)’) 用eval方法注意加括号 而且这种方式更容易被攻击
16.JS延迟加载的方式有哪些?
JS的延迟加载有助与提高页面的加载速度。
defer和async、动态创建DOM方式(用得最多)、按需异步载入JS
defer:延迟脚本。立即下载,但延迟执行(延迟到整个页面都解析完毕后再运行),按照脚本出现的先后顺序执行。 async:异步脚本。下载完立即执行,但不保证按照脚本出现的先后顺序执行。
17.同步和异步的区别?
javascript同步表示sync,指:代码依次执行 javascript异步表示async,指:代码执行不按顺序,‘跳过’执行,待其他某些代码执行完后再来执行,成为异步。
同步的概念在操作系统中:不同进程协同完成某项工作而先后次序调整(通过阻塞、唤醒等方式),同步强调的是顺序性,谁先谁后。异步不存在顺序性。
同步:浏览器访问服务器,用户看到页面刷新,重新发请求,等请求完,页面刷新,新内容出现,用户看到新内容之后进行下一步操作。
异步:浏览器访问服务器请求,用户正常操作,浏览器在后端进行请求。等请求完,页面不刷新,新内容也会出现,用户看到新内容。
18.什么是跨域问题 ,如何解决跨域问题?
什么是跨域以及几种简单解决方案 关于跨域,你想知道的全在这里
19.页面编码和被请求的资源编码如果不一致如何处理?
若请求的资源编码,如外引js文件编码与页面编码不同。可根据外引资源编码方式定义为 charset=“utf-8"或"gbk”。 比如:http://www.yyy.com/a.html 中嵌入了一个http://www.xxx.com/test.js a.html 的编码是gbk或gb2312的。 而引入的js编码为utf-8的 ,那就需要在引入的时候
< script src= "http://www.xxx.com/test.js" charset=" utf- 8 "> < / script>
20.模块化开发怎么做?
模块化开发指的是在解决某一个复杂问题或者一系列问题时,依照一种分类的思维把问题进行系统性的分解。模块化是一种将复杂系统分解为代码结构更合理,可维护性更高的可管理的模块方式。对于软件行业:系统被分解为一组高内聚,低耦合的模块。 (1)定义封装的模块 (2)定义新模块对其他模块的依赖 (3)可对其他模块的引入支持。在JavaScript中出现了一些非传统模块开发方式的规范。 CommonJS的模块规范,AMD(Asynchronous Module Definition),CMD(Common Module Definition)等。AMD是异步模块定义,所有的模块将被异步加载,模块加载不影响后边语句运行。
21. AMD(Modules/Asynchronous-Definition)、CMD(Common Module Definition)规范区别?
AMD 是 RequireJS 在推广过程中对模块定义的规范化产出。CMD 是 SeaJS 在推广过程中对模块定义的规范化产出。 区别:
对于依赖的模块,AMD 是提前执行,CMD 是延迟执行。不过 RequireJS 从 2.0 开始,也改成可以延迟执行(根据写法不同,处理方式不同)。
CMD 推崇依赖就近,只有在用到某个模块的时候再去require AMD 推崇依赖前置,在定义模块的时候就要声明其依赖的模块 。
AMD 的 API 默认是一个当多个用,CMD 的 API 严格区分,推崇职责单一。
CMD加载完某个依赖模块后并不执行,只是下载而已,在所有依赖模块加载完成后进入主逻辑,遇到require语句的时候才执行对应的模块,这样模块的执行顺序和书写顺序是完全一致的
AMD在加载模块完成后就会执行改模块,所有模块都加载执行完后会进入require的回调函数,执行主逻辑,这样的效果就是依赖模块的执行顺序和书写顺序不一定一致,看网络速度,哪个先下载下来,哪个先执行,但是主逻辑一定在所有依赖加载完成后才执行
这也是很多人说AMD用户体验好,因为没有延迟,依赖模块提前执行了,CMD性能好,因为只有用户需要的时候才执行的原因
define ( function ( require, exports, module) {
var a = require ( './a' )
a. doSomething ( )
var b = require ( './b' )
b. doSomething ( )
} )
define ( [ './a' , './b' ] , function ( a, b) {
a. doSomething ( ) ;
b. doSomething ( ) ;
} )
AMD、CMD、CommonJs、ES6的对比
commonjs?requirejs?AMD|CMD|UMD?
1.CommonJS就是为JS的表现来制定规范,NodeJS是这种规范的实现,webpack 也是以CommonJS的形式来书写。因为js没有模块的功能,所以CommonJS应运而生。但它不能在浏览器中运行。 CommonJS定义的模块分为:{模块引用(require)} {模块定义(exports)} {模块标识(module)}
2.RequireJS 是一个JavaScript模块加载器。 RequireJS有两个主要方法(method): define()和require()。这两个方法基本上拥有相同的定义(declaration) 并且它们都知道如何加载的依赖关系,然后执行一个回调函数(callback function)。与require()不同的是, define()用来存储代码作为一个已命名的模块。 因此define()的回调函数需要有一个返回值作为这个模块定义。这些类似被定义的模块叫作AMD (Asynchronous Module Definition,异步模块定义)。
3.AMD 是 RequireJS 在推广过程中对模块定义的规范化产出 AMD异步加载模块。它的模块支持对象 函数 构造器 字符串 JSON等各种类型的模块。 适用AMD规范适用define方法定义模块。
4.CMD是SeaJS 在推广过程中对模块定义的规范化产出 AMD与CDM的区别: (1)对于于依赖的模块,AMD 是提前执行(好像现在也可以延迟执行了),CMD 是延迟执行。 (2)AMD 推崇依赖前置,CMD 推崇依赖就近。 (3)AMD 推崇复用接口,CMD 推崇单用接口。 (4)书写规范的差异。
5.umd是AMD和CommonJS的糅合。 AMD 浏览器第一的原则发展 异步加载模块。 CommonJS模块以服务器第一原则发展,选择同步加载,它的模块无需包装(unwrapped modules)。这迫使人们又想出另一个更通用的模式UMD ( Universal Module Definition ), 希望解决跨平台的解决方案。UMD先判断是否支持Node.js的模块( exports )是否存在,存在则使用Node.js模块模式。
22.requireJS的核心原理是什么?(如何动态加载的?如何避免多次加载的?如何缓存的?)
核心是js的加载模块,通过正则匹配模块以及模块的依赖关系,保证文件加载的先后顺序,根据文件的路径对加载过的文件做了缓存。
RequireJs简单使用
23. call和apply
call()方法和apply()方法的作用相同,动态改变某个类的某个方法的运行环境。他们的区别在于接收参数的方式不同。在使用call()方法时,传递给函数的参数必须逐个列举出来。使用apply()时,传递给函数的是参数数组。
24.documen.write和 innerHTML的区别
document.write()只能重绘整个页面
setTimeout ( function ( ) {
document. write ( '5 secs later
' ) ;
} , 5000 ) ;
或
window. onload = function ( ) {
document. write ( "HI" ) ;
innerHTML可以重绘页面的一部分
25.回流与重绘
当渲染树中的一部分(或全部)因为元素的规模尺寸,布局,隐藏等改变而需要重新构建。这就称为回流(reflow)。每个页面至少需要一次回流,就是在页面第一次加载的时候。在回流的时候,浏览器会使渲染树中受到影响的部分失效,并重新构造这部分渲染树。完成回流后,浏览器会重新绘制受影响的部分到屏幕中,该过程成为重绘
区别: 回流必将引起重绘,而重绘不一定会引起回流。比如:只有颜色改变的时候就只会发生重绘而不会引起回流 当页面布局和几何属性改变时就需要回流 比如:添加或者删除可见的DOM元素,元素位置改变,元素尺寸改变——边距、填充、边框、宽度和高度,内容改变
26.DOM操作
(1)创建新节点 createDocumentFragment() //创建一个DOM片段 createElement() //创建一个具体的元素 createTextNode() //创建一个文本节点 (2)添加、移除、替换、插入 appendChild() removeChild() replaceChild() insertBefore() //在已有的子节点前插入一个新的子节点 (3)查找 getElementsByTagName() //通过标签名称 getElementsByName() //通过元素的Name属性的值(IE容错能力较强,会得到一个数组,其中包括id等于name值的) getElementById() //通过元素Id,唯一性
27.数组对象有哪些原生方法,列举一下
pop、push、shift、unshift、splice、reverse、sort、concat、join、slice、toString、indexOf、lastIndexOf、reduce、reduceRight forEach、map、filter、every、some
28.哪些操作会造成内存泄漏
内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
造成内存泄漏: setTimeout 的第一个参数使用字符串而非函数的话,会引发内存泄漏。 闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)、全局变量、DOM清空或删除时,事件未清除、子元素存在引用
防止内存泄露: 1、不要动态绑定事件; 2、不要在动态添加,或者会被动态移除的dom上绑事件,用事件冒泡在父容器监听事件; 3、如果要违反上面的原则,必须提供destroy方法,保证移除dom后事件也被移除,这点可以参考Backbone的源代码,做的比较好; 4、单例化,少创建dom,少绑事件。
29.什么是Cookie 隔离?(或者:请求资源的时候不要带cookie怎么做)
通过使用多个非主要域名来请求静态文件,如果静态文件都放在主域名下,那静态文件请求的时候带有的cookie的数据提交给server是非常浪费的,还不如隔离开。 因为cookie有域的限制,因此不能跨域提交请求,故使用非主要域名的时候,请求头中就不会带有cookie数据,这样可以降低请求头的大小,降低请求时间,从而达到降低整体请求延时的目的。同时这种方式不会将cookie传入server,也减少了server对cookie的处理分析环节,提高了server的http请求的解析速度。
30.XML与JSON的区别?
数据体积方面。JSON相对于XML来讲,数据的体积小,传递的速度更快些。
数据交互方面。JSON与JavaScript的交互更加方便,更容易解析处理,更好的数据交互。
数据描述方面。JSON对数据的描述性比XML较差。
传输速度方面。JSON的速度要远远快于XML。
31.Web Worker和Web Socket?
web socket:在一个单独的持久连接上提供全双工、双向的通信。使用自定义的协议(ws://、wss://),同源策略对web socket不适用。
web worker:运行在后台的JavaScript,不影响页面的性能。 Web Worker 的作用,就是为 JavaScript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行。 创建worker:var worker = new Worker(url); 向worker发送数据:worker.postMessage(data); 接收worker返回的数据:worker.onmessage 终止一个worker的执行:worker.terminate();
WebSocket 教程 Web Worker 使用教程
32.JS垃圾回收机制?
标记清除:总体思想是将寻找不再使用的对象变为寻找无法到达的对象,即从根部(全局对象)出发定时扫描内存中的对象,凡是能从根部到达的对象都是还需要使用的。
垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记
从根部出发将能触及到的对象的标记清除
还存在标记的变量被视为准备删除的变量
垃圾收集器执行最后一步内存清除工作,销毁那些带标记的值并回收它们所占用的内存空间
引用计数:统计引用类型变量声明后被引用次数,当次数为0时该变量被回收。 该算法有个限制:无法处理循环引用。两个对象被创建,并互相引用,形成了一个循环。它们被调用之后不会离开函数作用域,所以它们已经没有用了,可以被回收了。然而,引用计数算法考虑到它们互相都有至少一次引用,所以它们不会被回收。 该方式会引起内存泄漏的原因是它不能解决循环引用的问题:
function sample ( ) {
var a= {
} ;
var b= {
} ;
a. prop = b;
b. prop = a;
}
这种情况下每次调用sample()函数,a和b的引用计数都是2,会使这部分内存永远不会被释放,即内存泄漏。
JS垃圾回收机制
33.web应用从服务器主动推送data到客户端的方式?
JavaScript数据推送:commet(基于http长连接的服务器推送技术)。 基于web socket的推送:SSE(server-send Event)
34.如何删除一个cookie?
1) 将cookie的失效时间设置为过去的时间(expires)
document. cookie = ‘user= ’+ encodeURIComponent ( ‘name’) + ';
expires= ’+ new Date ( 0 ) ;
2) 将系统时间设置为当前时间往前一点时间
var data = new Date ( ) ;
date. setDate ( date. getDate ( ) - 1 ) ;
35.attribute与property的区别?
attribute是dom元素在文档中作为html标签拥有的属性 property是dom元素在js中作为对象拥有的属性。 所以,对于html的标准属性来说,attribute和property是同步的,是会自动更新的。但对于自定义属性,他们不同步。
JS中attribute和property的区别
36.Ajax请求的页面历史记录状态问题?
(1)通过location.hash记录状态,让浏览器记录Ajax请求时页面状态的变化。 (2)通过HTML5的history.pushstate,来实现浏览器地址栏的无刷新改变。
37.声明函数作用提升?声明变量和声明函数的提升有什么区别?
(1) 变量声明提升:变量申明在进入执行上下文就完成了。 只要变量在代码中进行了声明,无论它在哪个位置上进行声明, js引擎都会将它的声明放在范围作用域的顶部;
(2) 函数声明提升:执行代码之前会先读取函数声明,意味着可以把函数申明放在调用它的语句后面。 只要函数在代码中进行了声明,无论它在哪个位置上进行声明, js引擎都会将它的声明放在范围作用域的顶部;
(3) 变量or函数声明:函数声明会覆盖变量声明,但不会覆盖变量赋值。 同一个名称标识a,即有变量声明var a,又有函数声明function a() {},不管二者声明的顺序,函数声明会覆盖变量声明,也就是说,此时a的值是声明的函数function a() {}。注意:如果在变量声明的同时初始化a,或是之后对a进行赋值,此时a的值变量的值。eg: var a; var c = 1; a = 1; function a() { return true; } console.log(a);
38.判断数据类型?
typeof:返回值是一个字符串,用来说明变量的数据类型。 typeof 一般只能返回如下几个结果:number、boolean、string、function、object、undefined。 对于 Array,Null 等特殊对象使用 typeof 一律返回 object,这正是 typeof 的局限性。
判断已知对象类型的方法: instanceof,instanceof 用于判断一个变量是否属于某个对象的实例。后面一定要是对象类型,并且大小写不能错,该方法适合一些条件选择或分支。
39.异步编程?
方法1:回调函数,优点是简单、容易理解和部署,缺点是不利于代码的阅读和维护,各个部分之间高度耦合(Coupling),流程会很混乱,而且每个任务只能指定一个回调函数。
方法2:时间监听,可以绑定多个事件,每个事件可以指定多个回调函数,而且可以“去耦合”(Decoupling),有利于实现模块化。缺点是整个程序都要变成事件驱动型,运行流程会变得很不清晰。
方法3:发布/订阅,性质与“事件监听”类似,但是明显优于后者。
方法4:Promises对象,是CommonJS工作组提出的一种规范,目的是为异步编程提供统一接口。 简单说,它的思想是,每一个异步任务返回一个Promise对象,该对象有一个then方法,允许指定回调函数。
Javascript异步编程的4种方法
40.平时工作中怎么样进行数据交互?如果后台没有提供数据怎么样进行开发?mock数据与后台返回的格式不同意怎么办?
由后台编写接口文档、提供数据接口实、前台通过ajax访问实现数据交互; 在没有数据的情况下寻找后台提供静态数据或者自己定义mock数据; 返回数据不统一时编写映射文件 对数据进行映射。
前端mock数据(超级详细)
41.自执行函数?用于什么场景?好处?
自执行函数:1、声明一个匿名函数2、马上调用这个匿名函数。 作用:创建一个独立的作用域。
好处:防止变量弥散到全局,以免各种js库冲突。隔离作用域避免污染,或者截断作用域链,避免闭包造成引用变量无法释放。利用立即执行特性,返回需要的业务函数或对象,避免每次通过条件判断来处理
场景:一般用于框架、插件等场景
42.什么是构造函数?与普通函数有什么区别?
构造函数:是一种特殊的方法、主要用来创建对象时初始化对象,总与new运算符一起使用,创建对象的语句中构造函数的函数名必须与类名完全相同。 与普通函数相比只能由new关键字调用,构造函数是类的标示
43.节点类型?判断当前节点类型?
元素节点
属性节点
文本节点
注释节点
文档节点
通过nodeObject.nodeType判断节点类型:其中,nodeObject 为DOM节点(节点对象)。该属性返回以数字表示的节点类型,例如,元素节点返回 1,属性节点返回 2 。
44. 显式转换 隐式转换?
隐式类型转换: 在使用算术运算符时,运算符两边的数据类型可以是任意的,比如,一个字符串可以和数字相加。之所以不同的数据类型之间可以做运算,是因为JavaScript引擎在运算之前会悄悄的把他们进行了隐式类型转换的 (例如:x+"" //等价于String(x) +x //等价于Number(x) x-0 //同上 !!x //等价于Boolean(x),是双叹号)
显式转换: 如果程序要求一定要将某一类型的数据转换为另一种类型,则可以利用强制类型转换运算符进行转换,这种强制转换过程称为显示转换。 显示转换是你定义让这个值类型转换成你要用的值类型,是底到高的转换。例 int 到float就可以直接转,int i=5,想把他转换成char类型,就用显式转换(char)i
45.Jq中如何实现多库并存?
Noconfict 多库共存就是“$ ”符号的冲突。
方法一: 利用jQuery的实用函数$.noConflict();这个函数归还$的名称控制权给另一个库,因此可以在页面上使用其他库。这时,我们可以用"jQuery "这个名称调用jQuery的功能。 $.noConflict(); jQuery(’#id’).hide(); … //或者给jQuery一个别名 var $j=jQuery $j(’#id’).hide(); …
方法二: (function($){})(jQuery) 这个表单是看上去会让人觉得有点晕,其实很简单。
前半部分:(function($){/代码块 /})
这是一个函数声明,并用括号括起来够成一个表达式,表达式的返回值就是这个函数的引用。
在这个函数中用$作为参数。所以在注释代码块用可以使用$符号。
后半部分:(jQuery)
在前半半部分返回函数引用后传递jQuery对象参数。
其实,可以把(function($){/代码块 /})(jQuery) 拆分成:
//声明函数 var fun=function($){/代码块 /}; //调用函数 fun(jQuery);
方法三: jQuery(function($){}) 通过传递一个函数作为jQuery的参数,因此把这个函数声明为就绪函数。 我们声明$为就绪函数的参数,因为jQuery总是吧jQuery对象的引用作为第一个参数传递,所以就保证了函数的执行。
46.Jq如何判断元素显示隐藏?
第一种:使用CSS属性
var display = $ ( '#id' ) . css ( 'display' ) ;
if ( display == 'none' ) {
alert ( "我是隐藏的!" ) ; }
第二种:使用jquery内置选择器
< div id= "test" > < p> 仅仅是测试所用< / p> < / div>
if ( $ ( "#test" ) . is ( ":hidden" ) ) {
$ ( "#test" ) . show ( ) ;
} else {
$ ( "#test" ) . hide ( ) ;
}
第三种:jQuery判断元素是否显示 是否隐藏
var node= $ ( '#id' ) ;
if ( node. is ( ':hidden' ) ) {
node. show ( ) ;
} else {
node. hide ( ) ;
}
47.什么是移动端的300ms延迟?移动端上什么是点击穿透?
移动端300ms延迟:假定这么一个场景。用户在 浏览器里边点击了一个链接。由于用户可以进行双击缩放或者双击滚动的操作,当用户一次点击屏幕之后,浏览器并不能立刻判断用户是确实要打开这个链接,还是想要进行双击操作。因此,浏览器 就等待 300 毫秒,以判断用户是否再次点击了屏幕。也就是说,当我们点击页面的时候移动端浏览器并不是立即作出反应,而是会等上一小会儿才会出现点击的效果。
点击穿透:假如页面上有两个元素A和B。B元素在A元素之上。我们在B元素的touchstart事件上注册了一个回调函数,该回调函数的作用是隐藏B元素。我们发现,当我们点击B元素,B元素被隐藏了,随后,A元素触发了click事件。这是因为在移动端浏览器,事件执行的顺序是touchstart > touchend > click。而click事件有300ms的延迟,当touchstart事件把B元素隐藏之后,隔了300ms,浏览器触发了click事件,但是此时B元素不见了,所以该事件被派发到了A元素身上。如果A元素是一个链接,那此时页面就会意外地跳转。
点击穿透现象有3种:
点击穿透问题:点击蒙层(mask)上的关闭按钮,蒙层消失后发现触发了按钮下面元素的click事件
跨页面点击穿透问题:如果按钮下面恰好是一个有href属性的a标签,那么页面就会发生跳转
另一种跨页面点击穿透问题:这次没有mask了,直接点击页内按钮跳转至新页,然后发现新页面中对应位置元素的click事件被触发了
300ms延迟解决方案: (1) 禁用缩放,在html文档头部加meta标签如下:
(2) 更改默认的视口宽度 (响应式布局,消除了站点上可能存在的双击绽放的请求)
(3) Css touch-action touch-action:none;在该元素上的操作不会触发用户代理的任何行为,无需进行3000ms延迟判断。
(4) FastClick为解决移动端浏览器300毫秒延迟开发的一个轻量级的库
点击穿透解决方案: 1、只用touch 最简单的解决方案,完美解决点击穿透问题 把页面内所有click全部换成touch事件( touchstart、’touchend’、’tap’)
2、只用click 下下策,因为会带来300ms延迟,页面内任何一个自定义交互都将增加300毫秒延迟
3、tap后延迟350ms再隐藏mask 改动最小,缺点是隐藏mask变慢了,350ms还是能感觉到慢的
4、pointer-events 比较麻烦且有缺陷, 不建议使用mask隐藏后,给按钮下面元素添上 pointer-events: none; 样式,让click穿过去,350ms后去掉这个样式,恢复响应缺陷是mask消失后的的350ms内,用户可以看到按钮下面的元素点着没反应,如果用户手速很快的话一定会发现
点击穿透
48.Jq绑定事件的几种方式?on bind ?
jQuery中提供了四种事件监听方式,分别是bind、live、delegate、on,对应的解除监听的函数分别是unbind、die、undelegate、off
Bind( )是使用频率较高的一种,作用就是在选择到的元素上绑定特定事件类型的监听函数;
Live( )可以对后生成的元素也可以绑定相应的事件,处理机制就是把事件绑定在DOM树的根节点上,而不是直接绑定在某个元素上;
Delegate( )采用了事件委托的概念,不是直接为子元素绑定事件,而是为其父元素(或祖先元素也可)绑定事件,当在div内任意元素上点击时,事件会一层层从event target向上冒泡,直至到达你为其绑定事件的元素;
on( )方法可以绑定动态添加到页面元素的事件,on()方法绑定事件可以提升效率;
49.Jq中如何将一个jq对象转化为dom对象?
方法一: jQuery对象是一个数据对象,可以通过[index]的方法,来得到相应的DOM对象。 如:
var $v = $ ( "#v" ) ;
var v= $v[ 0 ] ;
alert ( v. checked)
方法二: jQuery本身提供,通过.get(index)方法,得到相应的DOM对象 如:
var $v= $ ( "#v" ) ;
var v= $v. get ( 0 ) ;
alert ( v. checked)
50.Jq中有几种选择器?分别是什么?
层叠选择器、基本过滤选择器、内容过滤选择器、可视化过滤选择器、属性过滤选择器、子元素过滤选择器、表单元素选择器、表单元素过滤选择器
Jq中的选择器
51.Jq中怎么样编写插件?
jQuery. foo = function ( ) {
alert ( 'This is a test. This is only a test.' ) ; } ;
jQuery. foo = function ( ) {
alert ( 'This is a test. This is only a test.' ) ; } ;
jQuery. bar = function ( param) {
alert ( 'This function takes a parameter, which is "' + param + '".' ) ; } ; 调用时和一个函数的一样的: jQuery. foo ( ) ; jQuery. bar ( ) ; 或者$. foo ( ) ; $. bar ( 'bar' ) ;
jQuery. extend ( {
foo: function ( ) {
alert ( 'This is a test. This is only a test.' ) ;
} ,
bar: function ( param) {
alert ( 'This function takes a parameter, which is "' + param + '".' ) ;
}
} ) ;
jQuery. myPlugin = {
foo: function ( ) {
alert ( 'This is a test. This is only a test.' ) ;
} ,
bar: function ( param) {
alert ( 'This function takes a parameter, which is "' + param + '".' ) ;
}
} ;
$. myPlugin. foo ( ) ;
$. myPlugin. bar ( 'baz' ) ;
( function ( $) {
$. fn. extend ( {
pluginName: function ( opt, callback) {
}
} )
} ) ( jQuery) ;
( function ( $) {
$. fn. pluginName = function ( ) {
} ;
} ) ( jQuery) ;
jquery编写插件实例
52.$.map和$.each有什么区别
map()方法主要用来遍历操作数组和对象,会返回一个新的数组。$.map()方法适用于将数组或对象每个项目新阵列映射到一个新数组的函数; each()主要用于遍历jquery对象,返回的是原来的数组,并不会新创建一个数组。
53.简述下工作流程
我在之前的公司工作流程大概是这样的:公司定稿会结束以后,会进行简单的技术研讨,然后我们前端会进行先期的技术准备。前端切图人员会进行psd设计稿切图,并且将css文件进行整合。我们主要编写JS部分,其中包括搭建前端框架(大项目),编写js业务和数据持久化操作,我们也会编写js插件并且进行封装方便使用,还有就是编写JS前端组建和JS测试单元,最后将完成的JS部分与切图人员提供的HTML页面进行整合。最后对完成的页面进行功能测试、页面兼容、产品还原。然后对产品进行封存,提交测试。如果出现BUG会返回给我们开发人员进行修改,再提交测试,最后测试成功,进行版本封存。等到程序全部上线的时候进行线上测试。
54.版本控制工具:svn如何对文件加锁
svn加锁目的:为了避免多个人同一时间对同一个文件改动的相互覆盖,版本控制系统就必须有一套冲突处理机制。
svn加锁两种策略:乐观加锁:所有签出的文件都是可读写的,对文件的修改不必获得文件的锁,当你修改完文件签入时,会首先要求你更新本地文件,版本控制系统不会覆盖你的本地修改,而是会让你自己合并冲突后签入。
严格加锁:所有签出的文件都是只读的,任何对文件的修改必须要获得文件的锁,如果其他人没有拥有该文件的锁,那么版本控制系统就会授权给你文件的锁,并将文件设置为可编辑的。
svn两种加锁步骤:乐观加锁:选择你想要获取锁定的文件,然后右键菜单点击TortoiseSVN 选取获取锁定。
严格加锁:在想要采取严格加锁的文件或目录上点击右键,使用TortoiseSVN 属性菜单,点击新建属性,选择需要锁定。
55.git 和 svn的区别?
SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就纳闷了。
Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
56. jquery和zepto有什么区别?
1.针对移动端程序,Zepto有一些基本的触摸事件可以用来做触摸屏交互(tap事件、swipe事件),Zepto是不支持IE浏览器的,这不是Zepto的开发者Thomas Fucks在跨浏览器问题上犯了迷糊,而是经过了认真考虑后为了降低文件尺寸而做出的决定,就像jQuery的团队在2.0版中不再支持旧版的IE(6 7 8)一样。因为Zepto使用jQuery句法,所以它在文档中建议把jQuery作为IE上的后备库。那样程序仍能在IE中,而其他浏览器则能享受到Zepto在文件大小上的优势,然而它们两个的API不是完全兼容的,所以使用这种方法时一定要小心,并要做充分的测试。
2.Dom操作的区别:添加id时jQuery不会生效而Zepto会生效。
3.zepto主要用在移动设备上,只支持较新的浏览器,好处是代码量比较小,性能也较好。 jquery主要是兼容性好,可以跑在各种pc,移动上,好处是兼容各种浏览器,缺点是代码量大,同时考虑兼容,性能也不够好。
57. $(function(){})和window.onload 和 $(document).ready(function(){})
window.onload:用于当页面的所有元素,包括外部引用文件,图片等都加载完毕时运行函数内的函数。load方法只能执行一次,如果在js文件里写了多个,只能执行最后一个。
$(document).ready(function(){})和$(function(){})都是用于当页面的标准DOM元素被解析成DOM树后就执行内部函数。这个函数是可以在js文件里多次编写的,对于多人共同编写的js就有很大的优势,因为所有行为函数都会执行到。而且$(document).ready()函数在HMTL结构加载完后就可以执行,不需要等大型文件加载或者不存在的连接等耗时工作完成才执行,效率高。
58. Jq中 attr 和 prop 有什么区别
发现attr的返回值要么是checked要么是undefined,prop的返回值只有true和false。
对于HTML元素本身就带有的固有属性,在处理时,使用prop方法。 对于HTML元素我们自己自定义的DOM属性,在处理时,使用attr方法。
59.简述下 this 和定义属性和方法的时候有什么区别?Prototype?
this表示当前对象,如果在全局作用范围内使用this,则指代当前页面对象window; 如果在函数中使用this,则this指代什么是根据运行时此函数在什么对象上被调用。 我们还可以使用apply和call两个全局方法来改变函数中this的具体指向。
call和apply都是改变this指向的方法,区别在于call可以写多个参数,而apply只能写两个参数,第二个参数是一个数组,用于存放要传的参数。 用call和apply:实现更好的继承和扩展,更安全。
prototype本质上还是一个JavaScript对象。 并且每个函数都有一个默认的prototype属性。
在prototype上定义的属性方法为所有实例共享,所有实例皆引用到同一个对象,单一实例对原型上的属性进行修改,也会影响到所有其他实例。
60.ajax 和 jsonp ?
ajax 是什么? 异步javascript和XML,是指一种创建交互式网页应用的网页开发技术。通过后台与服务器进行少量数据交换,AJAX可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
ajax的缺点 1、ajax不支持浏览器back按钮。 2、安全问题 AJAX暴露了与服务器交互的细节。 3、对搜索引擎的支持比较弱。 4、破坏了程序的异常机制。 5、不容易调试
ajax和jsonp的区别: 相同点:都是请求一个url 不同点:ajax的核心是通过xmlHttpRequest获取内容 jsonp的核心则是动态添加
jsonp原理? 缺点? 工作原理:使用script标签实现跨域访问,可在url中指定回调函数,获取JSON数据并在指定的回调函数中执行jquery实现jsop。
缺点:只支持GET方式的jsonp实现,是一种脚本注入行为存在一定的安全隐患。如果返回的数据格式有问题或者返回失败了,并不会报错。
JSONP jsonp原理详解
61.xhr对象 status ? readystate?
status是XMLHttpRequest对象的一个属性,表示响应的HTTP状态码。 readyState是XMLHttpRequest对象的一个属性,用来标识当前XMLHttpRequest对象处于什么状态。
readystate 0~4:
0:未初始化状态:此时,已经创建了一个XMLHttpRequest对象 1: 准备发送状态:此时,已经调用了XMLHttpRequest对象的open方法,并且XMLHttpRequest对象已经准备好将一个请求发送到服务器端 2:已经发送状态:此时,已经通过send方法把一个请求发送到服务器端,但是还没有收到一个响应 3:正在接收状态:此时,已经接收到HTTP响应头部信息,但是消息体部分还没有完全接收到 4:完成响应状态:此时,已经完成了HTTP响应的接收
几个http协议状态码:
200, 201, 302, 304, 400, 404, 500
200:请求成功 201:请求成功并且服务器创建了新的资源 302:服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来响应以后的请求。 304:自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。 400:服务器不理解请求的语法。 404:请求的资源(网页等)不存在 500: 内部服务器错误
62.sessionStorage和localstroage与cookie之间有什么关联, cookie最大存放多少字节
三者共同点:都是保存在浏览器端,且同源的。
区别: 1、cookie在浏览器和服务器间来回传递。而sessionStorage和localStorage不会自动把数据发给服务器,仅在本地保存
2、存储大小限制也不同,cookie数据不能超过4k,sessionStorage和localStorage 但比cookie大得多,可以达到5M
3、数据有效期不同,sessionStorage:仅在当前浏览器窗口关闭前有效,自然也就不可能持久保持;localStorage:始终有效,窗口或浏览器关闭也一直保存,因此用作持久数据;cookie只在设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭
4、作用域不同,sessionStorage不在不同的浏览器窗口中共享,即使是同一个页面(即数据不共享);localStorage 在所有同源窗口中都是共享的;cookie也是在所有同源窗口中都是共享的( 即数据共享 )。
63.ajax中 get 和 post 有什么区别?
get和post都是数据提交的方式。 get的数据是通过网址问号后边拼接的字符串进行传递的。post是通过一个HTTP包体进行传递数据的。 get的传输量是有限制的,post是没有限制的。 get的安全性可能没有post高,所以我们一般用get来获取数据,post一般用来修改数据。
64.Gc机制是什么?为什么闭包不会被回收变量和函数?
1、Gc垃圾回收机制; 2、外部变量没释放,所以指向的大函数内的小函数也释放不了
65.简述下你理解的面向对象?
万物皆对象,把一个对象抽象成类,具体上就是把一个对象的静态特征和动态特征抽象成属性和方法,也就是把一类事物的算法和数据结构封装在一个类之中,程序就是多个对象和互相之间的通信组成的.
面向对象具有封装性,继承性,多态性。 封装:隐蔽了对象内部不需要暴露的细节,使得内部细节的变动跟外界脱离,只依靠接口进行通信.封装性降低了编程的复杂性. 通过继承,使得新建一个类变得容易,一个类从派生类那里获得其非私有的方法和公用属性的繁琐工作交给了编译器. 而继承和实现接口和运行时的类型绑定机制 所产生的多态,使得不同的类所产生的对象能够对相同的消息作出不同的反应,极大地提高了代码的通用性.
总之,面向对象的特性提高了大型程序的重用性和可维护性.
66.你对数据校验是怎么样处理的?jquery.validate?
通俗的说,就是为保证数据的完整性,用一种指定的算法对原始数据计算出的一个校验值。接收方用同样的算法计算一次校验值,如果和随数据提供的校验值一样,就说明数据是完整的。 用正则表达式来处理; jquery.validate:为表单验证插件
Validate表单验证
67.在jq中 mouseover mouseenter mouseout mouseleave 和 hover有什么关联?
mouseenter与mouseover: 不论鼠标指针穿过被选中元素或其子元素,都会触发mouseover事件。 只有在鼠标指针穿过被选元素时,才会触发mouseentr事件。
mouseout与mouseleave: 不论鼠标离开被选元素还是任何子元素,都会触发mouseout事件。 只有在鼠标指针离开被选元素时,才会触发mouseleave事件。
hover: hover是一个符合方法,相当于mouseenter+mouseleave。
一个例子说明mouseover事件与mouseenter事件的区别
68.除了jsonp 还有什么跨域方式
javascript跨域有两种情况: 1、基于同一父域的子域之间,如:http://a.c.com和http://b.c.com 2、基于不同的父域之间,如:http://www.a.com和http://www.b.com 3、端口的不同,如:http://www.a.com:8080和http://www.a.com:8088 4、协议不同,如:http://www.a.com和https://www.a.com
对于情况3和4,需要通过后台proxy来解决,具体方式如下: a、在发起方的域下创建proxy程序 b、发起方的js调用本域下的proxy程序 c、proxy将请求发送给接收方并获取相应数据 d、proxy将获得的数据返回给发起方的js
代码和ajax调用一致,其实这种方式就是通过ajax进行调用的 而情况1和2除了通过后台proxy这种方式外,还可以有多种办法来解决: 1、document.domain+iframe(只能解决情况1): a、在发起方页面和接收方页面设置document.domain,并将值设为父域的主域名(window.location.hostname) b、在发起方页面创建一个隐藏的iframe,iframe的源是接收方页面 c、根据浏览器的不同,通过iframe.contentDocument || iframe.contentWindow.document来获得接收方页面的内容 d、通过获得的接收方页面的内容来与接收方进行交互 这种方法有个缺点,就是当一个域被攻击时,另一个域会有安全漏洞出现。
69.如何确保ajax或连接不走缓存路径
在Ajax中使用Get请求数据不会有页面缓存的问题,而使用POST请求可是有时候页面会缓存我们提交的信息,导致我们发送的异步请求不能正确的返回我们想要的数据
$. post ( url, data , ranNum: Math. random ( ) } , function ( data) {
} )
ranNum : 这个是防止缓存的核心,每次发起请求都会用Math.random()方法生成一个随机的数字,这样子就会刷新url缓存
70.disabled readyonly?
readonly只针对input(text / password)和textarea有效,而disabled对于所有的表单元素都有效,当表单元素在使用了disabled后,当我们将表单以POST或GET的方式提交的话,这个元素的值不会被传递出去,而readonly会将该值传递出去。
71.bootstrap好处?
自适应和响应式布局,12栅格系统,统一的界面风格和css样式有利于团队开发。编写灵活、稳定、高质量的 HTML 和 CSS 代码的规范。
72.ajax请求方式有几种(8种)?
1)$.get(url,[data],[callback]) 2)$.getJSON(url,[data],[callback]) 3)$.post(url,[data],[callback],[type]) 4)$.ajax(opiton) 5)$.getScript( url, [callback] ) 6)jquery对象.load( url, [data], [callback] ) 7)serialize() 与 serializeArray()
73.如何copy一个dom元素?
原生Js方法:var div = document.getElementsByTagName(‘div’)[0]; var clone = div.cloneNode();
Jquery方法:$(‘div’).clone(); 在默认情况下,.clone()方法不会复制匹配的元素或其后代元素中绑定的事件。不过,可以为这个方法传递一个布尔值参数,将这个参数设置为true, 就可以连同事件一起复制,即.clone(true)。
74. JavaScript原型,原型链 ? 有什么特点?
在JavaScript中,一共有两种类型的值,原始值和对象值.每个对象都有一个内部属性[[prototype]],我们通常称之为原型.原型的值可以是一个对象,也可以是null.如果它的值是一个对象,则这个对象也一定有自己的原型.这样就形成了一条线性的链,我们称之为原型链.
访问一个对象的原型可以使用ES5中的Object.getPrototypeOf方法,或者ES6中的__proto__属性. 原型链的作用是用来实现继承,比如我们新建一个数组,数组的方法就是从数组的原型上继承而来的。
75. 异步加载的方式有哪些?
(1) defer,只支持IE (2) async:true (3) 创建script,插入到DOM中,加载完毕后callBack
76. jQuery与jQuery UI 有啥区别?
jQuery是一个js库,主要提供的功能是选择器,属性修改和事件绑定等等。 jQuery UI则是在jQuery的基础上,利用jQuery的扩展性,设计的插件。提供了一些常用的界面元素,诸如对话框、拖动行为、改变大小行为等等。
77. 如何解决跨域问题?
Jsonp、iframe、window.name、window.postMessage、服务器上设置代理页面
JS中关于跨域及实现方法 javascript中实现跨域的方式总结 关于跨域,你想知道的全在这里 最完整的几种跨域方式实现原理
78. 一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么?(流程说的越详细越好)
查找浏览器缓存 DNS解析、查找该域名对应的IP地址、重定向(301)、发出第二个GET请求 进行HTTP协议会话 客户端发送报头(请求报头) 服务器回馈报头(响应报头) html文档开始下载 文档树建立,根据标记请求所需指定MIME类型的文件 文件显示
浏览器这边做的工作大致分为以下几步: 加载:根据请求的URL进行域名解析,向服务器发起请求,接收文件(HTML、JS、CSS、图象等)。 解析:对加载到的资源(HTML、JS、CSS等)进行语法解析,建议相应的内部数据结构(比如HTML的DOM树,JS的(对象)属性表,CSS的样式规则等等)
79. 你有哪些性能优化的方法?
(1) 减少http请求次数:CSS Sprites, JS、CSS源码压缩、图片大小控制合适;网页Gzip, CDN托管,data缓存 ,图片服务器。
(2) 前端模板 JS+数据,减少由于HTML标签导致的带宽浪费,前端用变量保存AJAX请求结果,每次操作本地变量,不用请求,减少请求次数
(3) 用innerHTML代替DOM操作,减少DOM操作次数,优化javascript性能。
(4) 当需要设置的样式很多时设置className而不是直接操作style。
(5) 少用全局变量、缓存DOM节点查找的结果。减少IO读取操作。
(6) 避免使用CSS Expression(css表达式)又称Dynamic properties(动态属性)。
(7) 图片预加载,将样式表放在顶部,将脚本放在底部 加上时间戳。
(8) 避免在页面的主体布局中使用table,table要等其中的内容完全下载之后才会显示出来,显示比div+css布局慢。
80.开发时如何对项目进行管理?gulp和webpack?
1、gulp:是工具链、构建工具,可以配合各种插件做js压缩,css压缩,less编译 替代手工实现自动化工作
(1)构建工具
(2)自动化
(3)用于:提高效率——能够优化前端工作流程,提高工作效率
(4)自动刷新页面,雪碧图,压缩css、js,编译less,检查语法等
(5)使用gulp可以配置你需要的插件,把以前需要手工做的事情让它帮你做了
2、webpack:是文件打包工具,可以把项目的各种js文、css文件等打包合并成一个或多个文件,主要用于模块化方案,预编译模块的方案 (1)打包工具
(2)模块化识别
(3)用于:编译模块代码方案
两者都是打包工具,只是webpack整合了gulp的优点。如果想要一步步配置环境,那么gulp就很合适;如果想一下子就配备大部分环境,那么webpack就可以,只要写好package.json就可以。从执行结果上看,是没有什么区别的
81.ES6常用特性
变量定义(let和const,可变与不可变,const定义对象的特殊情况) 解构赋值 模板字符串 数组新API(例:Array.from(),entries(),values(),keys()) 箭头函数(rest参数,扩展运算符,::绑定this) Set和Map数据结构(set实例成员值唯一存储key值,map实例存储键值对(key-value)) Promise对象(前端异步解决方案进化史,generator函数,async函数) Class语法糖(super关键字)
工作中常用到的ES6语法
兼容性: ES5 ES6
82.es6如何转为es5?
Babel是一个广泛使用的ES6转码器,可以将ES6代码转为ES5代码,从而在现有环境执行。 使用Babel 转码器,Babel 的配置文件是.babelrc,存放在项目的根目录下。使用 Babel 的第一步,就是配置这个文件。
83.对MVC和MVVM的理解
MVC,MVP 和 MVVM 的图示
MVVM:
84.变量提升
变量提升:函数及变量的声明都将被提升到函数的最顶部;变量可以在使用后声明,也就是变量可以先使用再声明。(变量赋值不会提升 ,有多个函数声明的时候,是由最后面的函数声明来替代前面的;函数提升的优先级大于变量提升的优先级,即函数提升在变量提升之上)
浅谈变量提升 JavaScript 变量提升
85.setTimeout、setInterval和requestAnimationFrame
setTimeout/clearTimeout 延时执行参数指定代码
setInterval/clearInterval 每隔一段时间执行指定代码
requestAnimationFrame 在浏览器每次刷新页面之前执行:1. 会把每一帧中所有的DOM操作集中起来,在一次重绘或回流中就完成,并且重绘或回流的时间间隔紧紧跟随浏览器的刷新频率;2. 对于隐藏元素不会进行重绘或回流,减少了CPU、GPU和内存使用量;3. 由浏览器专门为动画提供的API,在运行时浏览器会自动优化方法的调用;页面如果不是激活状态,动画会暂停播放,有效节省了CPU开销
requestAnimationFrame
86.高频度触发事件的优化方案
1.防抖debounce 说明:抖动结束的时间超过指定时间间隔时才执行任务 应用场景:搜索联想、窗口resize
2.节流throttle 说明:指定时间间隔内只执行一次任务 应用场景:滚动事件、鼠标不断点击触发
js防抖和节流
87.JS类有哪几种继承方式?各有什么特点?
// 原型链继承
function Cat(){ }
Cat.prototype = new Animal();
Cat.prototype.name = 'cat';
// Test Code
var cat = new Cat();
console.log(cat.name);
console.log(cat.eat('fish'));
console.log(cat.sleep());
console.log(cat instanceof Animal); //true
console.log(cat instanceof Cat); //true
原型链继承:将父类实例作为子类原型 特点:基于原型链,既是父类的实例,又是子类的实例 缺点:无法实现多继承,无法向父类构造参数传参
// 构造继承:使用父类的构造函数来增强子类实例,等于是复制父类的实例属性给子类(没用到原型)
function Cat(name){
Animal.call(this);
this.name = name || 'Tom';
}
// Test Code
var cat = new Cat();
console.log(cat.name);
console.log(cat.sleep());
console.log(cat instanceof Animal); // false
console.log(cat instanceof Cat); // true
构造继承:使用父类的构造函数来增强子类实例 特点:可以实现多继承 缺点:只能继承父类的实例属性和方法,不能继承原型上的属性和方法
实例继承:为父类实例添加新特性,作为子类实例返回 特点:不限制调用方法 缺点:实例是父类的实例,不是子类的实例,不支持多继承
拷贝继承:拷贝父类元素上的属性和方法 特点:支持多继承 缺点:效率低、内存占用高
// 组合继承:相当于构造继承和原型链继承的组合体。通过调用父类构造,继承父类的属性并保留传参的优点,然后通过将父类实例作为子类原型,实现函数复用
function Cat(name){
Animal.call(this);
this.name = name || 'Tom';
}
Cat.prototype = new Animal();
Cat.prototype.constructor = Cat;
// Test Code
var cat = new Cat();
console.log(cat.name);
console.log(cat.sleep());
console.log(cat instanceof Animal); // true
console.log(cat instanceof Cat); // true
组合继承:构造继承+原型链继承 特点:可以继承实例属性和方法,也可以继承原型属性和方法 缺点:调用两次父类构造函数,会生成两份实例
// 寄生组合继承:通过寄生方式,砍掉父类的实例属性,这样,在调用两次父类的构造的时候,就不会初始化两次实例方法/属性
function Cat(name){
Animal.call(this);
this.name = name || 'Tom';
}
(function(){
// 创建一个没有实例方法的类
var Super = function(){};
Super.prototype = Animal.prototype;
//将实例作为子类的原型
Cat.prototype = new Super();
})();
// Test Code
var cat = new Cat();
console.log(cat.name);
console.log(cat.sleep());
console.log(cat instanceof Animal); // true
console.log(cat instanceof Cat); //true
寄生组合继承:通过寄生方式,砍掉组合继承中父类的实例属性 特点:避免组合继承中初始化两次实例方法和属性
说一下类的创建和继承 JS原型链与继承别再被问倒了
88.浏览器中的Event Loop事件循环
JavaScript:单线程(代码执行时只有一个主线程来处理所有任务)非阻塞(当代码需要进行一项异步任务时,主线程挂起该任务,然后在异步任务返回结果的时候再根据一定规则去执行相应的回调→Event Loop)
1.任务队列
Macrotask(宏任务):script(整体代码)、setTimeout、setInterval、I/O、UI交互事件、postMessage、MessageChannel Microtask(微任务):Promise.then、Object.observe
2.事件循环执行流程
一次事件循环只执行位于Macrotask队首的任务,执行完成后立即执行Microtask队列中的所有任务(一开始在js主线程中跑的任务就是Macrotask任务,因此执行完主线程的代码后,会从Microtask队列中取任务来执行)
3.定时器问题:setTimeout不保证可靠定时
定时器中设置的时间仅保证任务会在delay毫秒后进入Macrotask队列,并不意味着它能立刻运行,因为可能当前主线程正在进行一个耗时的操作,也可能目前Microtask队列中有很多个任务。
4.Js是阻塞还是非阻塞的?
核心是同步阻塞,而对于js异步事件,因为有事件循环机制,所以异步事件就是由事件驱动异步非阻塞的
5.requestAnimationFrame既不属于Microtask也不属于Macrotask
同步任务→promise等微任务→制作render树→requestAnimationFrame→制作render树→第一帧重绘完成→setTimeout等宏任务
面试一定会问到的-js事件循环 浏览器与Node的事件循环(Event Loop)有何区别? 【js事件循环】+ requestAnimationFrame与页面绘制在事件循环中的顺序关系
89.说说C++,Java,JavaScript这三种语言的区别
静态类型/动态类型
C++、Java属于静态类型语言,编译的时候就能够知道每个变量的类型,编程时需给定类型;js属于动态类型语言,运行的时候才知道每个变量的类型,编程的时候无需显示指定的类型
编译型/解释型
C++是编译型语言,需要编译器编译成本地可执行程序后才能运行,用户只使用编译好的本地代码;js是解释型语言,用户直接使用脚本解释器将脚本文件解释执行;Java分为两个阶段,首先像C++一样经过编译器编译,但生成字节码(与平台无关),然后由Java虚拟机运行字节码,使用解释器执行这些代码
js和Java的区别:
Java编译字节码阶段和执行阶段是分开的,即编译阶段时间长短无所谓;对于js这些都是在网页和js文件下载后同执行阶段一起在网页的加载和渲染过程中实施的,所以对处理时间有严格要求