前端面试题

1. position  五种布局

   absolute  relative   fixed  static  sticky

 

● link标签和import标签的区别

参考回答:

link属于html标签,而@import是css提供的

页面被加载时,link会同时被加载,而@import引用的css会等到页面加载结束后加载。

linkhtml标签,因此没有兼容性,而@import只有IE5以上才能识别。

link方式样式的权重高于@import的。

● transition和animation的区别

参考回答:

Animation和transition大部分属性是相同的,他们都是随时间改变元素的属性值,他们的主要区别是transition需要触发一个事件才能改变属性,而animation不需要触发任何事件的情况下才会随时间改变属性值,并且transition为2帧,从from .... to,而animation可以一帧一帧的。

● Flex布局

参考回答:

文章链接:

FlexFlexible Box的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。
布局的传统解决方案,基于盒状模型,依赖display属性 + position属性 + float属性。它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现。

简单的分为容器属性和元素属性
容器的属性:

flex-direction:决定主轴的方向(即子item的排列方法)
.box {
flex-direction: row | row-reverse | column | column-reverse;
}

flex-wrap:决定换行规则
.box{
flex-wrap: nowrap | wrap | wrap-reverse;
}

flex-flow
.box {
flex-flow: <flex-direction> || <flex-wrap>;
}

justify-content:对其方式,水平主轴对齐方式

align-items:对齐方式,竖直轴线方向

项目的属性(元素的属性):

order属性:定义项目的排列顺序,顺序越小,排列越靠前,默认为0

flex-grow属性:定义项目的放大比例,即使存在空间,也不会放大

flex-shrink属性:定义了项目的缩小比例,当空间不足的情况下会等比例的缩小,如果定义个itemflow-shrink0,则为不缩小

flex-basis属性:定义了在分配多余的空间,项目占据的空间。

flex:是flex-growflex-shrinkflex-basis的简写,默认值为0 1 auto

align-self:允许单个项目与其他项目不一样的对齐方式,可以覆盖align-items,默认属性为auto,表示继承父元素的align-items

比如说,用flex实现圣杯布局

● 说一下块元素和行元素

参考回答:

块元素:独占一行,并且有自动填满父元素,可以设置margin和pading以及高度和宽度

行元素:不会独占一行,width和height会失效,并且在垂直方向的padding和margin会失
效。

● position属性 比较

参考回答:

固定定位fixed:

元素的位置相对于浏览器窗口是固定位置,即使窗口是滚动的它也不会移动。Fixed定位使元素的位置与文档流无关,因此不占据空间。 Fixed定位的元素和其他元素重叠。

相对定位relative

如果对一个元素进行相对定位,它将出现在它所在的位置上。然后,可以通过设置垂直或水平位置,让这个元素相对于它的起点进行移动。 在使用相对定位时,无论是否进行移动,元素仍然占据原来的空间。因此,移动元素会导致它覆盖其它框。

绝对定位absolute

绝对定位的元素的位置相对于最近的已定位父元素,如果元素没有已定位的父元素,那么它的位置相对于<html>absolute 定位使元素的位置与文档流无关,因此不占据空间。 absolute 定位的元素和其他元素重叠。

粘性定位sticky

元素先按照普通文档流定位,然后相对于该元素在流中的flow rootBFC)和 containing block(最近的块级祖先元素)定位。而后,元素定位表现为在跨越特定阈值前为相对定位,之后为固定定位。

默认定位Static

默认值。没有定位,元素出现在正常的流中(忽略top, bottom, left, right 或者 z-index 声明)。

inherit:

规定应该从父元素继承position 属性的值。

 

 

● 浮动清除

参考回答:

方法一:使用带clear属性的空元素

在浮动元素后使用一个空元素如<div class="clear"></div>,并在CSS中赋予.clear{clear:both;}属性即可清理浮动。亦可使用<br class="clear" /><hr class="clear" />来进行清理。

方法二:使用CSSoverflow属性

给浮动元素的容器添加overflow:hidden;overflow:auto;可以清除浮动,另外在 IE6 中还需要触发 hasLayout ,例如为父元素设置容器宽高或设置 zoom:1

在添加overflow属性后,浮动元素又回到了容器层,把容器高度撑起,达到了清理浮动的效果。

方法三:给浮动的元素的容器添加浮动

给浮动元素的容器也添加上浮动属性即可清除内部浮动,但是这样会使其整体浮动,影响布局,不推荐使用。

方法四:使用邻接元素处理

什么都不做,给浮动元素后面的元素添加clear属性。

方法五:使用CSS:after伪元素

结合:after 伪元素(注意这不是伪类,而是伪元素,代表一个元素之后最近的元素)和 IEhack ,可以完美兼容当前主流的各大浏览器,这里的 IEhack 指的是触发 hasLayout

给浮动元素的容器添加一个clearfixclass,然后给这个class添加一个:after伪元素实现元素末尾添加一个看不见的块元素(Block element)清理浮动。

隐藏页面中某个元素的方法

参考回答:

display:none; visibility:hidden; opacity: 0; position移到外部,z-index涂层遮盖等等

● CSS盒模型

参考回答:

当对一个文档进行布局时候,浏览器渲染引擎会根据CSS-box模型,将所有元素表示为一个矩形盒子,CSS决定这些盒子的大小,位置,属性,如图:

 

 


content包含元素真实内容的区域,由width,height,控制内容大小,
内边距padding,边框区域border,外边距margin,用空白区域扩展边框区域,已分开相邻的元素,

● 对CSS的新属性有了解过的吗?

参考回答:

CSS3的新特性中,在布局方面新增了flex布局,在选择器方面新增了例如first-of-type,nth-child等选择器,在盒模型方面添加了box-sizing来改变盒模型,在动画方面增加了animation,2d变换,3d变换等,在颜色方面添加透明,rbga等,在字体方面允许嵌入字体和设置字体阴影,最后还有媒体查讯等

css实现一个硬币旋转的效果

参考回答:

#euro {

width: 150px;

height: 150px;

margin-left: -75px;

margin-top: -75px;

position: absolute;

top: 50%;

left: 50%;

transform-style: preserve-3d;

animation: spin 2.5s linear infinite;

}

.back {

background-image: url("/uploads/160101/backeuro.png");

width: 150px;

height: 150px;

}

.middle {

background-image: url("/uploads/160101/faceeuro.png");

width: 150px;

height: 150px;

transform: translateZ(1px);

position: absolute;

top: 0;

}

.front {

background-image: url("/uploads/160101/faceeuro.png");

height: 150px;

position: absolute;

top: 0;

transform: translateZ(10px);

width: 150px;

}

@keyframes spin {

0% {

transform: rotateY(0deg);

}

100% {

transform: rotateY(360deg);

}

}

 

 

● 如何解决异步回调地狱

参考回答:

 

1

promise、generator、async/await

 

● 说一下图片的懒加载和预加载

参考回答:

预加载:提前加载图片,当用户需要查看时可直接从本地缓存中渲染。

懒加载:懒加载的主要目的是作为服务器前端的优化,减少请求数或延迟请求数。

 

两种技术的本质:两者的行为是相反的,一个是提前加载,一个是迟缓甚至不加载。
懒加载对服务器前端有一定的缓解压力作用,预加载则会增加服务器前端压力。

● mouseover和mouseenter的区别

参考回答:

mouseover:当鼠标移入元素或其子元素都会触发事件,所以有一个重复触发,冒泡的过程。对应的移除事件是mouseout

mouseenter:当鼠标移除元素本身(不包含元素的子元素)会触发事件,也就是不会冒泡,对应的移除事件是mouseleave

● Ajax解决浏览器缓存问题

参考回答:

ajax发送请求前加上 anyAjaxObj.setRequestHeader("If-Modified-Since","0")。

 

 

ajax发送请求前加上 anyAjaxObj.setRequestHeader("Cache-Control","no-cache")

URL后面加上一个随机数: "fresh=" + Math.random()

URL后面加上时间搓:"nowtime=" + new Date().getTime()

如果是使用jQuery,直接这样就可以了 $.ajaxSetup({cache:false})。这样页面的所有ajax都会执行这条语句就是不需要保存缓存记录。

● js的各种位置,比如clientHeight,scrollHeight,offsetHeight ,以及scrollTop, offsetTop,clientTop的区别?

参考回答:

clientHeight:表示的是可视区域的高度,不包含border和滚动条

offsetHeight:表示可视区域的高度,包含了border和滚动条

scrollHeight:表示了所有区域的高度,包含了因为滚动被隐藏的部分。

clientTop:表示边框border的厚度,在未指定的情况下一般为0

scrollTop:滚动后被隐藏的高度,获取对象相对于由offsetParent属性指定的父坐标(css定位的元素或body元素)距离顶端的高度。

实现滚动的原理

scrollTop + clientTop  > = scrollHeight   表示已经到了底部

 

● Ajax解决浏览器缓存问题

参考回答:

ajax发送请求前加上 anyAjaxObj.setRequestHeader("If-Modified-Since","0")。

 

 

ajax发送请求前加上 1.anyAjaxObj.setRequestHeader("Cache-Control","no-cache")

2.URL后面加上一个随机数: "fresh=" + Math.random()

3.URL后面加上时间搓:"nowtime=" + new Date().getTime()

4.如果是使用jQuery,直接这样就可以了 $.ajaxSetup({cache:false})。这样页面的所有ajax都会执行这条语句就是不需要保存缓存记录。

● eval是做什么的

参考回答:

它的功能是将对应的字符串解析成js并执行,应该避免使用js,因为非常消耗性能(2次,一次解析成js,一次执行)

 

● 对象深度克隆的简单实现

参考回答:

function deepClone(obj){

var newObj= obj instanceof Array ? []:{};

for(var item in obj){

var temple= typeof obj[item] == 'object' ? deepClone(obj[item]):obj[item];

newObj[item] = temple;

}

return newObj;

}

ES5的常用的对象克隆的一种方式。注意数组是对象,但是跟对象又有一定区别,所以我们一开始判断了一些类型,决定newObj是对象还是数组~

● 实现一个once函数,传入函数参数只执行一次

function ones(func){

var tag=true;

return function(){

if(tag==true){

func.apply(null,arguments);

tag=false;

}

return undefined

}

}

 

● 数组常用方法

参考回答:

push(),pop(),shift(),unshift(),splice(),sort(),reverse(),map()等

● 数组去重

参考回答:

法一:indexOf循环去重

法二:ES6 Set去重;Array.from(new Set(array))

法三:Object 键值对去重;把数组的值存成 Object key 值,比如 Object[value1] = true,在判断另一个值的时候,如果 Object[value2]存在的话,就说明该值是重复的。

1.ES6 set去重

function unique (arr) {

  return Array.from(new Set(arr))

}

var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];console.log(unique(arr))

 //[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {}, {}]

2. indexof 去重

 function unique(arr) {

    if (!Array.isArray(arr)) {

        console.log('type error!')

        return

    }

    var array = [];

    for (var i = 0; i < arr.length; i++) {

        if (array .indexOf(arr[i]) === -1) {

            array .push(arr[i])

        }

    }

    return array;

}

● vue的生命周期

参考回答:

Vue实例有一个完整的生命周期,也就是从开始创建、初始化数据、编译模板、挂载Dom、渲染→更新→渲染、销毁等一系列过程,我们称这是Vue的生命周期。通俗说就是Vue实例从创建到销毁的过程,就是生命周期。

每一个组件或者实例都会经历一个完整的生命周期,总共分为三个阶段:初始化、运行中、销毁。

实例、组件通过new Vue() 创建出来之后会初始化事件和生命周期,然后就会执行beforeCreate钩子函数,这个时候,数据还没有挂载呢,只是一个空壳,无法访问到数据和真实的dom,一般不做操作

挂载数据,绑定事件等等,然后执行created函数,这个时候已经可以使用到数据,也可以更改数据,在这里更改数据不会触发updated函数,在这里可以在渲染前倒数第二次更改数据的机会,不会触发其他的钩子函数,一般可以在这里做初始数据的获取

接下来开始找实例或者组件对应的模板,编译模板为虚拟dom放入到render函数中准备渲染,然后执行beforeMount钩子函数,在这个函数中虚拟dom已经创建完成,马上就要渲染,在这里也可以更改数据,不会触发updated,在这里可以在渲染前最后一次更改数据的机会,不会触发其他的钩子函数,一般可以在这里做初始数据的获取

接下来开始render,渲染出真实dom,然后执行mounted钩子函数,此时,组件已经出现在页面中,数据、真实dom都已经处理好了,事件都已经挂载好了,可以在这里操作真实dom等事情...

当组件或实例的数据更改之后,会立即执行beforeUpdate,然后vue的虚拟dom机制会重新构建虚拟dom与上一次的虚拟dom树利用diff算法进行对比之后重新渲染,一般不做什么事儿

当更新完成后,执行updated,数据已经更改完成,dom也重新render完成,可以操作更新后的虚拟dom

当经过某种途径调用$destroy方法后,立即执行beforeDestroy,一般在这里做一些善后工作,例如清除计时器、清除非指令绑定的事件等等

组件的数据绑定、监听...去掉后只剩下dom空壳,这个时候,执行destroyed,在这里做善后工作也可以

● ES6箭头函数的特性

参考回答:

ES6 增加了箭头函数,基本语法为

let func = value => value;

相当于

let func = function (value) {

return value;

};

箭头函数与普通函数的区别在于:

1、箭头函数没有this,所以需要通过查找作用域链来确定this的值,这就意味着如果箭头函数被非箭头函数包含,this绑定的就是最近一层非箭头函数的this

2、箭头函数没有自己的arguments对象,但是可以访问外围函数的arguments对象

3、不能通过new关键字调用,同样也没有new.target值和原型

 

 

 

posted @ 2021-04-02 09:42  桂长江  阅读(87)  评论(0编辑  收藏  举报