前端面试题 腾讯微视

tech2022-08-19  80

1.axios和ajax的区别

相同点:都是执行异步请求操作

不同点:

大小 axios体积小 只需在要使用的目录下 npm install axios --saveajax 需要导入jQuery【体积较大 只是为了ajax去引入是不值得的】针对方向 axios 符合前端MVVM的浪潮ajax 本身是针对MVC的编程实现方法与返回值 axios 用promise技术实现对ajax技术的封装  返回值是 promiseajax   基于原生的XHR开发,XHR本身的架构不清晰,已经有了fetch的替代方案对并发请求的封装api

2.深拷贝和浅拷贝 

简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力。

深拷贝主要是将另一个对象的属性值拷贝过来之后,另一个对象的属性值并不受到影响,因为此时它自己在堆中开辟了自己的内存区域,不受外界干扰。浅拷贝主要拷贝的是对象的引用值,当改变对象的值,另一个对象的值也会发生变化。 

let a=[0,1,2,3,4], b=a; console.log(a===b); a[0]=1; console.log(a,b);

3.HTML5新特性 

 

语义化标签(好处:(1).使代码结构清晰,便于阅读(2)便于SEO (3)无障碍阅读(4)便于后期的维护与开发)

智能表单

html5中提供了多个新的类型的input类型(1.color2.datatime3.data4.tel5.e-mail6.number7.range8.search)

音频(audio)和视频(video)

canvas

svg

地理地位

拖放的API(drag、drop)

web worker

web storage

web socket 

4.ES6新特性

let 和 const 命令

类 Class

函数参数默认值 

箭头函数

模板字符串

变量的解构赋值

扩展运算符(spread)

模块化 Module

对象属性简写

Promise

for...of

5.CSS3新特性

新增各种CSS选择器(:not(.input) 所有class不是“input”的节点)

圆角(border-radius)

多列布局(multi-columnlayout)

阴影和反射(Shadow/Reflect)

文字特效(text-shadow)

文字渲染(Text-decoration)

线性渐变(gradient)

旋转(transform)

缩放,定位,倾斜,动画,多背景 

6.promise 

概述:Promise是异步编程的一种解决方案,从语法上讲,Promise是一个对象,可以获取异步操作的消息目的: (1)避免回调地狱的问题(2)Promise对象提供了简洁的API,使得控制异步操作更加容易Promise有三种状态:pendding //正在请求,rejected //失败,resolved //成功基础用法:new Promise(function(resolve,reject){ })resolved,rejected函数:在异步事件状态pendding->resolved回调成功时,通过调用resolved函数返回结果;当异步操作失败时,回调用rejected函数显示错误信息then的用法:then中传了两个参数,第一个对应resolve的回调,第二个对应reject的回调 p.then((data) => { console.log('resolved',data); },(err) => { console.log('rejected',err); } ); catch方法:捕捉promise错误函数,和then函数参数中rejected作用一样,处理错误,由于Promise抛出错误具有冒泡性质,能够不断传递,会传到catch中,所以一般来说所有错误处理放在catch中,then中只处理成功的,同时catch还会捕捉resolved中抛出的异常 p.then((data) => { console.log('resolved',data); }) .catch((err) => { console.log('rejected',err); }); all方法:Promise.all([promise1,promise2])——参数是对象数组。以慢为准,等数组中所有的promise对象状态为resolved时,该对象就为resolved;只要数组中有任意一个promise对象状态为rejected,该对象就为rejected  let p = Promise.all([Promise1, Promise2]) p.then((data) => { //都成功才表示成功 }) .catch((err) => { //有一个失败,则都失败 }); race方法:Promise.race([promise1,promise2])——参数是对象数组。以快为准,数组中所有的promise对象,有一个先执行了何种状态,该对象就为何种状态,并执行相应函数 

7.vuex 

(1)vuex的属性有 5 种,分别是 state、getter、mutation、action、module

state => 基本数据

getters => 从基本数据派生的数据

mutations => 提交更改数据的方法,同步.

actions => 像一个装饰器,包裹mutations,使之可以异步。

modules => 模块化Vuex

(2)vuex 的 store 特性是什么

 vuex 就是一个仓库,仓库里放了很多对象。其中 state 就是数据源存放地,对应于一般 vue 对象里面的 data

state 里面存放的数据是响应式的,vue 组件从 store 读取数据,若是 store 中的数据发生改变,依赖这相数据的组件也会发生更新

它通过 mapState 把全局的 state 和 getters 映射到当前组件的 computed 计算属性

(3) vuex 的 getter 特性是什么

getter 可以对 state 进行计算操作,它就是 store 的计算属性

虽然在组件内也可以做计算属性,但是 getters 可以在多给件之间复用

 如果一个状态只在一个组件内使用,是可以不用 getters

(4)vuex 的 mutation 特性是什么

action 类似于 muation, 不同在于:action 提交的是 mutation,而不是直接变更状态

action 可以包含任意异步操作

(5)vue 中 ajax 请求代码应该写在组件的methods中还是vuex 的action中

       如果请求来的数据不是要被其他组件公用,仅仅在请求的组件内使用,就不需要放入 vuex 的 state 里

       如果被其他地方复用,请将请求放入 action 里,方便复用,并包装成 promise 返回

(6)不用 vuex 会带来什么问题

可维护性会下降,你要修改数据,你得维护3个地方

可读性下降,因为一个组件里的数据,你根本就看不出来是从哪里来的

增加耦合,大量的上传派发,会让耦合性大大的增加,本来Vue用Component就是为了减少耦合,现在这么用,和组件化的初衷相背

8.vue中的路由钩子函数 

vue路由钩子大致可以分为三类:

1.全局钩子(主要包括beforeEachafte1rEach

    beforeEach函数有三个参数

to:router即将进入的路由对象from:当前导航即将离开的路由next:Function,进行管道中的一个钩子,如果执行完了,则导航的状态就是 confirmed (确认的);否则为false,终止导航。

    afterEach函数不用传next()函数

2.单个路由里面的钩子(主要用于写某个指定路由跳转时需要执行的逻辑)

3.组件路由(主要包括 beforeRouteEnterbeforeRouteUpdate ,beforeRouteLeave,这几个钩子都是写在组件里面也可以传三个参数(to,from,next),作用与前面类似.)

9.普通函数和箭头函数的区别 

箭头函数语法上比普通函数更加简洁箭头函数没有自己的this,它里面出现this是继承函数所处上下文中的this,(使用call,apply等任何方式都无法改变this的指向)箭头函数中没有arguments(类数组),只能基于…ARG获取传递的参数集合箭头函数不能被new函数(因为:箭头函数没有this,也没有prototype)

10.Localstorage和Sessionstorage的区别

localStorage生命周期是永久,这意味着除非用户显示在浏览器提供的UI上清除localStorage信息,否则这些信息将永远存在。存放数据大小为一般为5MB,而且它仅在客户端(即浏览器)中保存,不参与和服务器的通信。

sessionStorage仅在当前会话下有效,关闭页面或浏览器后被清除。存放数据大小为一般为5MB,而且它仅在客户端(即浏览器)中保存,不参与和服务器的通信。源生接口可以接受,亦可再次封装来对Object和Array有更好的支持。

11.http状态码 

状态码相应类别原因短语1xx信息性状态码服务器正在处理请求2xx成功状态码请求已正常处理完毕3xx重定向状态码需要进行额外操作以完成请求4xx客户端错误状态码客户端原因导致服务器无法处理请求5xx服务器错误状态码服务器原因导致处理请求出错

http状态码列表 

100Continue继续。客户端应继续其请求101Switching Protocols切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议 200OK请求成功。一般用于GET与POST请求201Created已创建。成功请求并创建了新的资源202Accepted已接受。已经接受请求,但未处理完成203Non-Authoritative Information非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本204No Content无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档205Reset Content重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域206Partial Content部分内容。服务器成功处理了部分GET请求 300Multiple Choices多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择301Moved Permanently永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替302Found临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI303See Other查看其它地址。与301类似。使用GET和POST请求查看304Not Modified未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源305Use Proxy使用代理。所请求的资源必须通过代理访问306Unused已经被废弃的HTTP状态码307Temporary Redirect临时重定向。与302类似。使用GET请求重定向 400Bad Request客户端请求的语法错误,服务器无法理解401Unauthorized请求要求用户的身份认证402Payment Required保留,将来使用403Forbidden服务器理解请求客户端的请求,但是拒绝执行此请求404Not Found服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面405Method Not Allowed客户端请求中的方法被禁止406Not Acceptable服务器无法根据客户端请求的内容特性完成请求407Proxy Authentication Required请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权408Request Time-out服务器等待客户端发送的请求时间过长,超时409Conflict服务器完成客户端的 PUT 请求时可能返回此代码,服务器处理请求时发生了冲突410Gone客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置411Length Required服务器无法处理客户端发送的不带Content-Length的请求信息412Precondition Failed客户端请求信息的先决条件错误413Request Entity Too Large由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息414Request-URI Too Large请求的URI过长(URI通常为网址),服务器无法处理415Unsupported Media Type服务器无法处理请求附带的媒体格式416Requested range not satisfiable客户端请求的范围无效417Expectation Failed服务器无法满足Expect的请求头信息 500Internal Server Error服务器内部错误,无法完成请求501Not Implemented服务器不支持请求的功能,无法完成请求502Bad Gateway作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应503Service Unavailable由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中504Gateway Time-out充当网关或代理的服务器,未及时从远端服务器获取请求505HTTP Version not supported服务器不支持请求的HTTP协议的版本,无法完成处理

12.什么是MVVM

 前后端分离:Model用纯JavaScript对象表示,View负责显示。

 model:服务器的业务逻辑操作

 view:用户界面

 ViewModel:核心枢纽

过程:把view和model关联起来的就是View Model。

           ViewModel负责把Model的数据同步到view显出来,还负责把view修改同步到Model。

1. 各部分之间的通信,都是双向的。

2. View 与 Model 不发生联系,都通过ViewModel传递。

13.vue的生命周期 

总共分为8个阶段创建前/后,载入前/后,更新前/后,销毁前/后。

创建前/后: 在beforeCreated阶段,vue实例的挂载元素$el和数据对象data都为undefined,还未初始化。在created阶段,vue实例的数据对象data有了,$el还没有。

载入前/后:在beforeMount阶段,vue实例的$el和data都初始化了,但还是挂载之前为虚拟的dom节点,data.message还未替换。在mounted阶段,vue实例挂载完成,data.message成功渲染。

更新前/后:当data变化时,会触发beforeUpdate和updated方法。

销毁前/后:在执行destroy方法后,对data的改变不会再触发周期函数,说明此时vue实例已经解除了事件监听以及和dom的绑定,但是dom结构依然存在。

14.对keep-alive的理解 

对keep-alive的了解

keep-alive是一个抽象组件,它是Vue的内置组件。

keep-alive可以实现组件的缓存,当组件切换时不会对当前组件进行卸载。

常用的属性有:

include:设置会被缓存的组件。exclude:设置不会被缓存的组件。

keep-alive相关的生命周期钩子函数:

activated: 进入页面时触发。(常用来实现每次进入页面的时候重新获取最新的数据)deactivated:退出页面时触发。

 

15.call、apply、bind的作用和区别 

 

1、相同点:

 三个函数都会改变this的指向(调用这三个函数的函数内部的this)

2、不同点:

 1)、bind会产生新的函数,(把对象和函数绑定死后,产生新的函数)

 2)、call和apply不会产生新的函数,只是在调用时,绑定一下而已。

 3)、call和apply的区别,第一个参数都是要绑定的this,apply第二个参数是数组(是函数的所有参数),call把apply的第二个参数单列出来。

16.get和post的区别 

GET产生一个TCP数据包;POST产生两个TCP数据包。

1、url可见性:

get,参数url可见;

post,url参数不可见

2、数据传输上:

get,通过拼接url进行传递参数;

post,通过body体传输参数

3、缓存性:

get请求是可以缓存的

post请求不可以缓存

4、后退页面的反应

get请求页面后退时,不产生影响

post请求页面后退时,会重新提交请求

5、传输数据的大小

get一般传输数据大小不超过2k-4k(根据浏览器不同,限制不一样,但相差不大)

post请求传输数据的大小根据php.ini 配置文件设定,也可以无限大。

6、安全性

这个也是最不好分析的,原则上post肯定要比get安全,毕竟传输参数时url不可见,但也挡不住部分人闲的没事在那抓包玩。安全性个人觉得是没多大区别的,防君子不防小人就是这个道理。对传递的参数进行加密,其实都一样。

 

 17.跨域,以及如何解决跨域

什么是跨域?

浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域

如何解决跨域问题?

1、jsonp跨域 JSONP(JSON with Padding:填充式JSON),应用JSON的一种新方法, JSON、JSONP的区别:  1、JSON返回的是一串数据、JSONP返回的是脚本代码(包含一个函数调用)  2、JSONP 只支持get请求、不支持post请求  (类似往页面添加一个script标签,通过src属性去触发对指定地址的请求,故只能是Get请求)

2、nginx反向代理:   www.baidu.com/index.html需要调用www.sina.com/server.php,可以写一个接口www.baidu.com/server.php,由这个接口在后端去调用www.sina.com/server.php并拿到返回值,然后再返回给index.html   3、PHP端修改header   header(‘Access-Control-Allow-Origin:*’);//允许所有来源访问   header(‘Access-Control-Allow-Method:POST,GET’);//允许访问的方式 

4、document.domain

5、window.name

6、postMessage  

18.原型链 

 原型:所有的函数都有一个特殊的属性prototype(原型),prototype属性是一个指针,指向的是一个对象(原型对象),原型对象中的方法和属性都可以被函数的实例所共享。所谓的函数实例是指以函数作为构造函数创建的对象,这些对象实例都可以共享构造函数的原型的方法。

  原型链:原型链是用于查找引用类型(对象)的属性,查找属性会沿着原型链依次进行,如果找到该属性会停止搜索并做相应的操作,否则将会沿着原型链依次查找直到结尾。常见的应用是用在创建对象和继承中。

 19.对vue中虚拟dom的理解

     虚拟的DOM的核心思想是:对复杂的文档DOM结构,提供一种方便的工具,进行最小化地DOM操作。

20.vue和react的区别 

 一、相同点

1、 都支持服务器端渲染 2、 都有Virtual DOM(虚拟dom),组件化开发,都有‘props’的概念,这是properties的简写。props在组件中是一个特殊的属性,允许父组件往子组件传送数据,都实现webComponent规范 3 、数据驱动视图 4 、都有支持native的方案,React的React native、Vue的weex 5 、构建工具 React和Vue都有自己的构建工具,你可以使用它快速搭建开发环境。React可以使用Create React App (CRA),而Vue对应的则是vue-cli。两个工具都能让你得到一个根据最佳实践设置的项目模板。都有管理状态,React有redux,Vue有自己的Vuex(自适应vue,量身定做)

二、区别设计思想 react 1 、函数式思想,all in js ,jsx语法,js操控css 2、 单项数据流 3、 setState重新渲染 4 、每当应用的状态被改变时,全部子组件都会重新渲染。当然,这可以通过shouldComponentUpdate这个生命周期方法来进行控制,如果为true继续渲染、false不渲染,但Vue将此视为默认的优化。

vue 1 、响应式思想,也就是基于数据可变的。把html、js、css、组合到一起,也可以通过标签引擎组合到一个页面中 2、 双向绑定,每一个属性都需要建立watch监听(页面不用,涉及到组件更新的话需要) 3、 Vue宣称可以更快地计算出Virtual DOM的差异,这是由于它在渲染过程中,会跟踪每一个组件的依赖关系,不需要重新渲染整个组件树

性能 react ----大型项目 优化需要手动去做,状态可控 vue ------中小型项目 状态改变需要watch监听,数据量太大的话会卡顿

扩展性 react 1、 类式写法api少,更容易结合ts 2、 可以通过高阶组件来扩展 vue 1 、声明式写法,结合ts比较复杂 2 、需要通过mixin方式来扩展

21.防抖和节流 

  防抖和节流的作用都是防止函数多次调用。区别在于,假设一个用户一直触发这个函数,且每次触发函数的间隔小于wait,防抖的情况下只会调用一次,而节流的 情况会每隔一定时间(参数wait)调用函数。

防抖  触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间。

节流  高频事件触发,但在n秒内只会执行一次,所以节流会稀释函数的执行频率。

22.用js操作数组的方法 

 shift:删除原数组第一项,并返回删除元素的值;如果数组为空则返回undefined 

unshift:将参数添加到原数组开头,并返回数组的长度

pop:删除原数组最后一项,并返回删除元素的值;如果数组为空则返回undefined 

push:将参数添加到原数组末尾,并返回数组的长度 

concat:返回一个新数组,是将参数添加到原数组中构成的 

splice(start,deleteCount,val1,val2,...):从start位置开始删除deleteCount项,并从该位置起插入val1,val2,... 

sort(orderfunction):按指定的参数对数组进行排序

join(separator):将数组的元素组起一个字符串,以separator为分隔符,省略的话则用默认用逗号为分隔符 

23.重绘和回流

1.回流:

  当render tree中的一部分(或全部)因为元素的规模尺寸,布局,隐藏等改变而需要重新构建。这就称为回流(reflow)。每个页面至少需要一次回流,就是在页面第一次加载的时候,这时候是  一定会发生回流的,因为要构建render tree。

2.重绘:

  在回流的时候,浏览器会使渲染树中受到影响的部分失效,并重新构造这部分渲染树,完成回流后,浏览器会重新绘制受影响的部分到屏幕中,该过程成为重绘。

区别:   回流必将引起重绘,而重绘不一定会引起回流。比如:只有颜色改变的时候就只会发生重绘而不会引起回流   当页面布局和几何属性改变时就需要回流 。比如:添加或者删除可见的DOM元素,元素位置改变,元素尺寸改变——边距、填充、边框、宽度和高度,内容改变。

24.闭包 

闭包就是能够读取其他函数内部变量的函数。只有函数内部的子函数才能读取局部变量,在本质上,闭包是函数内部和函数外部连接起来的桥梁。

(1)、使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。  (2)、闭包有三个特性:  1、函数嵌套函数  2、函数内部可以引用外部的参数和变量  3、参数和变量不会被垃圾回收机制回收 

25.用new创建对象的过程  

 

使用new关键字调用函数(var p=new ClassA( ))的具体步骤:

1. 创建空对象; var p= {};

2. 设置新对象的__proto__属性指向构造函数的prototype对象; p.__proto__ = ClassA.prototype;

3. 使用新对象调用函数,函数中的this被指向新实例对象:   ClassA.call(p);  //{}.构造函数();          

4. 将初始化完毕的新对象地址,保存到等号左边的变量中。使用new关键字调用函数(var p=new ClassA( ))的具体步骤:

1. 创建空对象; var p= {};

2. 设置新对象的__proto__属性指向构造函数的prototype对象; p.__proto__ = ClassA.prototype;

3. 使用新对象调用函数,函数中的this被指向新实例对象:   ClassA.call(p);  //{}.构造函数();          

4. 将初始化完毕的新对象地址,保存到等号左边的变量中。

26.sass和less 

Sass 和 LESS 都是是 CSS 预处理器,是 CSS 上的一种抽象层,是一种特殊的 语法/语言 最终会编译成 CSS

less 是一种动态样式语言,将 CSS 赋予了动态语言的特性,如变量,继承,运算, 函数.。less 既可以在客户端上运行 (支持 IE 6+, Webkit, Firefox),也可一在服务端运行(需要借助 Node.js)。

不同之处

1、Less环境较Sass简单 Cass的安装需要安装Ruby环境,Less基于JavaScript,是需要引入Less.js来处理代码输出css到浏览器,也可以在开发环节使用Less,然后编译成css文件,直接放在项目中,有less.app、SimpleLess、CodeKit.app这样的工具,也有在线编辑地址。

2、Less使用较Sass简单 LESS 并没有裁剪 CSS 原有的特性,而是在现有 CSS 语法的基础上,为 CSS 加入程序式语言的特性。只要你了解 CSS 基础就可以很容易上手。

3、从功能出发,Sass较Less略强大一些①sass有变量和作用域。

$variable,like php;#{$variable}like ruby;

变量有全局和局部之分,并且有优先级。

②sass有函数的概念

@function和@return以及函数参数(还有不定参)可以让你像js开发那样封装你想要的逻辑。@mixin类似function但缺少像function的编程逻辑,更多的是提高css代码段的复用性和模块化,这个用的人也是最多的。ruby提供了非常丰富的内置原生api。

③进程控制:

条件:@if @else;循环遍历:@for @each @while继承:@extend引用:@import

④数据结构:

$list类型=数组;

$map类型=object; 其余的也有string、number、function等类型

4、Less与Sass处理机制不一样   前者是通过客户端处理的,后者是通过服务端处理,相比较之下前者解析会比后者慢一点

5、关于变量在Less和Sass中的唯一区别就是Less用@,Sass用$。 

相同之处

Less和Sass在语法上有些共性,比如下面这些:

1、混入(Mixins)——class中的class; 2、参数混入——可以传递参数的class,就像函数一样; 3、嵌套规则——Class中嵌套class,从而减少重复的代码; 4、运算——CSS中用上数学; 5、颜色功能——可以编辑颜色; 6、名字空间(namespace)——分组样式,从而可以被调用; 7、作用域——局部修改样式; 8、JavaScript 赋值——在CSS中使用JavaScript表达式赋值。

27.前端性能优化的方法 

 

尽量减少HTTP请求次数 压缩合并js css精灵 内联图片。src用data:url scheme减少DNS查询使用CDN 网站上静态资源即css、js全都使用cdn分发,图片亦然,因为cdn拥有众多服务器,用户请求可以请求距离他近的服务器,加快速度避免空的src和href为文件头指定Expires(过期时间)或者Cache-Control头部。使用gzip压缩内容(服务端)把CSS放到顶部把JS放到底部避免使用CSS表达式将CSS和JS放到外部文件中可缓存的AJAX异步请求同样的造成用户等待,所以使用ajax请求时,要主动告诉浏览器如果该请求有缓存就去请求缓存内容。如下代码片段, $.ajax({ url: 'url', dataType: "json", cache: true, //如果有缓存请求缓存 success: function(son, status) {} })使用GET来完成AJAX请求 POST方法:首先发送文件头,然后才发送数据减少DOM元素数量不要404。 所以发出http请求但获得没用的响应(如404)是完全不必要的,并且会降低用户体验,这样首先会降低(占用)并行下载数 如果有404状态码 在此页面展示404样式,不是直接跳转到404页面不要在html中缩放图片

28.css选择器的优先级

选择器的优先级由每一种选择器类型的权重决定。

优先级排序:important > 行内样式 > ID选择器 > 类选择器 > 标签 > 通配符 > 继承 > 浏览器默认属性 

29.响应式布局 

1.pc端响应式布局:是指屏幕大小缩放时样式发生相应改变。运用媒体查询@media来设置。 2.移动端响应式布局:是指根据移动端不同设备实现页面正常显示的方案。运用以下三种方案布局:a. 百分比布局。b. flex布局。c. rem布局 

 

 

.

 

 

 

 

 

 

 

 

 

 

 

 

 

最新回复(0)