当前位置: 首页 / 指导 / 正文
[含答案]好程序员HTML5大前端面试题100道(1)

2019-12-27

mianshi

各位同学好,好程序员今日为大家分享《好程序员100道前端面试题(1)》,这份HTML5大前端面试题包含了很多大厂的面试题目,希望大家好好研究,早日找到心仪的工作!以后,好程序员还会不断新HTML5大前端面试题目,大家可以持续关注!

一、 Doctype的作用? 严格模式和混杂模式的区分,以及如何触发这2种模式?

<!DOCTYPE> 声明位于文档中的前面,处于 <html> 标签之前。告知浏览器的解析器,用什么文档类型 规范来解析这个文档。

DOCTYPE不存在或格式不正确会导致文档以混杂模式呈现。

严格模式就是浏览器根据web标准去解析页面,是一种要求严格的DTD,不允许使用任何表现层的语法,

混杂模式是一种向后兼容的解析方法。

触发标准模式或者说严格模式很简单,就是Html前申明正确的DTD,出发混杂模式可以在html文档开始不声明DTD,或者在DOCTYPE前加入XML声明

二、 请写出至少20HTML5标签

<article>  <aside>  <audio>  <canvas>  <datalist>  <command>  <details> <embed>  <figcaption>  <figure>  <footer>  <header>  <hgroup>  <keygen>  <mark>  <nav>  <section>  <time>  <video>  <summary>  <meter>  <output>  <progress>  <source>

三、 语义化的理解?

1.html语义化就是让页面的内容结构化,便于对浏览器、搜索引擎解析;

2.在没有样式CCS情况下也以种文档格式显示,并且是容易阅读的。

3.搜索引擎的爬虫依赖于标记来确定上下文和各个关键字的权重,利于 SEO

4.使阅读源代码的人对网站容易将网站分块,便于阅读维护理解。

四、 列举5IE  haslayout的属性及其值

haslayout Windows Internet Explorer渲染引擎的个内部组成部分。在Internet Explorer中,个元素要么自己对自身的内容进行计算大小和组织,要么依赖于父元素来计算尺寸和组织内容。为了调节这两个不同的概念,渲染引擎采用 hasLayout 的属性,属性值可以为truefalse。当个元素的 hasLayout 属性值为true时,我们说这个元素有个布局(layout

部分的 IE 显示的错误,都可以通过激发元素的 haslayout 属性来修正。可以通过设置 css 尺寸属性(width/height)等来激发元素的 haslayout,使其拥有布局。如下所示,通过设置以下 css 属性即可。

* display: inlineblock
* height: (任何值除了auto)
* float: (left right)
* position: absolute
* width: (任何值除了auto)
* writingmode: tbrl;(实现文字可以垂直显示,具体意义可百度了解)

* zoom: (normal 外任意值)

Internet Explorer 7 还有些额外的属性(不完全列表):

* minheight: (任意值)
* maxheight: (none 外任意值)
* minwidth: (任意值)
* maxwidth: (none 外任意值)
* overflow: (visible 外任意值)
* overflowx: (visible 外任意值)
* overflowy: (visible 外任意值)
* position: fixed

 

五、 简述jpggifpng-8png-24的区别,及其各自的使用场景

gifjpgpng格式的图片在网站制作中的区别

Gif格式特点:
  1.透明性,Gif是一种布尔透明类型,既它可以是全透明,也可以是全不透明,但是它并没有半透明(alpha透明)。
  2.动画,Gif这种格式支持动画。
  3.无损耗性,Gif是一种无损耗的图像格式,这也意味着你可以对gif图片做任何操作也不会使得图像质量产生损耗。
  4.水平扫描,Gif是使用了一种叫作LZW的算法进行压缩的,当压缩gif的过程中,像素是由上到下水平压缩的,这也意味着同等条件下,横向的gif图片比竖向的gif图片加小。例如500*10的图片比10*500的图片加小
  5.间隔渐进显示,Gif支持可选择性的间隔渐进显示
  由以上特点看出只有256种颜色的gif图片不适合照片,但它适合对颜色要求不高的图形(比如说图标,图表等),它并不是优的选择,我们会在后面中看到png是优的选择。


Jpegjpg格式特点:
  1.透明性,它并不支持透明。
  2.动画,它也不支持动画。
  3.损耗性,除了一些比如说旋转(仅仅是90180270度旋转),裁切,从标准类型到类型,编辑图片的原数据之外,所有其它操作对jpeg图像的处理都会使得它的质量损失。所以我们在编辑过程一般用png作为过渡格式。
  4.隔行渐进显示,它支持隔行渐进显示(但是ie浏览器并不支持这个属性,但是ie会在整个图像信息完全到达的时候显示)。
  由上可以看出Jpeg是适web上面的摄影图片和数字照相机中。
  Png格式特点:
  1.类型,Png这种图片格式包括了许多子类,但是在实践中大致可以分为256色的png和全色的png,你完成可以用256色的png代替gif,用全色的png代替jpeg
  2.透明性,Png是完全支持alpha透明的(透明,半透明,不透明),尽管有两个怪异的现象在ie6(下面详细讨论)
  3.动画,它不支持动画
  PNG图片格式现在包含三种类型:
  1.PNG8256PNG的别名
  2.PNG24全色PNG的别名
  3.PNG32全色PNG的别名
  基本上PNG32就是PNG24,但是附带了全alpha通道。就是说每个像素上不仅存储了24位真色彩信息还存储了8位的alpha通道信息,就如同GIF能存储透明和不透明信息一样。当我们把图片放到不太搭配的背景上的时候,透明PNG图片的边缘会显示得加平滑。
  当然,我也知道你的想法,“但是Photoshop也能生成带透明通道的PNG图片!”我也知道,它只是表面上这么说是PNG24,让我也产生困惑了。
  作为一个伤感的Fireworks倡导者,我只使用PNG32支持附带alpha通道的真色彩图片。不管怎样,如果你习惯使用Photoshop,你就应该知道,Photoshop在“存储为WEB格式”中只提供PNG8PNG24两种PNG格式。
  我敢肯定你经常会勾选“支持透明”选项,以获得带有透明度的PNG图片,但是这样你就获取了一张PNG32图片。——Photoshop只是觉得把PNG32这个名称给隐藏掉了。。。。


png8的误解
  Png8的在ie中的怪异表现:
  半透明的png8ie6以下的浏览器显示为全透明。
  Alpha透明的全色PNGpng32)在ie6中会出现背景颜色(通常是灰色)。
  由上面可以总结:
  (a)全透明的png8可以在任一浏览器正常显示(就像gif一样)。半透明的png8在除了ie6及其以下的浏览器下错误的显示成全透明,其它浏览器都能正常显示半透明。这个bug并不需要特殊对待,因为在不支持半透明的浏览器下只是显示为全透明,对用户体验影响不大,它反而是透明gif的加强版。
  (b)第二个bug没有什么好的方法解决,只能通过影响性能的方法AlphaImageLoader与需要加特殊标签(VML)。
  因此得出结论就是:请使用PNG8
Png8的软件问题:
  Photoshop只能导出布尔透明的PNG8
  Fireworks既能导出布尔透明的PNG8,也能导出alpha透明的PNG8.

六、 能够设置文本加粗的样式属性是什么

字体加粗(font一weight)   

功能:用于设置字体笔划的粗细。   

属性值:正常度 一 normal   

相对度 一 bold, bolder, light, lighter   

渐变度 一 100, 200, 300, 400(相当于normal), 500, 600, 700(相当于 boldlighterbolder、以及数值100900。   

语法为:h1 {font一weight: 属性值}

七、 Htmlxhtml有什么区别?

html是一种基本的web网页设计语言,xhtml是一个基于XML的置标语言。

主要的不同:

XHTML元素必须正确的被嵌套,元素必须关闭,标签必须小写,必须有根元素。

八、 算法题:有一个长度为n1的数组,包含1n中不重复的乱序的数,求寻找范围内不在数组中的数,考虑空间占用,性能优化,溢出等情况,至少写两个算法

 n不太大时,可以考虑求和。先算出1~n的所有数的和,然后减去数组中出现的所有自然数的和。时间复杂度为O(n),空间复杂度O(1)。这种方法的缺点是n不能太大,n比较大时,求和容易溢出。

用位图。从头到尾的扫描整个数组,把出现的数相应的位设置为1.然后再扫描位图,找出不为1的那位,即为要找的数。这种方法的时间复杂度为O(n),空间复杂度为O(n)

异或有个很巧妙的地方:同变量和该变量与另变量的异或值的异或等于这个变量自身。所以我们可以把1~n的所有数异或,再把数组中出现的所有数异或,然后再把这两个异或的结果异或,后得到的值即为我们要找的值。这样时间复杂度为O(n),空间复杂度为O1)。在空间上比第二种方法要好,而且不会出现第种方法中所说的溢出问题。

九、 实现以下方法(与标准一致)

Element.prototype.getElementsByClassName

Element.prototype.getElementsByClassName = function(searchClass, node, tag) {

    if (document.getElementsByClassName) {

        var nodes = (node || document).getElementsByClassName(searchClass),

        result = [];

        for (var i = 0; node = nodes[i++]; ) {

            if (tag !== "*" && node.tagName === tag.toUpperCase()) {

                result.push(node);

            }

        }

        return result;

    } else {

        node = node || document;

        tag = tag || "*";

        var classes = searchClass.split(" "),

        elements = (tag === "*" && node.all) ? node.all : node.getElementsByTagName(tag),

        patterns = [],

        current,

        match;

        var i = classes.length;

        while (一一i >= 0) {

            patterns.push(new RegExp("(^|\\s)" + classes[i] + "(\\s|$)"));

        }

        var j = elements.length;

        while (一一j >= 0) {

            current = elements[j];

            match = false;

            for (var k = 0, kl = patterns.length; k < kl; k++) {

                match = patterns[k].test(current.className);

                if (!match)

                    break;

            }

            if (match)

                result.push(current);

        }

        return result;

    }

}

Function.prototype.bind

Function.prototype.bind = function (oThis) {

    if (typeof this !== "function") {

    throw new TypeError("bind function error");

    }

    var aArgs = Array.prototype.slice.call(arguments,1),

        fToBind = this,

        fBound = function () {

        return fToBind.apply(oThis || window,aArgs.concat(Array.prototype.slice.call(arguments)));

        };

    return fBound;

};

十、 编写一个方法去掉一个数组的重复元素

1.遍历数组法

简单的去重方法, 实现思路:新建新数组,遍历传入数组,值不在新数组就加入该新数组中;注意点:判断值是否在数组的方法“indexOf”ECMAScript5 方法,IE8以下不支持,需多写些兼容低版本浏览器代码,源码如下:

// 简单数组去重法

function unique1(array){

  var n = [ ]; //个新的临时数组

  //遍历当前数组

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

    //如果当前数组的第i已经保存进了临时数组,那么跳过,

    //否则把当前项push到临时数组里面

    if (n.indexOf(array[i]) == 1) n.push(array[i]);

  }

  return n;

}

// 判断浏览器是否支持indexOf indexOf ecmaScript5新方法 IE8以下(包括IE8IE8只支持部分ecma5)不支持

if (!Array.prototype.indexOf){

  // 新增indexOf方法

  Array.prototype.indexOf = function(item){

    var result = 1, a_item = null;

    if (this.length == 0){

      return result;

    }

    for(var i = 0, len = this.length; i < len; i++){

      a_item = this[i];

      if (a_item === item){

        result = i;

        break;

      }  

    }

    return result;

  }

}

2.对象键值对法

该方法执行的速度比其他任何方法都快, 就是占用的内存大些;实现思路:新建一js对象以及新数组,遍历传入数组时,判断值是否为js对象的键,不是的话给对象新增该键并放入新数组。注意点: 判断是否为js对象键时,会自动对传入的键执行“toString()”,不同的键可能会被误认为样;例如: a[1]a["1"] 。解决上述问题还是得调用“indexOf”

// 速度快, 占空间多(空间换时间)

function unique2(array){

  var n = {}, r = [], len = array.length, val, type;

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

        val = array[i];

        type = typeof val;

        if (!n[val]) {

            n[val] = [type];

            r.push(val);

        } else if (n[val].indexOf(type) < 0) {

            n[val].push(type);

            r.push(val);

        }

    }

    return r;

}

3.数组下标判断法

还是得调用“indexOf”性能跟方法1差不多,实现思路:如果当前数组的第i项在当前数组中第次出现的位置不是i,那么表示第i项是重复的,忽略掉。否则存入结果数组。

function unique3(array){

  var n = [array[0]]; //结果数组

  //从第二项开始遍历

  for(var i = 1; i < array.length; i++) {

    //如果当前数组的第i项在当前数组中第次出现的位置不是i

    //那么表示第i项是重复的,忽略掉。否则存入结果数组

    if (array.indexOf(array[i]) == i) n.push(array[i]);

  }

  return n;

}

4.排序后相邻去除法

虽然原生数组的”sort”方法排序结果不怎么靠谱,但在不注重顺序的去重里该缺点毫无影响。实现思路:给传入数组排序,排序后相同值相邻,然后遍历时新数组只加入不与前值重复的值。

// 将相同的值相邻,然后遍历去除重复值

function unique4(array){

  array.sort();

  var re=[array[0]];

  for(var i = 1; i < array.length; i++){

    if( array[i] !== re[re.length1])

    {

      re.push(array[i]);

    }

  }

  return re;

}

5.优化遍历数组法

实现思路:获取没重复的右值放入新数组。(检测到有重复值时终止当前循环同时进入顶层循环的下轮判断)

// 思路:获取没重复的右值放入新数组

function unique5(array){

  var r = [];

  for(var i = 0, l = array.length; i < l; i++) {

    for(var j = i + 1; j < l; j++)

      if (array[i] === array[j]) j = ++i;

    r.push(array[i]);

  }

  return r;

}

十一、 请使用javascript写出数组快速排序代码

<script>

function quiktSort(arr){

var  left =[],right=[];

if(arr.length<1){

return  arr;

}

var  index = Math.floor(arr.length/2);

var  point = arr.splice(index,1);

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

if(arr[i]<point){

left.push(arr[i]);

}else{

right.push(arr[i]);

}

}

return quickSort(left).concat(point,quickSort(right));

}

</script>

十二、 编写一个布局,页面宽度自适应,小宽度300px,左边定宽35%,右边定宽65%

<div class="container">

<div class="left"></div>

<div class="right"></div>

</div>

<style>

.container{

height: 600px;

_width: 300px;

minwidth: 300px;

}

.left{

width: 35%;

height: 100%;

background: #ff0;

float: left;

}

.right{

overflow:hidden;

width: 65%;

height: 100%;

background: #0f0;

}

</style>

十三、 谈谈对html5的了解

1.良好的移动性,以移动设备为主。

2.响应式设计,以适应自动变化的屏幕尺寸

3.支持离线缓存技术,webStorage本地缓存

4.新增canvasvideoaudio等新标签元素。新增特殊内容元素:articlefooterheadernavsection等,新增表单控件:calendardatetimeemailurlsearch

5.地理定位...

6.新增webSocket/webWork技术

十四、 Js面向对象的几种方式

1.对象的字面量 var obj = {}

2.创建实例对象 var obj = new Object();

3.构造函数模式 function fn(){} , new fn();

4.工厂模式:用一个函数,通过传递参数返回对象。function fn(params){var obj =new Object();obj.params = params; return obj;},fn(params);

5.原型模式:function clock(hour){} fn.prototype.hour = 0; new clock();

首先,每个函数都有prototype(原型)属性,这个指针指向的就是clock.prototype对象。而这个原型对象在默认的时候有个属性constructor,指向clock,这个属性可读可写。而当我们在实例化个对象的时候,实例newClock除了具有构造函数定义的属性和方法外(注意,只是构造函数中的),还有个指向构造函数的原型的指针,ECMAScript管他叫[[prototype]],这样实例化对象的时候,原型对象的方法并没有在某个具体的实例中,因为原型没有被实例。

十五、 css中哪个属性会影响dom读取文档流的顺序

1.direction, writingmode

十六、 前端页面由哪三层构成,分别是什么,作用是什么

Html (结构) : 超文本标记语言,  HTML xhtml之类的标记语言负责创建。标签,也就是那些出现在尖括号里的单词,对网页内容的语义含义做出了描述,但这些标签不包含任何关于如何显示有关内容的信息。例如,P标签表达了这样一种语义:“这是一个文本段。”

Css (表现) : 层叠样式表 , css负责创建。css对“如何显示有关内容”的问题做出了回答。

Js (行为) : 客户端脚本语言 , 内容应该如何对事件做出反应

十七、 Css的基本语句构成是?

语法:
(自定义的样式名称){
    样式内容(属性:属性值;)

十八、 如何对网站的文件和资源进行优化

1.文件合并(目的是减少http请求)

2.文件压缩 (目的是直接减少文件下载的体积

3.使用cdn托管资源

4.使用缓存

5gizp压缩需要的jscss文件

6meta标签优化(title,description,keywords,heading标签的优化,alt优化

7.反向链接,网站外链接优化

十九、 Javascipt的本地对象,内置对象和宿主对象

本地对象:ObjectFunctionArrayStringBooleanNumberDateRegExpErrorEvalErrorRangeErrorReferenceErrorSyntaxErrorTypeErrorURIError简单来说,本地对象就是 ECMA一262 定义的类.

内置对象:ECMA一262 把内置对象(built一in object)定义为ECMAScript 实现提供的、独立于宿主环境的所有对象,在 ECMAScript 程序开始执行时出现。这意味着开发者不必明确实例化内置对象,它已被实例化了。

同样是独立于宿主环境。根据定义我们似乎很难分清内置对象本地对象的区别。而ECMA一262 只定义了两个内置对象,即 Global Math (它们也是本地对象,根据定义,每个内置对象都是本地对象)。

如此就可以理解了。内置对象是本地对象的种。而其包含的两种对象中,Math对象我们经常用到,可这个Global对象是啥东西呢?

Global对象是ECMAScript中特别的对象,因为实际上它根本不存在,有点玩人的意思。大家要清楚,在ECMAScript中,不存在独立的函数,所有函数都必须是某个对象的方法。

类似于isNaN()parseInt()parseFloat()方法等,看起来都是函数,而实际上,它们都是Global对象的方法。而且Global对象的方法还不止这些.

宿主对象: ECMAScript中的宿主就是我们网页的运行环境,即操作系统浏览器。所有非本地对象都是宿主对象(host object),即由 ECMAScript 实现的宿主环境提供的对象。所有的BOMDOM对象都是宿主对象。因为其对于不同的宿主环境所展示的内容不同。其实说白了就是,ECMAScript官方未定义的对象都属于宿主对象,因为其未定义的对象大多数是自己通过ECMAScript程序创建的对象。自定义的对象也是宿主对象。

二十、 输入url后的加载过程

1) 查找域名对应IP地址

2) 建立连接(TCP的三次握手)

3) 构建网页

4) 断开连接(TCP的四次挥手)

上面就是今天好程序员为大家整理的20道经典HTML5大前端面试题,喜欢的可以收藏,希望对你有所帮助。

好程序员公众号

  • · 剖析行业发展趋势
  • · 汇聚企业项目源码

好程序员开班动态

More+
  • HTML5大前端 <高端班>

    开班时间:2021-04-12(深圳)

    开班盛况

    开班时间:2021-05-17(北京)

    开班盛况
  • 大数据+人工智能 <高端班>

    开班时间:2021-03-22(杭州)

    开班盛况

    开班时间:2021-04-26(北京)

    开班盛况
  • JavaEE分布式开发 <高端班>

    开班时间:2021-05-10(北京)

    开班盛况

    开班时间:2021-02-22(北京)

    开班盛况
  • Python人工智能+数据分析 <高端班>

    开班时间:2021-07-12(北京)

    预约报名

    开班时间:2020-09-21(上海)

    开班盛况
  • 云计算开发 <高端班>

    开班时间:2021-07-12(北京)

    预约报名

    开班时间:2019-07-22(北京)

    开班盛况
IT培训IT培训
在线咨询
IT培训IT培训
试听
IT培训IT培训
入学教程
IT培训IT培训
立即报名
IT培训

Copyright 2011-2023 北京千锋互联科技有限公司 .All Right 京ICP备12003911号-5 京公网安备 11010802035720号