【前端面试】HTML5+CSS3初级面试4

来源:互联网 发布:linux重启oracle命令 编辑:程序博客网 时间:2024/05/29 12:02

1、前端页面由哪三层构成,分别是什么?作用是什么?
     网页分成三个层次,即:结构层、表示层、行为层。 
     网页的结构层structural layer)由 HTML  XHTML 之类的标记语言负责创建。标签,也就是那些出现在尖括号里的单词,对网页内容的语义含义做出了描述,但这些标签不包含任何关于如何显示有关内容的信息。例如,标签表达了这样一种语义:这是一个文本段。” 
     网页的表示层presentation layer  CSS 负责创建。 CSS 如何显示有关内容的问题做出了回答。 
     网页的行为层behavior layer)负责回答内容应该如何对事件做出反应这一问题。这是 Javascript 语言和 DOM 主宰的

2、Doctype作用? 严格模式与混杂模式-如何触发这两种模式,区分它们有何意义?
     (1)、<!DOCTYPE> 声明位于文档中的最前面,处于 <html> 标签之前。告知浏览器的解析器,用什么文档类型规范来解析这个文档。 
     (2)、严格模式的排版和 JS 运作模式是以该浏览器支持的最高标准运行。
     (3)、在混杂模式中,页面以宽松的向后兼容的方式显示。模拟老式浏览器的行为以防止站点无法工作。
     (4)、DOCTYPE不存在或格式不正确会导致文档以混杂模式呈现。


3、为什么要初始化CSS样式

     因为浏览器的兼容问题,不同浏览器对有些标签的默认值是不同的,如果没对CSS初始化往往会出现浏览器之间的页面显示差异。
     当然,初始化样式会对SEO有一定的影响,但鱼和熊掌不可兼得,但力求影响最小的情况下初始化。
     *最简单的初始化方法就是:* {padding: 0; margin: 0;} 。


4、CSS 预处理器

   定义:

         CSS 预处理器定义了一种新的语言,其基本思想是,用一种专门的编程语言,为 CSS 增加了一些编程的特性,将 CSS 作为目标生成文件,然后开发者就只要使用这种语言进行编码工作。

        通俗的说,“CSS 预处理器用一种专门的编程语言,进行 Web 页面样式设计,然后再编译成正常的 CSS 文件,以供项目使用。CSS 预处理器为 CSS 增加一些编程的特性,无需考虑浏览器的兼容性问题”,例如你可以在 CSS 中使用变量、简单的逻辑程序、函数等等在编程语言中的一些基本特性,可以让你的 CSS 更加简洁、适应性更强、可读性更佳,更易于代码的维护等诸多好处。

   其它 CSS 预处理器语言:

       CSS 预处理器技术已经非常的成熟,而且也涌现出了很多种不同的 CSS 预处理器语言,比如说:

  • Sass(SCSS)
  • LESS
  •  Stylus
  • Turbine
  • Swithch CSS
  •  CSS Cacheer
  • DT CSS

5、setInternal和setTimeout区别  两个分别执行的性能差别,哪一个比较好

      1)setTimeout()方法

      这个方法所有浏览器都支持,setTimeout( ) 是属于 window 的 method, 但我们都是略去 window 这顶层物件名称, 这是用来设定一个时间, 时间到了, 就会执行一个指定的 method。

      定义和用法: setTimeout()方法用于在指定的毫秒数后调用函数或计算表达式。  

      语法: setTimeout(code,millisec)

      参数: code (必需):要调用的函数后要执行的 JavaScript 代码串。millisec(必需):在执行代码前需等待的毫秒数。   

      提示: setTimeout() 只执行 code 一次。如果要多次调用,请使用 setInterval() 或者让 code 自身再次调用 setTimeout()。

      2)setInterval()方法

     setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式。setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。由 setInterval() 返回的 ID 值可用作clearInterval() 方法的参数。
     语法: setInterval(code,millisec[,"lang"])

     参数: code 必需。要调用的函数或要执行的代码串。millisec 必须。周期性执行或调用 code 之间的时间间隔,以毫秒计。

     返回值: 一个可以传递给 Window.clearInterval() 从而取消对 code 的周期性执行的值。

     3)区别

     通过上面可以看出,setTimeout和setinterval的最主要区别是:

    1)setTimeout只运行一次,也就是说设定的时间到后就触发运行指定代码,运行完后即结束。如果运行的代码中再次运行同样的setTimeout命令,则可循环运行。(即要循环运行,需函数自身再次调用 setTimeout());而 setinterval是循环运行的,即每到设定时间间隔就触发指定代码。这是真正的定时器。

    2)setinterval使用简单,而setTimeout则比较灵活,可以随时退出循环,而且可以设置为按不固定的时间间隔来运行,比如第一次1秒,第二次2秒,第三次3秒。

6、Get  post区别

     1)get是从服务器上获取数据,post是向服务器传送数据;

     2)get是把参数数据队列加到提交表单的action属性所指的url中,值和表单内各个字段一一对应,在url中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML header内一起传送到action属性所指的url地址。用户看不到这个过程。

    3)get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般默认为不受限制。

    4)get安全性非常低,post安全性较高。

    5)get限制form表单的数据集的值必须为ASCII字符,不是ASCII字符时要转换为ASCII字符,而post支持整个ISO10646字符集。


7、什么是 repaint 和 reflow

      一个页面由两部分组成:

  1. DOM : 描述该页面的结构 
  2. render : 描述 DOM 节点(nodes)在页面上如何呈现

     当 DOM 元素的属性发生变化 (如outline,visibility,background color时, 浏览器会通知 render 重新描绘相应的元素, 此过程称为 repaint。也就是说不涉及任何DOM元素的排版问题的变动为repaint,例如元素的color/text-align/text-decoration等等属性的变动。

     如果该次变化涉及元素布局 (如 width), 浏览器则抛弃原有属性, 重新计算并把结果传递给 render 以重新描绘页面元素, 此过程称为 reflow。也就是说除上面所提到的DOM元素style的修改基本为reflow。例如元素的任何涉及长、宽、行高、边框、display等style的修改。

     这两个过程是很耗费浏览器性能的, 从 IE 系列和 Chrome 渲染页面速度上的差距即可看出渲染引擎计算对应值和呈现并不一定高效, 而每次对元素的操作都会发生 repaints 或 reflow, 因此编写 DOM 交互时如果不注意就会导致页面性能低下。

     但是,Reflow 的成本比 Repaint 的成本高得多的多。DOM Tree 里的每个结点都会有 reflow 方法,一个结点的 reflow 很有可能导致子结点,甚至父点以及同级结点的 reflow。在一些高性能的电脑上也许还没什么,但是如果 reflow 发生在手机上,那么这个过程是非常痛苦和耗电的。

何时会发生repaint 和 reflow

     1)触发repaint

  • color的修改,如color=#ddd
  • text-align的修改,如text-align=center
  • a:hover也会造成重绘。
  • :hover引起的颜色等不导致页面回流的style变动。 等等太多

    2)触发reflow

  • width/height/border/margin/padding的修改,如width=778px
  • 动画,:hover等伪类引起的元素表现改动,display=none等造成页面回流;
  •  appendChildDOM元素操作;
  •  fontstyle的修改;
  • background的修改,注意着字面上可能以为是重绘,但是浏览器确实回流了,经过浏览器厂家的优化,部分background的修改只触发repaint,当然IE不用考虑;
  • scroll页面,这个不可避免;
  • resize页面,桌面版本的进行浏览器大小的缩放,移动端的话,还没玩过能拖动程序,resize程序窗口大小的多窗口操作系统。
  • 读取元素的属性(这个无法理解,但是技术达人是这么说的,那就把它当做定理吧):读取元素的某些属性(offsetLeftoffsetTopoffsetHeightoffsetWidthscrollTop/Left/Width/HeightclientTop/Left/Width/HeightgetComputedStyle()currentStyle(in IE))

     注:display:none 会触发 reflow,而 visibility:hidden 只会触发 repaint,因为没有发现位置变化。

如何优化

    1)不要一条一条地修改 DOM 的样式,尽量通过修改className来修改样式 。
    2)把 DOM 离线后修改。如:

  • 使用 documentFragment对象在内存里操作DOM
  • 先把 DOMdisplay:none (有一次repaint),然后你想怎么改就怎么改。比如修改100次,然后再把他显示出来。
  • clone 一个 DOM 节点到内存里,然后想怎么改就怎么改,改完后,和在线的那个的交换一下。

    3)不要把 DOM 节点的属性值放在一个循环里当成循环里的变量。不然这会导致大量地读写这个结点的属性。
    4)尽可能的修改层级比较低的 DOM节点。当然,改变层级比较底的 DOM节点有可能会造成大面积的 reflow,但是也可能影响范围很小。
    5)为动画的 HTML 元件使用 fixed 或 absoult 的 position,那么修改他们的 CSS 是会大大减小 reflow 。
    6)千万不要使用 table 布局。因为可能很小的一个小改动会造成整个 table 的重新布局。

      table元素一旦触发reflow就会导致table里所有的其它元素 reflow。在适合用table的场合,可以设置table-layout为auto或fixed,这样可以让table一行一行的渲染,这种做法也是为了限制reflow的影响范围。

    7)尽可能少的修改元素style上的属性 。

    8)通过cssText属性来设置样式值。

    9)缓存Layout属性值 。

    10)设置元素的position为absolute或fixed。

    11)避免使用expression,他会每次调用都会重新计算一遍(包括加载页面)。


8、window.onload$(document).ready()的区别

    1执行时间上的区别window.onload必须等到页面内(包括图片的)所有元素加载到浏览器中后才能执行。而$(document).ready(function(){})是DOM结构加载完毕后就会执行。

      2编写个数不同:window.onload不能同时写多个,如果有多个window.onload,则只有最后一个会执行,它会把前面的都覆盖掉。$(document).ready(function(){})则不同,它可以编写多个,并且每一个都会执行。

      3简写方法:window.onload没有简写的方法,$(document).ready(function(){})可以简写为$(function(){})。

      另外:由于在$(document).ready()方法内注册的事件,只要DOM就绪就会被执行,因此可能此时元素的关联文件未下载完,例如与图片有关的HTML下载完毕,并且已经解析为DOM树了,但很有可能图片还未加载完毕,所以例如图片的高度和宽度这样的属性此时不一定有效。

      要解决这个问题,可以使用JQuery中另一个关于页面加载的方法---load()方法。load()方法会在元素的onload事件中绑定一个处理函数。如果处理函数绑定在元素上,则会在元素的内容加载完毕后触发。如:$(window).load(function(){})=====window.onload = function(){}...


9、callapply的说明

     1)call方法: 
            语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 
            定义:调用一个对象的一个方法,以另一个对象替换当前对象。 
           说明: call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。 如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。 
     2)apply方法: 
            语法:apply([thisObj[,argArray]]) 
            定义:应用某一对象的一个方法,用另一个对象替换当前对象。 
         说明: 如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。 如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。

 注:

        1call,apply都属于Function.prototype的一个方法,它是JavaScript引擎内在实现的,因为属于Function.prototype,所以每个Function对象实例(就是每个方法)都有call,apply属性。既然作为方法的属性,那它们的使用就当然是针对方法的了,这两个方法是容易混淆的,因为它们的作用一样,只是使用方式不同。

       2语法:foo.call(this, arg1,arg2,arg3) == foo.apply(this, arguments) == this.foo(arg1, arg2, arg3);

       3相同点:两个方法产生的作用是完全一样的。

       4不同点:方法传递的参数不同。


10、CSS命名规范

      BEM思想(非常赞的规范)

      BEM的意思就是块(block)、元素(element)、修饰符(modifier),是由Yandex团队提出的一种前端命名方法论。这种巧妙的命名方法让你的CSS类对其他开发者来说更加透明而且更有意义。BEM命名约定更加严格,而且包含更多的信息,它们用于一个团队开发一个耗时的大项目。

      命名约定的模式如下:


    1).block 代表了更高级别的抽象或组件。

    2).block__element 代表.block的后代,用于形成一个完整的.block的整体。

    3).block--modifier代表.block的不同状态或不同版本。


前端面试系列文章:

1、【前端面试】HTML5+CSS3初级面试1

2、【前端面试】HTML5+CSS3初级面试2

3、【前端面试】HTML5+CSS3初级面试3

4、【前端面试】HTML5+CSS3初级面试4