2019web前端面试题

相关阅读:https://blog.csdn.net/wdlhao/article/details/79079660 

javascript:

进程与线程的区别?

进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位。

线程:是进程的一个执行单元,是进程内科调度实体。比进程更小的独立运行的基本单位。线程也被称为轻量级进程。

  • 地址空间:同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间。
  • 资源拥有:同一进程内的线程共享本进程的资源如内存、I/O、cpu等,但是进程之间的资源是独立的。

     一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。

     进程切换时,消耗的资源大,效率高。所以涉及到频繁的切换时,使用线程要好于进程。同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程

  • 执行过程:每个独立的进程程有一个程序运行的入口、顺序执行序列和程序入口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
  • 线程是处理器调度的基本单位,但是进程不是。
  • 两者均可并发执行。
  • 优缺点:

      线程执行开销小,但是不利于资源的管理和保护。线程适合在SMP机器(双CPU系统)上运行。

      进程执行开销大,但是能够很好的进行资源管理和保护。进程可以跨机器前移。

    何时使用多进程,何时使用多线程?

    对资源的管理和保护要求高,不限制开销和效率时,使用多进程。

    要求效率高,频繁切换时,资源的保护管理要求不是很高时,使用多线程。

cookie的设置和获取?

设置cookie:

function setCookie(name,value) 

    var Days = 30; 
    var exp = new Date(); 
    exp.setTime(exp.getTime() + Days*24*60*60*1000); 
    document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString(); 
}

获取cookie:

function getCookie(name) 
{ 
    var arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)"); 
   return (arr=document.cookie.match(reg))?unescape(arr[2]):null;
}

删除cookie:

function delCookie(name) 

    var exp = new Date(); 
    exp.setTime(exp.getTime() - 1); 
    var cval=getCookie(name); 
    if(cval!=null) 
        document.cookie= name + "="+cval+";expires="+exp.toGMTString(); 
}

编写h5要注意什么?

 

 

兼容ie的事件封装

 


 js中如何检测一个变量是一个String类型?请写出函数实现?

typeof(obj) === "string"
typeof obj === "string"
obj.constructor === String


请用js去除字符串空格?


方法一:使用replace正则匹配的方法


去除所有空格: str = str.replace(/\s*/g,"");      

去除两头空格: str = str.replace(/^\s*|\s*$/g,"");

去除左空格: str = str.replace( /^\s*/, “”);

去除右空格: str = str.replace(/(\s*$)/g, "");

str为要去除空格的字符串,实例如下:

var str = " 23 23 ";
var str2 = str.replace(/\s*/g,"");
console.log(str2); // 2323


方法二:使用str.trim()方法
str.trim()局限性:无法去除中间的空格,实例如下:

var str = "   xiao  ming   ";
var str2 = str.trim();
console.log(str2);   //xiao  ming 


同理,str.trimLeft(),str.trimRight()分别用于去除字符串左右空格。

方法三:使用jquery,$.trim(str)方法


$.trim(str)局限性:无法去除中间的空格,实例如下:

var str = "   xiao  ming   ";
var str2 = $.trim(str)
console.log(str2);   //  xiao  ming


你如何获取浏览器URL中查询字符串中的参数?


测试地址为:http://www.runoob.com/jquery/misc-trim.html?channelid=12333&name=xiaoming&age=23

实例如下:

function showWindowHref(){
    var sHref = window.location.href;
    var args = sHref.split('?');
    if(args[0] == sHref){
        return "";
    }
    var arr = args[1].split('&');
    var obj = {};
    for(var i = 0;i< arr.length;i++){
        var arg = arr[i].split('=');
        obj[arg[0]] = arg[1];
    }
    return obj;
}
var href = showWindowHref(); // obj
console.log(href['name']); // xiaoming

 

怎样添加、移除、移动、复制、创建和查找节点?


 1)创建新节点

  createDocumentFragment() //创建一个DOM片段
  createElement() //创建一个具体的元素
  createTextNode() //创建一个文本节点

2)添加、移除、替换、插入
  appendChild() //添加
  removeChild() //移除
  replaceChild() //替换
  insertBefore() //插入

3)查找
  getElementsByTagName() //通过标签名称
  getElementsByName() //通过元素的Name属性的值
  getElementById() //通过元素Id,唯一性

写出3个使用this的典型应用?


(1)、在html元素事件属性中使用,如:


(2)、构造函数

function Animal(name, color) {
  this.name = name;
  this.color = color;
}


(3)、input点击,获取值



(4)、apply()/call()求数组最值

var  numbers = [5, 458 , 120 , -215 ]; 
var  maxInNumbers = Math.max.apply(this, numbers);  
console.log(maxInNumbers);  // 458
var maxInNumbers = Math.max.call(this,5, 458 , 120 , -215); 
console.log(maxInNumbers);  // 458


比较typeof与instanceof?


相同点:JavaScript 中 typeof 和 instanceof 常用来判断一个变量是否为空,或者是什么类型的。

typeof的定义和用法:返回值是一个字符串,用来说明变量的数据类型。

细节:

(1)、typeof 一般只能返回如下几个结果:number,boolean,string,function,object,undefined。

(2)、typeof 来获取一个变量是否存在,如 if(typeof a!="undefined"){alert("ok")},而不要去使用 if(a) 因为如果 a 不存在(未声明)则会出错。

(3)、对于 Array,Null 等特殊对象使用 typeof 一律返回 object,这正是 typeof 的局限性。

Instanceof定义和用法:instanceof 用于判断一个变量是否属于某个对象的实例。

实例演示:

a instanceof b?alert("true"):alert("false"); //a是b的实例?真:假

var a = new Array(); 
alert(a instanceof Array);  // true
alert(a instanceof Object)  // true


如上,会返回 true,同时 alert(a instanceof Object) 也会返回 true;这是因为 Array 是 object 的子类。

function test(){};
var a = new test();
alert(a instanceof test)   // true


细节:

(1)、如下,得到的结果为‘N’,这里的 instanceof 测试的 object 是指 js 语法中的 object,不是指 dom 模型对象。

if (window instanceof Object){ alert('Y')} else {  alert('N');}  // 'N'


 如何理解闭包?


1、定义和用法:当一个函数的返回值是另外一个函数,而返回的那个函数如果调用了其父函数内部的其它变量,如果返回的这个函数在外部被执行,就产生了闭包。

2、表现形式:使函数外部能够调用函数内部定义的变量。

3、实例如下:

(1)、根据作用域链的规则,底层作用域没有声明的变量,会向上一级找,找到就返回,没找到就一直找,直到window的变量,没有就返回undefined。这里明显count 是函数内部的flag2 的那个count 。

var count=10;   //全局作用域 标记为flag1
function add(){
    var count=0;    //函数全局作用域 标记为flag2
    return function(){
        count+=1;   //函数的内部作用域
        alert(count);
    }
}
var s = add()
s();//输出1
s();//输出2


变量的作用域

要理解闭包,首先必须理解Javascript特殊的变量作用域。

变量的作用域分类:全局变量和局部变量。

特点:

1、函数内部可以读取函数外部的全局变量;在函数外部无法读取函数内的局部变量。

2、函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!

 5、使用闭包的注意点

1)滥用闭包,会造成内存泄漏:由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

2)会改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

 什么是跨域?跨域请求资源的方法有哪些?


什么是跨域?


由于浏览器同源策略,凡是发送请求url的协议、域名、端口三者之间任意一与当前页面地址不同即为跨域。存在跨域的情况:

网络协议不同,如http协议访问https协议。

端口不同,如80端口访问8080端口。

域名不同,如qianduanblog.com访问baidu.com。

子域名不同,如abc.qianduanblog.com访问def.qianduanblog.com。

域名和域名对应ip,如www.a.com访问20.205.28.90.

跨域请求资源的方法:


(1)、porxy代理

定义和用法:proxy代理用于将请求发送给后台服务器,通过服务器来发送请求,然后将请求的结果传递给前端。

实现方法:通过nginx代理;

注意点:1、如果你代理的是https协议的请求,那么你的proxy首先需要信任该证书(尤其是自定义证书)或者忽略证书检查,否则你的请求无法成功。

(2)、CORS 【Cross-Origin Resource Sharing】

定义和用法:是现代浏览器支持跨域资源请求的一种最常用的方式。

使用方法:一般需要后端人员在处理请求数据的时候,添加允许跨域的相关操作。如下:

res.writeHead(200, {
    "Content-Type": "text/html; charset=UTF-8",
    "Access-Control-Allow-Origin":'http://localhost',
    'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
    'Access-Control-Allow-Headers': 'X-Requested-With, Content-Type'
});
(3)、jsonp

定义和用法:通过动态插入一个script标签。浏览器对script的资源引用没有同源限制,同时资源加载到页面后会立即执行(没有阻塞的情况下)。

特点:通过情况下,通过动态创建script来读取他域的动态资源,获取的数据一般为json格式。

实例如下:



缺点:

  1、这种方式无法发送post请求(这里)

  2、另外要确定jsonp的请求是否失败并不容易,大多数框架的实现都是结合超时时间来判定。

谈谈垃圾回收机制方式及内存管理


回收机制方式


1、定义和用法:垃圾回收机制(GC:Garbage Collection),执行环境负责管理代码执行过程中使用的内存。

2、原理:垃圾收集器会定期(周期性)找出那些不在继续使用的变量,然后释放其内存。但是这个过程不是实时的,因为其开销比较大,所以垃圾回收器会按照固定的时间间隔周期性的执行。

3、实例如下:

function fn1() {
    var obj = {name: 'hanzichi', age: 10};
}
function fn2() {
    var obj = {name:'hanzichi', age: 10};
   return obj;
}
var a = fn1();
var b = fn2();


fn1中定义的obj为局部变量,而当调用结束后,出了fn1的环境,那么该块内存会被js引擎中的垃圾回收器自动释放;在fn2被调用的过程中,返回的对象被全局变量b所指向,所以该块内存并不会被释放。

 4、垃圾回收策略:标记清除(较为常用)和引用计数。

标记清除:

  定义和用法:当变量进入环境时,将变量标记"进入环境",当变量离开环境时,标记为:"离开环境"。某一个时刻,垃圾回收器会过滤掉环境中的变量,以及被环境变量引用的变量,剩下的就是被视为准备回收的变量。

  到目前为止,IE、Firefox、Opera、Chrome、Safari的js实现使用的都是标记清除的垃圾回收策略或类似的策略,只不过垃圾收集的时间间隔互不相同。

引用计数:

  定义和用法:引用计数是跟踪记录每个值被引用的次数。

  基本原理:就是变量的引用次数,被引用一次则加1,当这个引用计数为0时,被视为准备回收的对象。

 内存管理
1、什么时候触发垃圾回收?

垃圾回收器周期性运行,如果分配的内存非常多,那么回收工作也会很艰巨,确定垃圾回收时间间隔就变成了一个值得思考的问题。

IE6的垃圾回收是根据内存分配量运行的,当环境中的变量,对象,字符串达到一定数量时触发垃圾回收。垃圾回收器一直处于工作状态,严重影响浏览器性能。

IE7中,垃圾回收器会根据内存分配量与程序占用内存的比例进行动态调整,开始回收工作。

2、合理的GC方案:(1)、遍历所有可访问的对象; (2)、回收已不可访问的对象。

3、GC缺陷:(1)、停止响应其他操作;

4、GC优化策略:(1)、分代回收(Generation GC);(2)、增量GC

开发过程中遇到的内存泄露情况,如何解决的?


1、定义和用法:

内存泄露是指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束。C#和Java等语言采用了自动垃圾回收方法管理内存,几乎不会发生内存泄露。我们知道,浏览器中也是采用自动垃圾回收方法管理内存,但由于浏览器垃圾回收方法有bug,会产生内存泄露。

2、内存泄露的几种情况:

(1)、当页面中元素被移除或替换时,若元素绑定的事件仍没被移除,在IE中不会作出恰当处理,此时要先手工移除事件,不然会存在内存泄露。

实例如下:


   


解决方法如下:


   


(2)、由于是函数内定义函数,并且内部函数--事件回调的引用外暴了,形成了闭包。闭包可以维持函数内局部变量,使其得不到释放。
实例如下:

function bindEvent(){
    var obj=document.createElement("XXX");
    obj.οnclick=function(){
        //Even if it's a empty function
    }
}


解决方法如下:

function bindEvent(){
    var obj=document.createElement("XXX");
    obj.οnclick=function(){
         //Even if it's a empty function
    }
    obj=null;
}


 javascript面向对象中继承实现?

prototype与proto的区别

在对象创建时,就会有一些预定义的属性,其中定义函数的时候,这个预定义属性就是prototype,这个prototype是一个普通的对象。

而定义普通的对象的时候,就会生成一个__proto__,这个__proto__指向的是这个对象的构造函数的prototype。

 

    function Father(name) {
        this.name = name;
    }
    var father = new Father('lc');

当我们声明一个函数Father时就自动创建了prototype对象。而b是构造函数的Father的实例,这是候father是一个对象,而我们知道,对象只有__proto__属性。而这个属性是指向他的构造函数(Father)的prototype属性。这时候我们来打印一下father 

console.log(father) 

2019web前端面试题_第1张图片

打印结果father中只有__proto__属性,而这个属性是指向他的构造函数的prototype对象的 

father.__proto__==Father.prototype

function Father(name) {
        this.name = name;
    }

console.log(Father.prototype) 

    console.log(Father.prototype.__proto__)
    console.log(Object.prototype) 

打印结果: 


面向对象的基本特征有:封闭、继承、多态。

在JavaScript中实现继承的方法:

1. 原型链(prototype chaining)

2. call()/apply()

3. 混合方式(prototype和call()/apply()结合)

4. 对象冒充

继承的方法如下:

1、prototype原型链方式:

 function teacher(name){
    this.name = name;
}
teacher.prototype.sayName = function(){
    console.log("name is "+this.name);
}
var teacher1 = new teacher("xiaoming");
teacher1.sayName();
 
function student(name){
    this.name = name;
}
student.prototype = new teacher()
var student1 = new student("xiaolan");
student1.sayName();
//  name is xiaoming
//  name is xiaolan


2、call()/apply()方法

function teacher(name,age){
this.name = name;
this.age = age;
this.sayhi = function(){
alert('name:'+name+", age:"+age);
}
}
function student(){
var args = arguments;
teacher.call(this,args[0],args[1]);
// teacher.apply(this,arguments);
}
var teacher1 = new teacher('xiaoming',23);
teacher1.sayhi();

var student1 = new student('xiaolan',12);


student1.sayhi();// alert: name:xiaoming, age:23
// alert: name:xiaolan, age:12

3、混合方法【prototype,call/apply】

function teacher(name,age){
this.name = name;
this.age = age;
}
teacher.prototype.sayName = function(){
console.log('name:'+this.name);
}
teacher.prototype.sayAge = function(){
console.log('age:'+this.age);
}

function student(){
var args = arguments;
teacher.call(this,args[0],args[1]);
}
student.prototype = new teacher();

var student1 = new student('xiaolin',23);
student1.sayName();
student1.sayAge();
// name:xiaolin
// age:23


4、对象冒充

function Person(name,age){
this.name = name;
this.age = age;
this.show = function(){
console.log(this.name+", "+this.age);
}
}

function Student(name,age){
this.student = Person; //将Person类的构造函数赋值给this.student
this.student(name,age); //js中实际上是通过对象冒充来实现继承的
delete this.student; //移除对Person的引用
}

var s = new Student("小明",17);
s.show();

var p = new Person("小花",18);
p.show();
// 小明, 17
// 小花, 18


 jquery相关


 jQuery 库中的 $() 是什么?

$() 函数是 jQuery() 函数的别称。$() 函数用于将任何对象包裹成 jQuery 对象,接着你就被允许调用定义在 jQuery 对象上的多个不同方法。你可以将一个选择器字符串传入 $() 函数,它会返回一个包含所有匹配的 DOM 元素数组的 jQuery 对象。

 

如何找到所有 HTML select 标签的选中项?

$('[name=selectname] :selected')


$(this) 和 this 关键字在 jQuery 中有何不同?


$(this) 返回一个 jQuery 对象,你可以对它调用多个 jQuery 方法,比如用 text() 获取文本,用val() 获取值等等。

而 this 代表当前元素,它是 JavaScript 关键词中的一个,表示上下文中的当前 DOM 元素。你不能对它调用 jQuery 方法,直到它被 $() 函数包裹,例如 $(this)。

jquery怎么移除标签onclick属性?


获得a标签的onclick属性: $("a").attr("onclick")

删除onclick属性:$("a").removeAttr("onclick");

设置onclick属性:$("a").attr("onclick","test();");

jquery中addClass,removeClass,toggleClass的使用。


$(selector).addClass(class):为每个匹配的元素添加指定的类名

$(selector).removeClass(class):从所有匹配的元素中删除全部或者指定的类,删除class中某个值;

$(selector).toggleClass(class):如果存在(不存在)就删除(添加)一个类

$(selector).removeAttr(class);删除class这个属性;

JQuery有几种选择器?


(1)、基本选择器:#id,class,element,*;

(2)、层次选择器:parent > child,prev + next ,prev ~ siblings

(3)、基本过滤器选择器::first,:last ,:not ,:even ,:odd ,:eq ,:gt ,:lt

(4)、内容过滤器选择器: :contains ,:empty ,:has ,:parent

(5)、可见性过滤器选择器::hidden ,:visible

(6)、属性过滤器选择器:[attribute] ,[attribute=value] ,[attribute!=value] ,[attribute^=value] ,[attribute$=value] ,[attribute*=value]

(7)、子元素过滤器选择器::nth-child ,:first-child ,:last-child ,:only-child

(8)、表单选择器: :input ,:text ,:password ,:radio ,:checkbox ,:submit 等;

(9)、表单过滤器选择器::enabled ,:disabled ,:checked ,:selected

jQuery中的Delegate()函数有什么作用?


   delegate()会在以下两个情况下使用到:

 1、如果你有一个父元素,需要给其下的子元素添加事件,这时你可以使用delegate()了,代码如下:

$("ul").delegate("li", "click", function(){ $(this).hide(); });


 2、当元素在当前页面中不可用时,可以使用delegate()

$(document).ready()方法和window.onload有什么区别?


 (1)、window.onload方法是在网页中所有的元素(包括元素的所有关联文件)完全加载到浏览器后才执行的。

 (2)、$(document).ready() 方法可以在DOM载入就绪时就对其进行操纵,并调用执行绑定的函数。

如何用jQuery禁用浏览器的前进后退按钮?


实现代码如下:


 jquery中$.get()提交和$.post()提交有区别吗?


相同点:都是异步请求的方式来获取服务端的数据;

异同点:

1、请求方式不同:$.get() 方法使用GET方法来进行异步请求的。$.post() 方法使用POST方法来进行异步请求的。

2、参数传递方式不同:get请求会将参数跟在URL后进行传递,而POST请求则是作为HTTP消息的实体内容发送给Web服务器的,这种传递是对用户不可见的。

3、数据传输大小不同:get方式传输的数据大小不能超过2KB 而POST要大的多

4、安全问题: GET 方式请求的数据会被浏览器缓存起来,因此有安全问题。

写出一个简单的$.ajax()的请求方式?

$.ajax({
    url:'http://www.baidu.com',
    type:'POST',
    data:data,
    cache:true,
    headers:{},
    beforeSend:function(){},
    success:function(){},
    error:function(){},
    complete:function(){}
}); 


jQuery的事件委托方法bind 、live、delegate、on之间有什么区别?


(1)、bind 【jQuery 1.3之前】
定义和用法:主要用于给选择到的元素上绑定特定事件类型的监听函数;

语法:bind(type,[data],function(eventObject));

特点:

  (1)、适用于页面元素静态绑定。只能给调用它的时候已经存在的元素绑定事件,不能给未来新增的元素绑定事件。

  (2)、当页面加载完的时候,你才可以进行bind(),所以可能产生效率问题。

实例如下:$( "#members li a" ).bind( "click", function( e ) {} );

(2)、live 【jQuery 1.3之后】
定义和用法:主要用于给选择到的元素上绑定特定事件类型的监听函数;

语法:live(type, [data], fn);

特点:

  (1)、live方法并没有将监听器绑定到自己(this)身上,而是绑定到了this.context上了。

  (2)、live正是利用了事件委托机制来完成事件的监听处理,把节点的处理委托给了document,新添加的元素不必再绑定一次监听器。

  (3)、使用live()方法但却只能放在直接选择的元素后面,不能在层级比较深,连缀的DOM遍历方法后面使用,即$(“ul”").live...可以,但$("body").find("ul").live...不行; 

实例如下:$( document ).on( "click", "#members li a", function( e ) {} );

(3)、delegate 【jQuery 1.4.2中引入】
定义和用法:将监听事件绑定在就近的父级元素上

语法:delegate(selector,type,[data],fn)

特点:

  (1)、选择就近的父级元素,因为事件可以更快的冒泡上去,能够在第一时间进行处理。

  (2)、更精确的小范围使用事件代理,性能优于.live()。可以用在动态添加的元素上。

实例如下:

$("#info_table").delegate("td","click",function(){/*显示更多信息*/});

$("table").find("#info").delegate("td","click",function(){/*显示更多信息*/});

(4)、on 【1.7版本整合了之前的三种方式的新事件绑定机制】
定义和用法:将监听事件绑定到指定元素上。

语法:on(type,[selector],[data],fn)

实例如下:$("#info_table").on("click","td",function(){/*显示更多信息*/});参数的位置写法与delegate不一样。

说明:on方法是当前JQuery推荐使用的事件绑定方法,附加只运行一次就删除函数的方法是one()。

 总结:.bind(), .live(), .delegate(),.on()分别对应的相反事件为:.unbind(),.die(), .undelegate(),.off()

 

ES6

 es6声明变量的方式?

参考链接

es5中:

var

function

新增如下:

const

let

class

import


HTML & CSS:

dispaly-block与float区别

inline:

a、把元素变成行内元素,也就是它可以和其它的元素共占据一行。

 b、元素的大小由其内容自动撑开,其宽高是不可修改的。

 c、可以使用margin、padding,top,bottom产生边距。

元素不能设置宽高,因为它属于行布局,其特性是在一行里进行布局,所以不能被设定宽高

block:

  a、把元素变成块级元素,让他独占一行,在没有对其设置自身宽度的时候,他会默认填满父元素的宽度。 

  b、可以对元素设置宽高属性。

  c、与inline属性不同,可以对其设置margin,padding,以及top,bottom.left,right产生边距效果。

inline-block:

inline-block=inline+block;

它相当于结合了inline属性和block属性,可以说他是不独占一行的块级元素

2019web前端面试题_第2张图片

float:

指定元素脱离普通的文档流而产生的特别的布局特性。并且float必需应用在块级元素之上,也就是说浮动并不应用于内联标签。或者可以说如果应用了float这个元素将被指定为块级元素,float可以设置宽高

2019web前端面试题_第3张图片

发现二者有明显的区别,使用inline-block 的方式每个li元素之间明显有间隙,间隙为4像素,这个问题是由于换行引起的,这是结束标签后的回车符(空白符)造成的。解除这个缺点的方法,就是对其父元素添加font-size:0,即将字体大小设为0,那么那个空白符也变成0px,从而消除空隙 ,现在这种方法已兼容各种浏览器

我到底使用浮动呢还是display-inline?我觉得这个要根据实际情况来定,像横向布局的,就用display:inline-block;而浮动布局真正适合的类型是文字的环绕布局。

 

写出几种IE6 BUG的解决方法

  • 1、双边距BUG float引起的 使用display
  • 2、3像素问题使用float引用的使用display:inline -3px;
  • 3、超链接hover后点击失效,使用正确的书写顺序 link visited hover active
  • 4、le z-index问题给父级添加position:relative
  • 5、png 透明使用js代码改
  • 6、min-height最小高度 !important解决
  • 7、select 在ie6下遮盖 使用iframe嵌套
  • 8、为什么没有办法定义1px左右的宽度器(IE6默认的行高造成的,使用over:hidden,zoom:0.08,line-height:1px)

IE8以下版本的浏览器中盒模型有什么不同? 

  • IE8以下浏览器的盒模型中定义的元素的宽高不包括内边剧和边距

如何处理HTML5新标签的浏览器兼容问题?

 IE8/IE7/IE6支持通过document,createElement方法产生的标签,可以利用这一特性让这些浏览器支持HTML5新标签,浏览器支持新标签后,还需要添加标签默认的样式

 

 请用css定义p标签,要求实现以下效果;字体颜色在IE6下为黑色(#000000);IE7下为红色(#ff0000);而其他浏览器下为绿色(#00ff00)

p{ color:green; *color:blue; _color:black; }

简述对Web语义化的理解?

  • 就是让浏览器更好的读懂你写的代码,在进行HTML结构、表现、行为设计时,尽量使用语义化的标签,使程序代码简洁明了,易于进行web操作和网站SEO,方便团队的一种标准,以图实现一种“无障碍”的web开发。

为什么要使用css sprites

  • css精灵 把一堆小的图片整合到一张大的图片上,减轻服务器对图片的请求数量
  • css sprites其实就是把网页中一些背景图片整合到一张图片文件中,再利用css的"background-image","background-position"的组合进行背景定位,这样可以减少。
  • 很多图片请求的开销,因为请求耗时比较长;请求虽然可以并发,但是如果请求太多会给服务器增加很大的压力。

解释css sprites,如何使用?

  • css 精灵图,把一堆小的图片整合到一张大的图片(png)上,减轻服务器对图片的请求数量。

描述css reset的作用和用途?

  • Reset重置浏览器的css默认属性,浏览器的品种不同,样式不同,然后重置,让他们统一。

a标签怎么设置宽高?

第一 a{display:block; width:100px; height:60px;}

第二种 加浮动 ,左浮动右浮动均可, 浮动之后,默认转换块显示 a{float:left;:width:100px; height:60px; }

写一下audio标签中,如何实现音乐的暂停和播放? 

  • play()开始,pause()暂停

写出video标签中预加载视频用到的属性是什么

  • preload

行内元素有哪些?块级元素有哪些?css的盒模型? 

  • 块级元素:div ,p,h1,form,ul,li
  • 行内元素:span,a,label,input,img,strong,em;
  • css盒模型:内容,border,margin,padding;

display有哪些值?说明它们的作用?

  • block 块类型。默认宽度为父元素宽度,可设置宽高,换行显示。
  • none 缺省值。像行内元素类型一样显示。
  • inline 行内元素类型。默认宽度为内容宽度,不可设置宽高,同行显示。
  • inline-block 默认宽度为内容宽度,可以设置宽高,同行显示。
  • list-item 像块类型元素一样显示,并添加样式列表标记。
  • table 此元素会作为块级表格来显示。
  • inherit 规定应该从父元素继承display属性的值。

html5哪些操作可以SEO优化

  • title标签;meta标签;header标签;footer标签
  • 元标签(meta标签);导航标签(nav标签);文章标签(article标签);左或右侧标签(aside标签)

 

  css3有哪些新标签,有哪些选择器 ?哪些属性可以继承?

  • 1、颜色:新增RGBA、HSLA模式
  • 2、文字阴影(text-shadow)
  • 3、边框:圆角(border-radius)边框阴影:box-shadow
  • 4、盒子模型:box-sizing
  • 5、背景:background-size设置背景图片的尺寸,background-origin设置背景图片的原点,background-clip设置背景图片的裁剪区域,以“,”分隔可以设置多背景,用于自适应布局
  • 6、渐变:linear-gradient、radial-gradient
  • 7、过渡:transition可实现动画
  • 8、自定义动画
  • 9、在CSS3中唯一引入的伪元素是::selection
  • 10、多媒体查询、多栏布局
  • 11、border-image
  • 12、2D转换:transform:translate(x,y)rotate(x,y)skew(x,y)scale(x,y)
  • 13、3D转换

常用选择器 

可以继承:

类选择器、标签名选择器、后代选择器(派生选择器)、群组选择器

css清除浮动的几种方法?

  • 使用带clear属性的空标签;
  • 使用css的overflow属性;
  • 使用css的:after伪元素;
  • 同时为了兼容 IE6,7 同样需要配合zoom使用

         .clear:after{content:'';display:block;clear:both;height:0;overflow:hidden;visibility:hidden;}
         .clear{zoom:1;}
  • 使用邻接元素处理;
  • 父级设置成inline-block;
  • br清浮动
  • 以浮制浮(父级同时浮动)
  • 给浮动元素父级设置高度
  • 给父元素添加overflow:hidden 清除浮动方法;
  • 问题:需要配合 宽度 或者 zoom 兼容IE6 IE7;

         overflow: hidden;
         *zoom: 1;

清楚浮动有哪些方式?比较好的方式是哪一种?

  • 1、父级div定义height。
  • 2、结尾处加空div标签clear:both。
  • 3、父级div定义伪类:after和zoom。
  • 4、父级div定义overflow:hidden。
  • 5、父级div定义overflow:auto。
  • 6、父级div也浮动,需要定义宽度。
  • 7、父级div定义display:table。
  • 8、结尾处加br标签clear:both。
  • 比较好的是第3种,好多网站都这样用

(2)、

  • 使用带clear属性的空标签;
  • 使用css的overflow属性;
  • 使用css的:after伪元素;
  •  px和em的区别


    相同点:px和em都是长度单位;

    异同点:px的值是固定的,指定是多少就是多少,计算比较容易。em得值不是固定的,并且em会继承父级元素的字体大小。
    浏览器的默认字体高都是16px。所以未经调整的浏览器都符合: 1em=16px。那么12px=0.75em, 10px=0.625em。

    px、em、rem的区别?

  • 1、px像素。绝对单位,像素px是相对于显示器屏幕分辨率而言的,是一个虚拟单位。是计算机系统的数字化图像长度单位,如果px要换算成物理长度,需要指定精度DPI。
  • 2、em是相对长度单位,相对于当前对象内文本的字体尺寸。如当前对行内文本的字体尺寸未被人为设置,则相对浏览器的默认字体尺寸。它会继承父级元素的字体大小,因此并不是一个固定的值。
  • rem是CSS3新增的一个相对单位(root em,根em),使用rem为元素设定字体大小事,仍然是相对大小但相对的只是HTML根元素。
  • 4、区别:IE无法调用那些使用px作为单位的字体大小,而em和rem可以缩放,rem相对的只是HTML根元素。这个单位可谓集相对大小和绝对大小的优点于一身,通过它既可以做到只修改根元素就成比例地调整所有字体大小,又可以避免字体大小逐层复合的连锁反应。目前,除了IE8及更早版本外,所有浏览器已支持rem。
  • CSS实现垂直水平居中


    一道经典的问题,实现方法有很多种,以下是其中一种实现:
    HTML结构:


         


    CSS:

    .wrapper {
        position: relative;
        width: 500px;
        height: 500px;
        border: 1px solid red; 
     }
    .content{
        position: absolute;
        width: 200px;
        height: 200px;
        top: 0;
        bottom: 0;
        left: 0;
        right: 0;
        margin:auto;
        border: 1px solid green;    

    2,transform :translate实现

    .content {
            position: absolute;
            border: 1px solid blue;
            width: 200px;
            height: 200px;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            text-align: center;
        } 

    效果如下:

    2019web前端面试题_第4张图片

     

    CSS字体元素实现垂直水平居中

    html结构:

    class="box box1">

            垂直居中

方法1:table-cell  

 css3:

.box1{

    display: table-cell;

    vertical-align: middle;

    text-align: center;        

}

效果如下:

 2019web前端面试题_第5张图片

方法2:display:flex

.box1{

    display: flex;

    justify-content:center;

    align-items:Center;

}

方法3display:flex和margin:auto 

 .box1{

    display: flex;

    text-align: center;

}

.box1 span{margin: auto;}

方法4:after占位, display:inline-block 

.box1{

  text-align:center;

  font-size:0;

}

.box1 span{

  vertical-align:middle;

  display:inline-block;

  font-size:16px;

}

.box1:after{

  content:'';

  width:0;

  height:100%;

  display:inline-block;

  vertical-align:middle;

}

方法5:display:-webkit-box

.box1{
    display: -webkit-box;
    -webkit-box-pack:center;
    -webkit-box-align:center;
    -webkit-box-orient: vertical;
    text-align: center

 

兼容ie的水平垂直居中

效果:

2019web前端面试题_第6张图片

1,图1 


    

  

2,图2 


    

 

  

3,图3 

 

 

兼容ie 

首先关于IE我们要知道IE8不支持document.getElementsByClassName()

①使用API(IE7及以下不支持)

document.querySelector(".example");//返回第一个匹配的结果

document.querySelectorAll(".example");//返回所有结果

②手动添加document.getElementsByClassName()方法

图1: 

第一个方块使用的是绝对定位方式,由于IE8及以下版本不支持transform属性,所以我们需要借助IE的条件注释以及javascript来计算绝对定位top\left的值: 

 

图2: 

第二个方块采用的是flexbox,由于IE10+才支持,所以我们需要借助IE的条件注释以及javascript来计算绝对定位top\left的值(记得添加定位属性)

 

 

 选择器优先级是怎样的?

  • 1、!important>行内样式>id选择器>类选择器>标签选择器>通配符>继承
  • 2、权重算法:(0,0,0,0)==》第一个0对应的是important的个数,第二个0对应的是id选择器的个数,第三个0对应的类选择器的个数,第四个0对应的是标签选择器的个数,就是当前选择器的权重
  • 3、比较:先从第一个0开始比较,如果第一个0大,那么说明这个选择器的权重高,如果第一个相同,比较第二个,依次类推。

页面导入样式时,使用link和@import有什么区别?

  • 1.link属于HTML标签,除了加载CSS外,还能用于定义RSS,定义rel连接属性等作用;而@import是CSS提供,只能加载CSS;
  • 2.页面被加载的时,link会同时被加载,而@import引用的CSS会等到页面被加载完再加载;
  • import是CSS2.1提出的,只在IE5以上才能被识别,而link是HTML标签,无兼容问题;

(2) :

  • 内联,内嵌,外链,导入
  • 区别:同时加载,
  • 前者无兼容性,后者css2.1以下浏览器不支持
  • link支持使用javascript改变样式,后者不可。

 简述一下你对HTML语义化的理解?

  • 1、用正确的标签做正确的事情。
  • 2、html语义化让页面的内容结构化,结构更清晰,便于对浏览器,搜索引擎解析;
  • 3、即使在没有样式CSS情况下也以一种文档格式显示,并且是容易阅读的;
  • 4、搜索引擎的爬虫也依赖于HTML标记确定上下文和各个关键字的权重,利用SEO;
  • 5、使阅读源代码的人对网站更容易将网站分块,便于阅读维护理解

HTML5为什么只需要写? 

  • 1、用正确的标签做正确的事情。
  • 2、html语义化让页面的内容结构化,结构更清晰,便于对浏览器,搜索引擎解析;
  • 3、即使在没有样式CSS情况下也以一种文档格式显示,并且是容易阅读的;
  • 4、搜索引擎的爬虫也依赖于HTML标记确定上下文和各个关键字的权重,利用SEO;
  • 5、使阅读源代码的人对网站更容易将网站分块,便于阅读维护理解。
  • HTML5不基于SGML,因此不需要对DTD进行引用,但是需要doctype来规范浏览器的行为(让浏览器按照它们应该的方式来进行)
  • 而HTML4.01基于SGML,所以需要对DTD进行引用,才能告知浏览器文档所使用的文档类型。

如何区分HTML和HTML5 ?

HTML5现在已经不是SGML的子集

HTML5有哪些新特性,移除了哪些元素?

主要是关于图像,位置,存储,多任务等功能的增加。 

  • 绘画canvas
  • 用于媒介回放的video和audio元素
  • 本地离线存储localStorage长期存储数据,浏览器关闭后数据不丢失;
  • sessionStorage的数据在浏览器关闭后自动删除
  • 语意化更好的内容元素,比如article,footer,header,nav,section
  • 表单控件:calendar,date,time,email,url,search
  • 新的技术webworker,websocktGeolocation

移除的元素:

  • 纯表现的元素:basefont,big,center,font,s,strike,tt,u;
  • 对可用性产生负面影响的元素:frame,frameset,noframes;

有一个导航栏在Chrome里面样式完好?在IE里文字都聚到一起了,是哪个兼容性问题?

用了display:flex属性,在IE10以下都是无效的 

 

行内元素有哪些?块级元素有哪些? 空(void)元素有那些?

  • 行内元素:a、b、span、img、input、strong、select、label、em、button、textarea
  • 块级元素:div、ul、li、dl、dt、dd、p、h1-h6、blockquote
  • 空元素:即系没有内容的HTML元素,例如:br、meta、hr、link、input、img

 

box-sizing常用的属性有哪些?分别有什么作用? 

  1. localStorage:存储持久数据,浏览器关闭后数据不丢失除非主动删除数据;
  2. sessionStorage:数据在当前浏览器窗口关闭后自动删除
  3. cookie:设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭
  4. box-sizing:content-box|border-box|inherit
  5. content-box:宽度和高度分别应用到元素的内容框。

box-sizing、transition、translate分别是什么? 

  • 1、box-sizing:用来指定模型的大小的计算方式。主要分为border-box(从边框固定盒子大小)、content-box(从内容固定盒子大小)两种计算方式。
  • 2、transition:当前元素只要有"属性"发生变化时,可以平滑的进行过渡。通过transition-propety设置过渡属性;transition-duration设置过渡时间;transition-timing-function设置过渡速度;transition-delay设置过渡延时。
  • 3、translate:通过移动改变元素的位置;有x,y,z三个属性

行内元素有哪些?块级元素有哪些? 空(void)元素有那些?


行内元素:a、b、span、img、input、strong、select、label、em、button、textarea
块级元素:div、ul、li、dl、dt、dd、p、h1-h6、blockquote
空元素:即系没有内容的HTML元素,例如:br、meta、hr、link、input、img 

 

简述一下src与href的区别

 href是Hypertext Reference的缩写,表示超文本引用。用来建立当前元素和文档之间的链接。常用的有:link、a。例如:

 浏览器会识别该文档为css文档,并行下载该文档,并且不会停止对当前文档的处理。这也是建议使用link,而不采用@import加载css的原因。 

src是指向外部资源的位置,指向的内容将会嵌入到文档中当前标签所在位置;在请求src资源时会将其指向的资源下载并应用到文档内,例如js脚本,img图片和frame等元素。

当浏览器解析到该元素时,会暂停其他资源的下载和处理,直到将该资源加载、编译、执行完毕,图片和框架等元素也如此,类似于将所指向资源嵌入当前标签内。这也是为什么将js脚本放在底部而不是头部。

简述同步和异步的区别


同步是阻塞模式,异步是非阻塞模式。
同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去;
异步是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率。

 

 

浏览器的内核分别是什么?


IE: trident内核
Firefox:gecko内核
Safari:webkit内核
Opera:以前是presto内核,Opera现已改用Google Chrome的Blink内核
Chrome:Blink(基于webkit,Google与Opera Software共同开发)

 

介绍以下你对浏览器内核的理解?

  • 1、主要分成两部分:渲染引擎(layout engineer或Rendering Engine)和JS引擎。
  • 2、渲染引擎:负责取得网页的内容(HTML、XML、图像等等)、整理讯息(例如加入CSS等)、以及计算网页的显示方式、然后会输出至显示器或打印机。浏览器的内核的不同对于网页的语法解释会有不同、所以渲染的效果也不相同。所有网页浏览器、电子邮件客户端以及其他需要编辑、显示网络内容的应用程序都需要内核
  • 3、JS引擎则:解析和执行javascript来实现网页的动态效果。
  • 4、最开始渲染引擎和JS引擎并没有区分得很明确,后来JS引擎越来越独立,内核九倾向于只指渲染引擎。


 什么叫优雅降级和渐进增强?


渐进增强 progressive enhancement:
针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。

优雅降级 graceful degradation:
一开始就构建完整的功能,然后再针对低版本浏览器进行兼容。

区别:

a. 优雅降级是从复杂的现状开始,并试图减少用户体验的供给

b. 渐进增强则是从一个非常基础的,能够起作用的版本开始,并不断扩充,以适应未来环境的需要

c. 降级(功能衰减)意味着往回看;而渐进增强则意味着朝前看,同时保证其根基处于安全地带

 

如何实现浏览器内多个标签页之间的通信?

  • 调用localstorage,cookies等本地存储方式
  • WebSocket、SharedWorker
  • localstroge另一个浏览器上下文被添加、删除或修改时,它都会触发一个事件,我们通过监听事件,控制它的值来进行页面信息通信。
  • 注意quirks:Safari在无痕迹模式下设置localstorge值抛出QuotExceededError的异常。

 cookies、sessionStorage和localStorage区别?

  • cookie是网站为了标示用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密)。
  • cookie数据始终在同源的http请求中携带(即使不需要),即会在浏览器和服务器间来回传递。
  • sessionStorage和localStorage不会自动把数据发给服务器,仅在本地保存

存储大小:

  • cookie数据大小不能超过4K。
  • sessionStorage和localStorage虽然也有存储大小的限制,但比cookie大得多,可以达到5M或更大。
     

存储的有效期限不同

  • localStorage:存储持久数据,浏览器关闭后数据不丢失除非主动删除数据;
  • sessionStorage:数据在当前浏览器窗口关闭后自动删除
  • cookie:设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭

作用域不同:

  • cookie和localStorage是在同源同窗口中都是共享的;sessionStorage不在不同的浏览器窗口中共享,即使是同一个页面;

 Web Storage与Cookie相比存在的优势:


(1)、存储空间更大:IE8下每个独立的存储空间为10M,其他浏览器实现略有不同,但都比Cookie要大很多。

(2)、存储内容不会发送到服务器:当设置了Cookie后,Cookie的内容会随着请求一并发送的服务器,这对于本地存储的数据是一种带宽浪费。而Web Storage中的数据则仅仅是存在本地,不会与服务器发生任何交互。

(3)、更多丰富易用的接口:Web Storage提供了一套更为丰富的接口,如setItem,getItem,removeItem,clear等,使得数据操作更为简便。cookie需要自己封装。

(4)、独立的存储空间:每个域(包括子域)有独立的存储空间,各个存储空间是完全独立的,因此不会造成数据混乱。

 

请指出document load和document ready的区别?


共同点:这两种事件都代表的是页面文档加载时触发。

异同点:

ready 事件的触发,表示文档结构已经加载完成(不包含图片等非文字媒体文件)。

onload 事件的触发,表示页面包含图片等文件在内的所有元素都加载完成。

ajax

Ajax的优缺点及工作原理?


定义和用法:
AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。Ajax 是一种用于创建快速动态网页的技术。Ajax 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。

传统的网页(不使用 Ajax)如果需要更新内容,必须重载整个网页页面。

优点:
1.减轻服务器的负担,按需取数据,最大程度的减少冗余请求

2.局部刷新页面,减少用户心理和实际的等待时间,带来更好的用户体验

3.基于xml标准化,并被广泛支持,不需安装插件等,进一步促进页面和数据的分离

缺点:
1.AJAX大量的使用了javascript和ajax引擎,这些取决于浏览器的支持.在编写的时候考虑对浏览器的兼容性.

2.AJAX只是局部刷新,所以页面的后退按钮是没有用的.

3.对流媒体还有移动设备的支持不是太好等

AJAX的工作原理:
1.创建ajax对象(XMLHttpRequest/ActiveXObject(Microsoft.XMLHttp))

2.判断数据传输方式(GET/POST)

3.打开链接 open()

4.发送 send()

5.当ajax对象完成第四步(onreadystatechange)数据接收完成,判断http响应状态(status)200-300之间或者304(缓存)执行回调函数

ajax的readyState的五种状态和status的一些状态码?

readyState:

0 - (未初始化) 还没调用send()方法
(XMLHttpRequest)对象已经创建,但还没有调用open()方法。值为0表示对象已经存在,否则浏览器会报错:对象不存在。 
1 - (载入/正在发送请求) 已调用send()方法,正在发送请求
对XMLHttpRequest对象进行初始化,即调用open()方法,根据参数(method,url,true),完成对象状态的设置。并调用send()方法开始向服务端发送请求。值为1表示正在向服务端发送请求。 
2 - (载入完成/数据接收)send()执行完毕,已接收响应内容 
此阶段接收服务器端的响应数据。但获得的还只是服务端响应的原始数据,并不能直接在客户端使用。值为2表示send()方法执行完成,已经接收完全部响应数据。并为下一阶段对数据解析作好准备。 
3 - (交互/解析数据)正在解析响应内容 
此阶段解析接收到的服务器端响应数据。即根据服务器端响应头部返回的MIME类型把数据转换成能通过responseBody、responseText或responseXML属性存取的格式,为在客户端调用作好准备。值为3表示正在解析数据。 
4 - (后台处理完成)响应内容解析完成,可以在客户端调用了 
此阶段确认全部数据都已经解析为客户端可用的格式,解析已经完成。值为4表示数据解析完毕,可以通过XMLHttpRequest对象的相应属性取得数据。

status 状态码: 
常用: 
200:请求成功(后台处理结果ok)、303:重定向 
400:请求错误、401:未授权、403:禁止访问、404:文件未找到 
500:服务器错误

其他如下:https://www.douban.com/note/218418718/

 正则表达式


 1、写一个function,清除字符串前后的空格?(兼容所有浏览器)

function trim(str) {
    if (str && typeof str === "string") {
        return str.replace(/(^\s*)|(\s*)$/g,""); //去除前后空白符
    }
}


 2、使用正则表达式验证邮箱格式


 var reg = /^(\w)+(\.\w+)*@(\w)+((\.\w{2,3}){1,3})$/;
 var email = "[email protected]";
 console.log(reg.test(email));  // true  


开发及性能优化

2019web前端面试题_第7张图片
1、规避javascript多人开发函数重名问题


命名空间
封闭空间
js模块化mvc(数据层、表现层、控制层)
seajs
变量转换成对象的属性
对象化


2、怎么减少页面加载所需时间?


压缩css、js文件
合并js、css文件,减少http请求
外部调用js、css文件放在页面底部
减少dom操作,尽可能用变量替代不必要的dom操作


3、你所了解到的Web攻击技术


(1)XSS(Cross-Site Scripting,跨站脚本攻击):指通过存在安全漏洞的Web网站注册用户的浏览器内运行非法的HTML标签或者JavaScript进行的一种攻击。
(2)SQL注入攻击
(3)CSRF(Cross-Site Request Forgeries,跨站点请求伪造):指攻击者通过设置好的陷阱,强制对已完成的认证用户进行非预期的个人信息或设定信息等某些状态更新。

 4、web前端开发,如何提高页面性能优化?


内容方面:
1.减少 HTTP 请求 (Make Fewer HTTP Requests)

2.减少 DOM 元素数量 (Reduce the Number of DOM Elements)

3.使得 Ajax 可缓存 (Make Ajax Cacheable)

针对CSS:
1.把 CSS 放到代码页上端 (Put Stylesheets at the Top)

2.从页面中剥离 JavaScript 与 CSS (Make JavaScript and CSS External)

3.精简 JavaScript 与 CSS (Minify JavaScript and CSS)

4.避免 CSS 表达式 (Avoid CSS Expressions)

针对JavaScript :
1. 脚本放到 HTML 代码页底部 (Put Scripts at the Bottom)

2. 从页面中剥离 JavaScript 与 CSS (Make JavaScript and CSS External)

3. 精简 JavaScript 与 CSS (Minify JavaScript and CSS)

4. 移除重复脚本 (Remove Duplicate Scripts)

面向图片(Image):
1.优化图片

2 不要在 HTML 中使用缩放图片

3 使用恰当的图片格式

4 使用 CSS Sprites 技巧对图片优化

5、前端开发中,如何优化图像?图像格式的区别?


优化图像:
1、不用图片,尽量用css3代替。 比如说要实现修饰效果,如半透明、边框、圆角、阴影、渐变等,在当前主流浏览器中都可以用CSS达成。

2、 使用矢量图SVG替代位图。对于绝大多数图案、图标等,矢量图更小,且可缩放而无需生成多套图。现在主流浏览器都支持SVG了,所以可放心使用!

3.、使用恰当的图片格式。我们常见的图片格式有JPEG、GIF、PNG。

基本上,内容图片多为照片之类的,适用于JPEG。

而修饰图片通常更适合用无损压缩的PNG。

GIF基本上除了GIF动画外不要使用。且动画的话,也更建议用video元素和视频格式,或用SVG动画取代。

4、按照HTTP协议设置合理的缓存。

5、使用字体图标webfont、CSS Sprites等。

6、用CSS或JavaScript实现预加载。

7、WebP图片格式能给前端带来的优化。WebP支持无损、有损压缩,动态、静态图片,压缩比率优于GIF、JPEG、JPEG2000、PG等格式,非常适合用于网络等图片传输。

 图像格式的区别:
矢量图:图标字体,如 font-awesome;svg 

位图:gif,jpg(jpeg),png

区别:

  1、gif:是是一种无损,8位图片格式。具有支持动画,索引透明,压缩等特性。适用于做色彩简单(色调少)的图片,如logo,各种小图标icons等。

  2、JPEG格式是一种大小与质量相平衡的压缩图片格式。适用于允许轻微失真的色彩丰富的照片,不适合做色彩简单(色调少)的图片,如logo,各种小图标icons等。

  3、png:PNG可以细分为三种格式:PNG8,PNG24,PNG32。后面的数字代表这种PNG格式最多可以索引和存储的颜色值。

关于透明:PNG8支持索引透明和alpha透明;PNG24不支持透明;而PNG32在24位的PNG基础上增加了8位(256阶)的alpha通道透明;

优缺点:

  1、能在保证最不失真的情况下尽可能压缩图像文件的大小。

  2、对于需要高保真的较复杂的图像,PNG虽然能无损压缩,但图片文件较大,不适合应用在Web页面上。 

6、浏览器是如何渲染页面的?


渲染的流程如下:
1.解析HTML文件,创建DOM树。

   自上而下,遇到任何样式(link、style)与脚本(script)都会阻塞(外部样式不阻塞后续外部脚本的加载)。

2.解析CSS。优先级:浏览器默认设置<用户设置<外部样式<内联样式

3.将CSS与DOM合并,构建渲染树(Render Tree)

4.布局和绘制,重绘(repaint)和重排(reflow)

 

小程序

小程序获取数据的5种类型?

get、post、put、delete、patch

 


 

你可能感兴趣的:(js/es6)