共计 9398 个字符,预计需要花费 24 分钟才能阅读完成。
浏览器是如何对 HTML5 的离线贮存资源进行治理和加载?
- 在线的状况下,浏览器发现 html 头部有 manifest 属性,它会申请 manifest 文件,如果是第一次拜访页面,那么浏览器就会依据 manifest 文件的内容下载相应的资源并且进行离线存储。如果曾经拜访过页面并且资源曾经进行离线存储了,那么浏览器就会应用离线的资源加载页面,而后浏览器会比照新的 manifest 文件与旧的 manifest 文件,如果文件没有产生扭转,就不做任何操作,如果文件扭转了,就会从新下载文件中的资源并进行离线存储。
- 离线的状况下,浏览器会间接应用离线存储的资源。
label 的作用是什么?如何应用?
label 标签来定义表单控件的关系:当用户抉择 label 标签时,浏览器会主动将焦点转到和 label 标签相干的表单控件上。
- 应用办法 1:
<label for="mobile">Number:</label>
<input type="text" id="mobile"/>
- 应用办法 2:
<label>Date:<input type="text"/></label>
CSS3 的新个性
transition
:过渡transform
: 旋转、缩放、挪动或歪斜animation
: 动画gradient
: 突变box-shadow
: 暗影border-radius
: 圆角word-break
:normal|break-all|keep-all
; 文字换行(默认规定 | 单词也能够换行 | 只在半角空格或连字符换行)text-overflow
: 文字超出局部解决text-shadow
: 程度暗影,垂直暗影,含糊的间隔,以及暗影的色彩。box-sizing
:content-box|border-box
盒模型- 媒体查问
@media screen and (max-width: 960px) {}
还有打印print
CSS 中可继承与不可继承属性有哪些
一、无继承性的属性
- display:规定元素应该生成的框的类型
- 文本属性:
- vertical-align:垂直文本对齐
- text-decoration:规定增加到文本的装璜
- text-shadow:文本暗影成果
- white-space:空白符的解决
- unicode-bidi:设置文本的方向
- 盒子模型的属性:width、height、margin、border、padding
- 背景属性:background、background-color、background-image、background-repeat、background-position、background-attachment
- 定位属性:float、clear、position、top、right、bottom、left、min-width、min-height、max-width、max-height、overflow、clip、z-index
- 生成内容属性:content、counter-reset、counter-increment
- 轮廓款式属性:outline-style、outline-width、outline-color、outline
- 页面款式属性:size、page-break-before、page-break-after
- 声音款式属性:pause-before、pause-after、pause、cue-before、cue-after、cue、play-during
二、有继承性的属性
- 字体系列属性
- font-family:字体系列
- font-weight:字体的粗细
- font-size:字体的大小
- font-style:字体的格调
- 文本系列属性
- text-indent:文本缩进
- text-align:文本程度对齐
- line-height:行高
- word-spacing:单词之间的间距
- letter-spacing:中文或者字母之间的间距
- text-transform:管制文本大小写(就是 uppercase、lowercase、capitalize 这三个)
- color:文本色彩
- 元素可见性
- visibility:管制元素显示暗藏
- 列表布局属性
- list-style:列表格调,包含 list-style-type、list-style-image 等
- 光标属性
- cursor:光标显示为何种状态
单行、多行文本溢出暗藏
- 单行文本溢出
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-
来兼容一部分浏览器。
transition 和 animation 的区别
- transition 是适度属性,强调适度,它的实现须要触发一个事件(比方鼠标挪动下来,焦点,点击等)才执行动画。它相似于 flash 的补间动画,设置一个开始关键帧,一个完结关键帧。
- animation 是动画属性,它的实现不须要触发事件,设定好工夫之后能够本人执行,且能够循环一个动画。它也相似于 flash 的补间动画,然而它能够设置多个关键帧(用 @keyframe 定义)实现动画。
参考 前端进阶面试题具体解答
head 标签有什么作用,其中什么标签必不可少?
标签用于定义文档的头部,它是所有头部元素的容器。中的元素能够援用脚本、批示浏览器在哪里找到样式表、提供元信息等。
文档的头部形容了文档的各种属性和信息,包含文档的题目、在 Web 中的地位以及和其余文档的关系等。绝大多数文档头部蕴含的数据都不会真正作为内容显示给读者。
上面这些标签可用在 head 局部:<base>, <link>, <meta>, <script>, <style>, <title>
。
其中 <title>
定义文档的题目,它是 head 局部中惟一必须的元素。
为什么有时候⽤ translate 来扭转地位⽽不是定位?
translate 是 transform 属性的⼀个值。扭转 transform 或 opacity 不会触发浏览器从新布局(reflow)或重绘(repaint),只会触发复合(compositions)。⽽扭转相对定位会触发从新布局,进⽽触发重绘和复合。transform 使浏览器为元素创立⼀个 GPU 图层,但扭转相对定位会使⽤到 CPU。因而 translate()更⾼效,能够缩短平滑动画的绘制工夫。⽽ translate 扭转地位时,元素仍然会占据其原始空间,相对定位就不会发⽣这种状况。
程度垂直居中的实现
- 利用相对定位,先将元素的左上角通过 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;
}
|| 和 && 操作符的返回值?
|| 和 && 首先会对第一个操作数执行条件判断,如果其不是布尔值就先强制转换为布尔类型,而后再执行条件判断。
- 对于 || 来说,如果条件判断后果为 true 就返回第一个操作数的值,如果为 false 就返回第二个操作数的值。
- && 则相同,如果条件判断后果为 true 就返回第二个操作数的值,如果为 false 就返回第一个操作数的值。
|| 和 && 返回它们其中一个操作数的值,而非条件判断的后果
判断数组的形式有哪些
- 通过 Object.prototype.toString.call()做判断
Object.prototype.toString.call(obj).slice(8,-1) === 'Array';
- 通过原型链做判断
obj.__proto__ === Array.prototype;
- 通过 ES6 的 Array.isArray()做判断
Array.isArrray(obj);
- 通过 instanceof 做判断
obj instanceof Array
- 通过 Array.prototype.isPrototypeOf
Array.prototype.isPrototypeOf(obj)
use strict 是什么意思 ? 应用它区别是什么?
use strict 是一种 ECMAscript5 增加的(严格模式)运行模式,这种模式使得 Javascript 在更严格的条件下运行。设立严格模式的目标如下:
- 打消 Javascript 语法的不合理、不谨严之处,缩小怪异行为;
- 打消代码运行的不平安之处,保障代码运行的平安;
- 进步编译器效率,减少运行速度;
- 为将来新版本的 Javascript 做好铺垫。
区别:
- 禁止应用 with 语句。
- 禁止 this 关键字指向全局对象。
- 对象不能有重名的属性。
async/await 比照 Promise 的劣势
- 代码读起来更加同步,Promise 尽管解脱了回调天堂,然而 then 的链式调⽤也会带来额定的浏览累赘
- Promise 传递两头值⾮常麻烦,⽽ async/await ⼏乎是同步的写法,⾮常优雅
- 错误处理敌对,async/await 能够⽤成熟的 try/catch,Promise 的谬误捕捉⾮常冗余
- 调试敌对,Promise 的调试很差,因为没有代码块,你不能在⼀个返回表达式的箭头函数中设置断点,如果你在⼀个.then 代码块中使⽤调试器的步进 (step-over) 性能,调试器并不会进⼊后续的.then 代码块,因为调试器只能跟踪同步代码的每⼀步。
对盒模型的了解
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 盒模型(怪异盒模型)
常见的图片格式及应用场景
(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 具备更小的文件体积。当初网站上充斥了大量的图片,如果可能升高每一个图片的文件大小,那么将大大减少浏览器和服务器之间的数据传输量,进而升高拜访提早,晋升拜访体验。目前只有 Chrome 浏览器和 Opera 浏览器反对 WebP 格局,兼容性不太好。
- 在无损压缩的状况下,雷同品质的 WebP 图片,文件大小要比 PNG 小 26%;
- 在有损压缩的状况下,具备雷同图片精度的 WebP 图片,文件大小要比 JPEG 小 25%~34%;
- WebP 图片格式反对图片透明度,一个无损压缩的 WebP 图片,如果要反对透明度只须要 22% 的分外文件大小。
object.assign 和扩大运算法是深拷贝还是浅拷贝,两者区别
扩大运算符:
let outObj = {inObj: {a: 1, b: 2}
}
let newObj = {...outObj}
newObj.inObj.a = 2
console.log(outObj) // {inObj: {a: 2, b: 2}}
Object.assign():
let outObj = {inObj: {a: 1, b: 2}
}
let newObj = Object.assign({}, outObj)
newObj.inObj.a = 2
console.log(outObj) // {inObj: {a: 2, b: 2}}
能够看到,两者都是浅拷贝。
- Object.assign()办法接管的第一个参数作为指标对象,前面的所有参数作为源对象。而后把所有的源对象合并到指标对象中。它会批改了一个对象,因而会触发 ES6 setter。
- 扩大操作符(…)应用它时,数组或对象中的每一个值都会被拷贝到一个新的数组或对象中。它不复制继承的属性或类的属性,然而它会复制 ES6 的 symbols 属性。
JavaScript 中如何进行隐式类型转换?
首先要介绍 ToPrimitive
办法,这是 JavaScript 中每个值隐含的自带的办法,用来将值(无论是根本类型值还是对象)转换为根本类型值。如果值为根本类型,则间接返回值自身;如果值为对象,其看起来大略是这样:
/*** @obj 须要转换的对象 * @type 冀望的后果类型 */
ToPrimitive(obj,type)
type
的值为 number
或者string
。
(1)当 type
为number
时规定如下:
- 调用
obj
的valueOf
办法,如果为原始值,则返回,否则下一步; - 调用
obj
的toString
办法,后续同上; - 抛出
TypeError
异样。
(2)当 type
为string
时规定如下:
- 调用
obj
的toString
办法,如果为原始值,则返回,否则下一步; - 调用
obj
的valueOf
办法,后续同上; - 抛出
TypeError
异样。
能够看出两者的次要区别在于调用 toString
和valueOf
的先后顺序。默认状况下:
- 如果对象为 Date 对象,则
type
默认为string
; - 其余状况下,
type
默认为number
。
总结下面的规定,对于 Date 以外的对象,转换为根本类型的大略规定能够概括为一个函数:
var objToNumber = value => Number(value.valueOf().toString())
objToNumber([]) === 0
objToNumber({}) === NaN
而 JavaScript 中的隐式类型转换次要产生在 +、-、*、/
以及 ==、>、<
这些运算符之间。而这些运算符只能操作根本类型值,所以在进行这些运算前的第一步就是将两边的值用 ToPrimitive
转换成根本类型,再进行操作。
以下是根本类型的值在不同操作符的状况下隐式转换的规定(对于对象,其会被 ToPrimitive
转换成根本类型,所以最终还是要利用根本类型转换规定):
+
操作符+
操作符的两边有至多一个string
类型变量时,两边的变量都会被隐式转换为字符串;其余状况下两边的变量都会被转换为数字。
1 + '23' // '123'
1 + false // 1
1 + Symbol() // Uncaught TypeError: Cannot convert a Symbol value to a number
'1' + false // '1false'
false + true // 1
-
、*
、\
操作符
NaN
也是一个数字
1 * '23' // 23
1 * false // 0
1 / 'aa' // NaN
- 对于
==
操作符
操作符两边的值都尽量转成number
:
3 == true // false, 3 转为 number 为 3,true 转为 number 为 1
'0' == false //true, '0' 转为 number 为 0,false 转为 number 为 0
'0' == 0 // '0' 转为 number 为 0
- 对于
<
和>
比拟符
如果两边都是字符串,则比拟字母表程序:
'ca' < 'bd' // false
'a' < 'b' // true
其余状况下,转换为数字再比拟:
'12' < 13 // true
false > -1 // true
以上说的是根本类型的隐式转换,而对象会被 ToPrimitive
转换为根本类型再进行转换:
var a = {}
a > 2 // false
其比照过程如下:
a.valueOf() // {}, 下面提到过,ToPrimitive 默认 type 为 number,所以先 valueOf,后果还是个对象,下一步
a.toString() // "[object Object]",当初是一个字符串了
Number(a.toString()) // NaN,依据下面 < 和 > 操作符的规定,要转换成数字
NaN > 2 //false,得出比拟后果
又比方:
var a = {name:'Jack'}
var b = {age: 18}
a + b // "[object Object][object Object]"
运算过程如下:
a.valueOf() // {},下面提到过,ToPrimitive 默认 type 为 number,所以先 valueOf,后果还是个对象,下一步
a.toString() // "[object Object]"
b.valueOf() // 同理
b.toString() // "[object Object]"
a + b // "[object Object][object Object]"
const 对象的属性能够批改吗
const 保障的并不是变量的值不能改变,而是变量指向的那个内存地址不能改变。对于根本类型的数据(数值、字符串、布尔值),其值就保留在变量指向的那个内存地址,因而等同于常量。
但对于援用类型的数据(次要是对象和数组)来说,变量指向数据的内存地址,保留的只是一个指针,const 只能保障这个指针是固定不变的,至于它指向的数据结构是不是可变的,就齐全不能管制了。
li 与 li 之间有看不见的空白距离是什么起因引起的?如何解决?
浏览器会把 inline 内联元素间的空白字符(空格、换行、Tab 等)渲染成一个空格。为了好看,通常是一个 <li>
放在一行,这导致 <li>
换行后产生换行字符,它变成一个空格,占用了一个字符的宽度。
解决办法:
(1)为 <li>
设置 float:left。有余:有些容器是不能设置浮动,如左右切换的焦点图等。
(2)将所有 <li>
写在同一行。有余:代码不美观。
(3)将 <ul>
内的字符尺寸间接设为 0,即 font-size:0。有余:<ul>
中的其余字符尺寸也被设为 0,须要额定从新设定其余字符尺寸,且在 Safari 浏览器仍然会呈现空白距离。
(4)打消 <ul>
的字符距离 letter-spacing:-8px,有余:这也设置了 <li>
内的字符距离,因而须要将 <li>
内的字符距离设为默认 letter-spacing:normal。
let、const、var 的区别
(1)块级作用域: 块作用域由 {}
包含,let 和 const 具备块级作用域,var 不存在块级作用域。块级作用域解决了 ES5 中的两个问题:
- 内层变量可能笼罩外层变量
- 用来计数的循环变量泄露为全局变量
(2)变量晋升: var 存在变量晋升,let 和 const 不存在变量晋升,即在变量只能在申明之后应用,否在会报错。
(3)给全局增加属性: 浏览器的全局对象是 window,Node 的全局对象是 global。var 申明的变量为全局变量,并且会将该变量增加为全局对象的属性,然而 let 和 const 不会。
(4)反复申明: var 申明变量时,能够反复申明变量,后申明的同名变量会笼罩之前申明的遍历。const 和 let 不容许反复申明变量。
(5)暂时性死区: 在应用 let、const 命令申明变量之前,该变量都是不可用的。这在语法上,称为 暂时性死区。应用 var 申明的变量不存在暂时性死区。
(6)初始值设置: 在变量申明时,var 和 let 能够不必设置初始值。而 const 申明变量必须设置初始值。
(7)指针指向: let 和 const 都是 ES6 新增的用于创立变量的语法。let 创立的变量是能够更改指针指向(能够从新赋值)。但 const 申明的变量是不容许扭转指针的指向。
区别 | var | let | const |
---|---|---|---|
是否有块级作用域 | × | ✔️ | ✔️ |
是否存在变量晋升 | ✔️ | × | × |
是否增加全局属性 | ✔️ | × | × |
是否反复申明变量 | ✔️ | × | × |
是否存在暂时性死区 | × | ✔️ | ✔️ |
是否必须设置初始值 | × | × | ✔️ |
是否扭转指针指向 | ✔️ | ✔️ | × |