display:none与visibility:hidden的区别
这两个属性都是让元素暗藏,不可见。两者区别如下:
(1)在渲染树中
display:none
会让元素齐全从渲染树中隐没,渲染时不会占据任何空间;visibility:hidden
不会让元素从渲染树中隐没,渲染的元素还会占据相应的空间,只是内容不可见。
(2)是否是继承属性
display:none
是非继承属性,子孙节点会随着父节点从渲染树隐没,通过批改子孙节点的属性也无奈显示;visibility:hidden
是继承属性,子孙节点隐没是因为继承了hidden
,通过设置visibility:visible
能够让子孙节点显示;
(3)批改惯例文档流中元素的display
通常会造成文档的重排,然而批改visibility
属性只会造成本元素的重绘;
(4)如果应用读屏器,设置为display:none
的内容不会被读取,设置为visibility:hidden
的内容会被读取。
介绍 plugin
插件零碎是 Webpack 胜利的一个关键性因素。在编译的整个生命周期中,Webpack 会触发许多事件钩子,Plugin 能够监听这些事件,依据需要在相应的工夫点对打包内容进行定向的批改。
一个最简略的 plugin 是这样的:
class Plugin{ // 注册插件时,会调用 apply 办法 // apply 办法接管 compiler 对象 // 通过 compiler 上提供的 Api,能够对事件进行监听,执行相应的操作 apply(compiler){ // compilation 是监听每次编译循环 // 每次文件变动,都会生成新的 compilation 对象并触发该事件 compiler.plugin('compilation',function(compilation) {}) }}
注册插件:
// webpack.config.jsmodule.export = { plugins:[ new Plugin(options), ]}
事件流机制:
Webpack 就像工厂中的一条产品流水线。原材料通过 Loader 与 Plugin 的一道道解决,最初输入后果。
- 通过链式调用,按程序串起一个个 Loader;
- 通过事件流机制,让 Plugin 能够插入到整个生产过程中的每个步骤中;
Webpack 事件流编程范式的外围是根底类 Tapable,是一种 观察者模式 的实现事件的订阅与播送:
const { SyncHook } = require("tapable")const hook = new SyncHook(['arg'])// 订阅hook.tap('event', (arg) => { // 'event-hook' console.log(arg)})// 播送hook.call('event-hook')
Webpack
中两个最重要的类Compiler
与Compilation
便是继承于Tapable
,也领有这样的事件流机制。
- Compiler : 能够简略的了解为 Webpack 实例,它蕴含了以后 Webpack 中的所有配置信息,如 options, loaders, plugins 等信息,全局惟一,只在启动时实现初始化创立,随着生命周期逐个传递;
Compilation
: 能够称为 编译实例。当监听到文件产生扭转时,Webpack 会创立一个新的 Compilation 对象,开始一次新的编译。它蕴含了以后的输出资源,输入资源,变动的文件等,同时通过它提供的 api,能够监听每次编译过程中触发的事件钩子;区别:
Compiler
全局惟一,且从启动生存到完结;Compilation
对应每次编译,每轮编译循环均会从新创立;
罕用 Plugin:
- UglifyJsPlugin: 压缩、混同代码;
- CommonsChunkPlugin: 代码宰割;
- ProvidePlugin: 主动加载模块;
- html-webpack-plugin: 加载 html 文件,并引入 css / js 文件;
- extract-text-webpack-plugin / mini-css-extract-plugin: 抽离款式,生成 css 文件; DefinePlugin: 定义全局变量;
- optimize-css-assets-webpack-plugin: CSS 代码去重;
- webpack-bundle-analyzer: 代码剖析;
- compression-webpack-plugin: 应用 gzip 压缩 js 和 css;
- happypack: 应用多过程,减速代码构建;
- EnvironmentPlugin: 定义环境变量;
- 调用插件
apply
函数传入compiler
对象 - 通过
compiler
对象监听事件
loader和plugin有什么区别?
webapck默认只能打包JS和JOSN模块,要打包其它模块,须要借助loader,loader就能够让模块中的内容转化成webpack或其它laoder能够辨认的内容。
loader
就是模块转换化,或叫加载器。不同的文件,须要不同的loader
来解决。plugin
是插件,能够参加到整个webpack打包的流程中,不同的插件,在适合的机会,能够做不同的事件。
webpack中都有哪些插件,这些插件有什么作用?
html-webpack-plugin
主动创立一个HTML文件,并把打包好的JS插入到HTML文件中clean-webpack-plugin
在每一次打包之前,删除整个输入文件夹下所有的内容mini-css-extrcat-plugin
抽离CSS代码,放到一个独自的文件中optimize-css-assets-plugin
压缩css
::before 和 :after 的双冒号和单冒号有什么区别?
(1)冒号(:
)用于CSS3
伪类,双冒号(::
)用于CSS3
伪元素。
(2)::before
就是以一个子元素的存在,定义在元素主体内容之前的一个伪元素。并不存在于dom
之中,只存在在页面之中。
留神: :before
和 :after
这两个伪元素,是在CSS2.1
里新呈现的。起初,伪元素的前缀应用的是单冒号语法,但随着Web
的进化,在CSS3
的标准里,伪元素的语法被批改成应用双冒号,成为::before
、::after
。
Sass、Less 是什么?为什么要应用他们?
他们都是 CSS 预处理器,是 CSS 上的一种形象层。他们是一种非凡的语法/语言编译成 CSS。 例如 Less 是一种动静款式语言,将 CSS 赋予了动静语言的个性,如变量,继承,运算, 函数,LESS 既能够在客户端上运行 (反对 IE 6+, Webkit, Firefox),也能够在服务端运行 (借助 Node.js)。
为什么要应用它们?
- 构造清晰,便于扩大。 能够不便地屏蔽浏览器公有语法差别。封装对浏览器语法差别的反复解决, 缩小无意义的机械劳动。
- 能够轻松实现多重继承。 齐全兼容 CSS 代码,能够不便地利用到老我的项目中。LESS 只是在 CSS 语法上做了扩大,所以老的 CSS 代码也能够与 LESS 代码一起编译。
文档申明(Doctype)和<!Doctype html>
有何作用? 严格模式与混淆模式如何辨别?它们有何意义?
文档申明的作用: 文档申明是为了通知浏览器,以后HTML
文档应用什么版本的HTML
来写的,这样浏览器能力依照申明的版本来正确的解析。
的作用:<!doctype html>
的作用就是让浏览器进入规范模式,应用最新的 HTML5
规范来解析渲染页面;如果不写,浏览器就会进入混淆模式,咱们须要防止此类情况产生。
严格模式与混淆模式的辨别:
- 严格模式: 又称为规范模式,指浏览器依照
W3C
规范解析代码; - 混淆模式: 又称怪异模式、兼容模式,是指浏览器用本人的形式解析代码。混淆模式通常模仿老式浏览器的行为,以避免老站点无奈工作;
辨别:网页中的DTD
,间接影响到应用的是严格模式还是浏览模式,能够说DTD
的应用与这两种形式的区别非亲非故。
- 如果文档蕴含严格的
DOCTYPE
,那么它个别以严格模式出现(严格 DTD ——严格模式); - 蕴含过渡
DTD
和URI
的DOCTYPE
,也以严格模式出现,但有过渡DTD
而没有URI
(对立资源标识符,就是申明最初的地址)会导致页面以混淆模式出现(有 URI 的过渡 DTD ——严格模式;没有 URI 的过渡 DTD ——混淆模式); DOCTYPE
不存在或模式不正确会导致文档以混淆模式出现(DTD不存在或者格局不正确——混淆模式);HTML5
没有DTD
,因而也就没有严格模式与混淆模式的区别,HTML5
有绝对宽松的 法,实现时,曾经尽可能大的实现了向后兼容(HTML5 没有严格和混淆之分)。
总之,严格模式让各个浏览器对立执行一套标准兼容模式保障了旧网站的失常运行。
isNaN 和 Number.isNaN 函数的区别?
- 函数 isNaN 接管参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因而非数字值传入也会返回 true ,会影响 NaN 的判断。
- 函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再持续判断是否为 NaN ,不会进行数据类型的转换,这种办法对于 NaN 的判断更为精确。
参考 前端进阶面试题具体解答
元素的层叠程序
层叠程序,英文称作 stacking order,示意元素产生层叠时有着特定的垂直显示程序。上面是盒模型的层叠规定:
(1)背景和边框:建设以后层叠上下文元素的背景和边框。
(2)负的z-index:以后层叠上下文中,z-index属性值为负的元素。
(3)块级盒:文档流内非行内级非定位后辈元素。
(4)浮动盒:非定位浮动元素。
(5)行内盒:文档流外行内级非定位后辈元素。
(6)z-index:0:层叠级数为0的定位元素。
(7)正z-index:z-index属性值为正的定位元素。
留神: 当定位元素z-index:auto,生成盒在以后层叠上下文中的层级为 0,不会建设新的层叠上下文,除非是根元素。
对盒模型的了解
CSS3中的盒模型有以下两种:规范盒子模型、IE盒子模型 盒模型都是由四个局部组成的,别离是margin、border、padding和content。
规范盒模型和IE盒模型的区别在于设置width和height时,所对应的范畴不同:
- 规范盒模型的width和height属性的范畴只蕴含了content,
- IE盒模型的width和height属性的范畴蕴含了border、padding和content。
能够通过批改元素的box-sizing属性来扭转元素的盒模型:
box-sizeing: content-box
示意规范盒模型(默认值)box-sizeing: border-box
示意IE盒模型(怪异盒模型)
响应式设计的概念及基本原理
响应式网站设计(Responsive Web design
)是一个网站可能兼容多个终端,而不是为每一个终端做一个特定的版本。
对于原理: 基本原理是通过媒体查问(@media)
查问检测不同的设施屏幕尺寸做解决。
对于兼容: 页面头部必须有mate申明的viewport
。
<meta name="’viewport’" content="”width=device-width," initial-scale="1." maximum-scale="1,user-scalable=no”"/>
CSS预处理器/后处理器是什么?为什么要应用它们?
预处理器, 如:less
,sass
,stylus
,用来预编译sass
或者less
,减少了css
代码的复用性。层级,mixin
, 变量,循环, 函数等对编写以及开发UI组件都极为不便。
后处理器, 如: postCss
,通常是在实现的样式表中依据css
标准解决css
,让其更加无效。目前最常做的是给css
属性增加浏览器公有前缀,实现跨浏览器兼容性的问题。
css
预处理器为css
减少一些编程个性,无需思考浏览器的兼容问题,能够在CSS
中应用变量,简略的逻辑程序,函数等在编程语言中的一些根本的性能,能够让css
更加的简洁,减少适应性以及可读性,可维护性等。
其它css
预处理器语言:Sass(Scss)
, Less
, Stylus
, Turbine
, Swithch css
, CSS Cacheer
, DT Css
。
应用起因:
- 构造清晰, 便于扩大
- 能够很不便的屏蔽浏览器公有语法的差别
- 能够轻松实现多重继承
- 完满的兼容了
CSS
代码,能够利用到老我的项目中
intanceof 操作符的实现原理及实现
instanceof 运算符用于判断构造函数的 prototype 属性是否呈现在对象的原型链中的任何地位。
function myInstanceof(left, right) { // 获取对象的原型 let proto = Object.getPrototypeOf(left) // 获取构造函数的 prototype 对象 let prototype = right.prototype; // 判断构造函数的 prototype 对象是否在对象的原型链上 while (true) { if (!proto) return false; if (proto === prototype) return true; // 如果没有找到,就持续从其原型上找,Object.getPrototypeOf办法用来获取指定对象的原型 proto = Object.getPrototypeOf(proto); }}
单行、多行文本溢出暗藏
- 单行文本溢出
overflow: hidden; // 溢出暗藏text-overflow: ellipsis; // 溢出用省略号显示white-space: nowrap; // 规定段落中的文本不进行换行
- 多行文本溢出
overflow: hidden; // 溢出暗藏text-overflow: ellipsis; // 溢出用省略号显示display:-webkit-box; // 作为弹性伸缩盒子模型显示。-webkit-box-orient:vertical; // 设置伸缩盒子的子元素排列形式:从上到下垂直排列-webkit-line-clamp:3; // 显示的行数
留神:因为下面的三个属性都是 CSS3 的属性,没有浏览器能够兼容,所以要在后面加一个-webkit-
来兼容一部分浏览器。
link和@import的区别
两者都是内部援用CSS的形式,它们的区别如下:
- link是XHTML标签,除了加载CSS外,还能够定义RSS等其余事务;@import属于CSS领域,只能加载CSS。
- link援用CSS时,在页面载入时同时加载;@import须要页面网页齐全载入当前加载。
- link是XHTML标签,无兼容问题;@import是在CSS2.1提出的,低版本的浏览器不反对。
- link反对应用Javascript管制DOM去扭转款式;而@import不反对。
两栏布局的实现
个别两栏布局指的是右边一栏宽度固定,左边一栏宽度自适应,两栏布局的具体实现:
- 利用浮动,将右边元素宽度设置为200px,并且设置向左浮动。将左边元素的margin-left设置为200px,宽度设置为auto(默认为auto,撑满整个父元素)。
.outer { height: 100px;}.left { float: left; width: 200px; background: tomato;}.right { margin-left: 200px; width: auto; background: gold;}
- 利用浮动,左侧元素设置固定大小,并左浮动,右侧元素设置overflow: hidden; 这样左边就触发了BFC,BFC的区域不会与浮动元素产生重叠,所以两侧就不会产生重叠。
.left{ width: 100px; height: 200px; background: red; float: left; } .right{ height: 300px; background: blue; overflow: hidden; }
- 利用flex布局,将右边元素设置为固定宽度200px,将左边的元素设置为flex:1。
.outer { display: flex; height: 100px;}.left { width: 200px; background: tomato;}.right { flex: 1; background: gold;}
- 利用相对定位,将父级元素设置为绝对定位。右边元素设置为absolute定位,并且宽度设置为200px。将左边元素的margin-left的值设置为200px。
.outer { position: relative; height: 100px;}.left { position: absolute; width: 200px; height: 100px; background: tomato;}.right { margin-left: 200px; background: gold;}
- 利用相对定位,将父级元素设置为绝对定位。右边元素宽度设置为200px,左边元素设置为相对定位,右边定位为200px,其余方向定位为0。
.outer { position: relative; height: 100px;}.left { width: 200px; background: tomato;}.right { position: absolute; top: 0; right: 0; bottom: 0; left: 200px; background: gold;}
title与h1的区别、b与strong的区别、i与em的区别?
- strong标签有语义,是起到减轻语气的成果,而b标签是没有的,b标签只是一个简略加粗标签。b标签之间的字符都设为粗体,strong标签增强字符的语气都是通过粗体来实现的,而搜索引擎更偏重strong标签。
- title属性没有明确意义只示意是个题目,H1则示意档次明确的题目,对页面信息的抓取有很大的影响
- i内容展现为斜体,em示意强调的文本
应用 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: block; clear:both;}
clear属性只有块级元素才无效的,而::after等伪元素默认都是内联程度,这就是借助伪元素革除浮动影响时须要设置display属性值的起因。
程度垂直居中的实现
- 利用相对定位,先将元素的左上角通过top:50%和left:50%定位到页面的核心,而后再通过translate来调整元素的中心点到页面的核心。该办法须要思考浏览器兼容问题。
.parent { position: relative;} .child { position: absolute; left: 50%; top: 50%; transform: translate(-50%,-50%);}
- 利用相对定位,设置四个方向的值都为0,并将margin设置为auto,因为宽高固定,因而对应方向实现平分,能够实现程度和垂直方向上的居中。该办法实用于盒子有宽高的状况:
.parent { position: relative;}.child { position: absolute; top: 0; bottom: 0; left: 0; right: 0; margin: auto;}
- 利用相对定位,先将元素的左上角通过top:50%和left:50%定位到页面的核心,而后再通过margin负值来调整元素的中心点到页面的核心。该办法实用于盒子宽高已知的状况
.parent { position: relative;}.child { position: absolute; top: 50%; left: 50%; margin-top: -50px; /* 本身 height 的一半 */ margin-left: -50px; /* 本身 width 的一半 */}
- 应用flex布局,通过align-items:center和justify-content:center设置容器的垂直和程度方向上为居中对齐,而后它的子元素也能够实现垂直和程度的居中。该办法要思考兼容的问题,该办法在挪动端用的较多:
.parent { display: flex; justify-content:center; align-items:center;}
z-index属性在什么状况下会生效
通常 z-index 的应用是在有两个重叠的标签,在肯定的状况下管制其中一个在另一个的上方或者下方呈现。z-index值越大就越是在下层。z-index元素的position属性须要是relative,absolute或是fixed。
z-index属性在下列状况下会生效:
- 父元素position为relative时,子元素的z-index生效。解决:父元素position改为absolute或static;
- 元素没有设置position属性为非static属性。解决:设置该元素的position属性为relative,absolute或是fixed中的一种;
- 元素在设置z-index的同时还设置了float浮动。解决:float去除,改为display:inline-block;
实现一个扇形
用CSS实现扇形的思路和三角形基本一致,就是多了一个圆角的款式,实现一个90°的扇形:
div{ border: 100px solid transparent; width: 0; heigt: 0; border-radius: 100px; border-top-color: red;}
代码输入问题
function Parent() { this.a = 1; this.b = [1, 2, this.a]; this.c = { demo: 5 }; this.show = function () { console.log(this.a , this.b , this.c.demo ); }}function Child() { this.a = 2; this.change = function () { this.b.push(this.a); this.a = this.b.length; this.c.demo = this.a++; }}Child.prototype = new Parent();var parent = new Parent();var child1 = new Child();var child2 = new Child();child1.a = 11;child2.a = 12;parent.show();child1.show();child2.show();child1.change();child2.change();parent.show();child1.show();child2.show();
输入后果:
parent.show(); // 1 [1,2,1] 5child1.show(); // 11 [1,2,1] 5child2.show(); // 12 [1,2,1] 5parent.show(); // 1 [1,2,1] 5child1.show(); // 5 [1,2,1,11,12] 5child2.show(); // 6 [1,2,1,11,12] 5
这道题目值得神帝,他波及到的知识点很多,例如this的指向、原型、原型链、类的继承、数据类型等。
解析:
- parent.show(),能够间接取得所需的值,没啥好说的;
- child1.show(),
Child
的构造函数本来是指向Child
的,题目显式将Child
类的原型对象指向了Parent
类的一个实例,须要留神Child.prototype
指向的是Parent
的实例parent
,而不是指向Parent
这个类。 - child2.show(),这个也没啥好说的;
- parent.show(),
parent
是一个Parent
类的实例,Child.prorotype
指向的是Parent
类的另一个实例,两者在堆内存中互不影响,所以上述操作不影响parent
实例,所以输入后果不变; - child1.show(),
child1
执行了change()
办法后,产生了怎么的变动呢? - this.b.push(this.a),因为this的动静指向个性,this.b会指向
Child.prototype
上的b数组,this.a会指向child1
的a属性,所以Child.prototype.b
变成了[1,2,1,11]; - this.a = this.b.length,这条语句中
this.a
和this.b
的指向与上一句统一,故后果为child1.a
变为4; - this.c.demo = this.a++,因为
child1
本身属性并没有c这个属性,所以此处的this.c
会指向Child.prototype.c
,this.a
值为4,为原始类型,故赋值操作时会间接赋值,Child.prototype.c.demo
的后果为4,而this.a
随后自增为5(4 + 1 = 5)。 child2
执行了change()
办法, 而child2
和child1
均是Child
类的实例,所以他们的原型链指向同一个原型对象Child.prototype
,也就是同一个parent
实例,所以child2.change()
中所有影响到原型对象的语句都会影响child1
的最终输入后果。- this.b.push(this.a),因为this的动静指向个性,this.b会指向
Child.prototype
上的b数组,this.a会指向child2
的a属性,所以Child.prototype.b
变成了[1,2,1,11,12]; - this.a = this.b.length,这条语句中
this.a
和this.b
的指向与上一句统一,故后果为child2.a
变为5; - this.c.demo = this.a++,因为
child2
本身属性并没有c这个属性,所以此处的this.c
会指向Child.prototype.c
,故执行后果为Child.prototype.c.demo
的值变为child2.a
的值5,而child2.a
最终自增为6(5 + 1 = 6)。