日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > HTML >内容正文

HTML

【转】前端面试

發布時間:2025/5/22 HTML 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】前端面试 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、HTML

1. 針對移動瀏覽器端開發頁面,不期望用戶放大屏幕,且要求“視口(viewport)”寬度等于屏幕寬度,視口高度等于設備高度,如何設置?

移動web前端viewport詳解
<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1, maximum-scale=1, user-scalable=no">

meta使用詳細總結

2.data-xxx 屬性的作用是什么?

HTML5 data-* 屬性:

定義和用法
data- 屬性用于存儲頁面或應用程序的私有自定義數據。
data- 屬性賦予我們在所有 HTML 元素上嵌入自定義 data 屬性的能力。
存儲的(自定義)數據能夠被頁面的 JavaScript 中利用,以創建更好的用戶體驗(不進行 Ajax 調用或服務器端數據庫查詢)。
data-* 屬性包括兩部分:
屬性名不應該包含任何大寫字母,并且在前綴 "data-" 之后必須有至少一個字符
屬性值可以是任意字符串

注釋:用戶代理會完全忽略前綴為 "data-" 的自定義屬性。
這里的data-前綴就被稱為data屬性,其可以通過腳本進行定義,也可以應用CSS屬性選擇器進行樣式設置。數量不受限制,在控制和渲染數據的時候提供了非常強大的控制。

html:

<div class="mm" data-name="張含韻"></div> <div class="mm" data-name="undefined"></div>

css:

.mm{width:256px; height:200px;} .mm[data-name='張含韻']{background:url(http://image.zhangxinxu.com/image/study/s/s256/mm1.jpg) no-repeat;} .mm[data-name='undefined']{background:url(http://image.zhangxinxu.com/image/study/s/s256/mm3.jpg) no-repeat;}

js:

expense = document.getElementById('day2-meal-expense').dataset;

3.請描述一下cookies,sessionStorage和localStorage的區別?

之前總結過:http://www.jianshu.com/p/da227e50df43
HTTP cookies 詳解
微軟的 IE6 SP1 在 cookie 中引入了一個新的選項:HTTP-only,HTTP-Only背后的意思是告之瀏覽器該 cookie 絕不能通過 JavaScript 的 document.cookie屬性訪問。設計該特征意在提供一個安全措施來幫助阻止通過 JavaScript 發起的跨站腳本攻擊 (XSS) 竊取 cookie 的行為

4.什么是瀏覽器的標準模式(standards mode)和怪異模式(quirks mode)

目前瀏覽器的排版引擎有三種模式:怪異模式(Quirks mode)、接近標準模式(Almost standards mode)、以及標準模式(Standards mode)。在怪異模式下,排版會模擬 Navigator 4 與 Internet Explorer 5 的非標準行為。為了支持在網絡標準被廣泛采用前,就已經建好的網站,這么做是必要的。在標準模式下,行為即(但愿如此)由 HTML 與 CSS 的規范描述的行為。在接近標準模式下,只有少數的怪異行為被實現。

那么所謂標準模式,就一定都“標準”嗎?答案當然是否定的,因為各個瀏覽器廠商實現標準的階段不同,所以各個瀏覽器的“標準模式”之間也會有很大的不同。
Firefox、Safari、Chrome、Opera (自 7.5 以后)、 IE8 和 IE9 都有一個準標準模式。那么既然標準模式都不那么標準,準標準的模式肯定就更不標準了。

  • 瀏覽器如何決定用哪個模式?
    對HTML文件來說,瀏覽器使用文件開頭的 DOCTYPE 來決定用怪異模式處理或標準模式處理。為了確保你的頁面使用標準模式,請確認你的頁面如同本范例一樣擁有 DOCTYPE:

    <!DOCTYPE html> <html> <head><meta charset=UTF-8> <title>Hello World!</title> </head> <body> </body> </html>

    范例中的DOCTYPE,<!DOCTYPE html>,是所有可用的DOCTYPE之中最簡單的,而且是HTML5 所推薦的。HTML的早期變種也屬于推薦標準,不過今日的瀏覽器都會對這個 DOCTYPE 使用標準模式,就算是已過時的 Internet Explorer 6 也一樣。目前并沒有正當的理由,去使用其他更復雜的 DOCTYPE。如果你使用其他的 DOCTYPE,你可能會冒著觸發接近標準模式或者怪異模式的風險。

  • 使用
    請確定你把 DOCTYPE 正確地放在 HTML 文件的頂端。任何放在 DOCTYPE 前面的東西,比如批注或 XML 聲明,會令 Internet Explorer 9 或更早期的瀏覽器觸發怪異模式。

    在 HTML5中,DOCTYPE 唯一的作用是啟用標準模式。更早期的 HTML 標準會附加其他意義,但沒有任何瀏覽器會將 DOCTYPE 用于怪異模式和標準模式之間互換以外的用途。

  • 瀏覽器的標準模式與怪異模式的設置與區分方法

由于歷史的原因,各個瀏覽器在對頁面的渲染上存在差異,甚至同一瀏覽器在不同版本中,對頁面的渲染也不同。在W3C標準出臺以前,瀏覽器在對頁面的渲染上沒有統一規范,產生了差異(Quirks mode或者稱為Compatibility Mode);由于W3C標準的推出,瀏覽器渲染頁面有了統一的標準(CSScompat或稱為Strict mode也有叫做Standars mode),這就是二者最簡單的區別。W3C標準推出以后,瀏覽器都開始采納新標準,但存在一個問題就是如何保證舊的網頁還能繼續瀏覽,在標準出來以前,很多頁面都是根據舊的渲染方法編寫的,如果用的標準來渲染,將導致頁面顯示異常。為保持瀏覽器渲染的兼容性,使以前的頁面能夠正常瀏覽,瀏覽器都保留了舊的渲染方法(如:微軟的IE)。這樣瀏覽器渲染上就產生了Quircks mode和Standars mode,兩種渲染方法共存在一個瀏覽器上。
火狐一直工作在標準模式下,但IE(6,7,8)標準模式與怪異模式差別很大,主要體現在對盒子模型的解釋上,這個很重要,下面就重點說這個。那么瀏覽器究竟該采用哪種模式渲染呢?這就引出的DTD,既是網頁的頭部聲明,瀏覽器會通過識別DTD而采用相對應的渲染模式:

  • 瀏覽器要使老舊的網頁正常工作,但這部分網頁是沒有doctype聲明的,所以瀏覽器對沒有doctype聲明的網頁采用quirks mode解析。
  • 對于擁有doctype聲明的網頁,什么瀏覽器采用何種模式解析,這里有一張詳細列表可參考:http://hsivonen.iki.fi/doctype。
  • 對于擁有doctype聲明的網頁,這里有幾條簡單的規則可用于判斷:對于那些瀏覽器不能識別的doctype聲明,瀏覽器采用strict mode解析。
  • 在doctype聲明中,沒有使用DTD聲明或者使用HTML4以下(不包括HTML4)的DTD聲明時,基本所有的瀏覽器都是使用quirks mode呈現,其他的則使用strict mode解析。
  • 可以這么說,在現有有doctype聲明的網頁,絕大多數是采用strict mode進行解析的。
  • 在ie6中,如果在doctype聲明前有一個xml聲明(比如:<?xml version=”1.0″ encoding=”iso-8859-1″?>),則采用quirks mode解析。這條規則在ie7中已經移除了。
    如何判定現在是標準模式還是怪異模式:
    方法一:執行以下代碼 alert(window.top.document.compatMode) ; //BackCompat 表示怪異模式 //CSS1Compat 表示標準模式 方法二:jquery為我們提供的方法,如下: alert($.boxModel) alert($.support.boxModel)
  • CSS

    1. 解釋一下盒模型寬高值的計算方式,邊界塌陷,負值作用,box-sizing概念。

    1.1 盒模型

    a. ie678怪異模式(不添加 doctype)使用 ie 盒模型,寬度=邊框+padding+內容寬度
    b. chrome, ie9+, ie678(添加 doctype) 使用標準盒模型,寬度= 內容寬度

    1.2 box-sizing

    content-box(默認)
    布局所占寬度Width:
    Width = width + padding-left + padding-right + border-left + border-right
    布局所占高度Height:
    Height = height + padding-top + padding-bottom + border-top + border-bottom
    border-box
    布局所占寬度Width:
    Width = width(包含padding-left + padding-right + border-left + border-right)
    布局所占高度Height:
    Height = height(包含padding-top + padding-bottom + border-top + border-bottom)

    1.3 邊界塌陷
    之前總結的

    1.4 負值作用

    display:inline-block是什么呢?相信大家對這個屬性并不陌生,根據名字inline-block我們就可以大概猜出它是結合了inline和block兩者的特性于一身,簡單的說:設置了inline-block屬性的元素既擁有了block元素可以設置width和height的特性,又保持了inline元素不換行的特性。

    在margin屬性中一共有兩類參考線,top和left的參考線屬于一類,right和bottom的參考線屬于另一類。top和left是以外元素為參考,right和bottom是以元素本身為參考。
    厲害了我的margin_由淺入深漫談margin屬性

    margin:-10px 20px -30px 40px;

    這時候 margin 的解析邏輯是怎樣的呢?首先我們要搞清 div 的和周邊元素的關系,div 沒有相連元素,而此時 div 的 containing block 是 body 產生的 block box。則根據上面介紹的參考線原理,div 的左外邊距以 containing block 的 content 左邊為參考線,及此時以 body 的 content 左邊為參考線進行水平向右位移,位移的大小為 40px,同理,上邊距以 body 的 content 上邊為參考線進行垂直向上位移 10px(負值和正值的方向相反),下邊距依照現在 div 的 borer 下邊(此時的 div 已經經過上邊距位移過了)垂直向上位移 30px(此時,margin 不會改變 box 的 border 內的物理大小,但會改變 box 的邏輯大小,即:以此 box 的 margin 的下邊為參考的元素,不是從 box 的物理位置開始的,而是從邏輯位置開始),右邊距依照現在 div 的 borer 右邊(此時的 div 已經經過左邊距位移過了)水平向右位移 20px。或許有朋友問你分析的順序怎么和 margin 表達式中出現的順序不一樣?如果按照 margin 表達式中出現的順序來分析,結果是一樣的,只是為了更好的方便大家的理解而沒有按照表達式的順序來分析。

    margin為負值產生的影響和常見布局應用

    應用

    • 左右固定,中間自適應(雙飛翼)那些年,奇妙的圣杯與雙飛翼,還有負邊距
    <div class="main"> <div class="main-content">main content</div> </div> <div class="left">left</div> <div class="right">right</div> *{ margin:0; padding: 0 } .main{ float: left; width: 100%; } .main .main-content{ margin: 0 210px; background-color: rgba(33, 114, 214, 0.8);height: 500px} .left{width: 200px;float: left; background-color:rgba(255, 82, 0, 0.8); margin-left: -100%; height: 200px} .right{ width: 200px;height: 200px; margin-left: -200px;float: left;background-color: rgba(90, 243, 151, 0.8);}
    • 負邊距+定位:水平垂直居中
      還有其他。。

    [margin,padding]任一方向的百分數都是相對于包含塊的寬度(width)的。
    一般left和right(用于absolute/fixed)在一個樣式是只能使用其一,不能left和right都設置,要么使用left就不使用right,要么使用right就不使用left,如果left和right均使用將會出現兼容問題,一個對象設置了靠左left多少距離,自然右邊距離自然就有了所以無需設置左邊。
    相同道理,top和bottom對一個對象只能使用其一,不然會出現邏輯兼容問題。譬如一個人讓你往左走,一個人讓你往右走,同時發出往左往右走這個時候你也不好判斷往那邊走。

    2. BFC(Block Formatting Context)是什么?有哪些應用?

    CSS之BFC詳解
    [CSS]深入理解BFC原理及應用

    Block Formatting Context,中文直譯為塊級格式上下文。BFC就是一種布局方式,在這種布局方式下,盒子們自所在的containing block頂部一個接一個垂直排列,水平方向上撐滿整個寬度(除非內部盒子自己建立了新的BFC)。兩個相鄰的BFC之間的距離由margin決定。在同一個BFC內部,兩個垂直方向相鄰的塊級元素的margin會發生“塌陷”。

    文檔這里也間接指出了垂直相鄰盒子margin合并的解決辦法:就是給這兩個盒子也創建BFC。

    通俗一點,可以把BFC理解為一個封閉的大箱子,箱子內部的元素無論如何翻江倒海,都不會影響到外部。

    • 如何創建BFC
      總結一下就是:

      float屬性不為none
      overflow不為visible(可以是hidden、scroll、auto)
      position為absolute或fixed
      display為inline-block、table-cell、table-caption

    • BFC的作用
      1. 清除內部浮動我們在布局時經常會遇到這個問題:對子元素設置浮動后,父元素會發生高度塌陷,也就是父元素的高度變為0。解決這個問題,只需要把把父元素變成一個BFC就行了。常用的辦法是給父元素設置overflow:hidden。
      2. 垂直margin合并在CSS當中,相鄰的兩個盒子的外邊距可以結合成一個單獨的外邊距。這種合并外邊距的方式被稱為折疊,并且因而所結合成的外邊距稱為折疊外邊距。折疊的結果:
      兩個相鄰的外邊距都是正數時,折疊結果是它們兩者之間較大的值。
      兩個相鄰的外邊距都是負數時,折疊結果是兩者絕對值的較大值。
      兩個外邊距一正一負時,折疊結果是兩者的相加的和。這個同樣可以利用BFC解決。關于原理在前文已經講過了。
      3. 創建自適應兩欄布局在很多網站中,我們常看到這樣的一種結構,左圖片+右文字的兩欄結構。
      顯然,這是文字受到了圖片浮動的影響。當然,如果你想做文本繞排的效果,浮動是不二之選。不過在這里,這顯然不是我們想要的。此時我們可以為P元素的內容建立一個BFC,讓其內容消除對外界浮動元素的影響。給文字加上overflow:hidden

    3.如何要求容器在寬度自由很縮的情況下,A/B/C的寬度始終是1:1:1,如何實現,寫出兩種方法。


    flex布局:

    .div1 {width: 100%;height: 400px;border: 1px solid #888;flex-direction: row;/**主要代碼*/display: flex;/* align-items: center; *//* justify-content: center; */ }.div {/* position:absolute; *//* width:500px; */flex-grow: 1;border: 1px solid #888; }

    百分數布局:inline-block元素間間隙產生及去除詳解:

    <div class="div1"><div class="div2 div">div2</div><div class="div3 div">div3</div><div class="div4 div">div4</div> </div>.div1 {width: 100%;height: 400px;background-color: red; } .div2{margin-left: 5%; } .div {width:30%;display:inline-block;background-color:#888; }

    4.

    如圖,A若寬高已知,如何實現水平、垂直均相對于父元素居中?若A高度未知呢?



    之前總結的

    JavaScript

    1. 函數中的arguments是什么?是數組嗎?若不是,如何將它轉化為真正的數組?

    arguments不是真正的數組。沒有數組的方法

    function a(){console.log(arguments);var args = Array.prototype.slice.call(arguments);console.log(args);/* arguments.forEach(function(){ }) */ } a(1,2,3)

    2. 列舉JavaScript中typeof操作符的可能結果,如何區分:{}和[]類型?

    3. Function中的call、apply、bind的區別是什么?請針對每一個寫出一個代碼示例。

    4. 使用jQuery,找到id位selector的select標簽中有用data-target屬性為isme的option的值?

    var se = $("#selector option[data-target=isme]"); console.log(se.val());

    5. 優化代碼

    for(var i = 0; i < document.getElementsByTagName('a').length; i++) {document.getElementsByTagName('a')[i].onmouseover = function(){this.style.color = 'red';};document.getElementsByTagName('a')[i].onmouseout = function(){this.style.color = '';};

    5.1 CSS

    回流與重繪:CSS性能讓JavaScript變慢?
    翻譯計劃-重繪重排重渲染
    通過類修改樣式
    有時候我們需要通過JavaScript給元素增加樣式,比如如下代碼:

    element.style.fontWeight = 'bold'; element.style.backgroundImage = 'url(back.gif)'; element.style.backgroundColor = 'white';element.style.color = 'white';//...

    這樣效率很低,每次修改style屬性后都會觸發元素的重繪,如果修改了的屬性涉及大小和位置,將會導致回流。所以我們應當盡量避免多次為一個元素設置style屬性,應當通過給其添加新的CSS類,來修改其CSS

    當一個元素的外觀的可見性visibility發生改變的時候,重繪(repaint)也隨之發生,但是不影響布局。類似的例子包括:outline, visibility, or background color。根據Opera瀏覽器,重繪的代價是高昂的,因為瀏覽器必須驗證DOM樹上其他節點元素的可見性。而回流更是性能的關鍵因為其變化涉及到部分頁面(或是整個頁面)的布局。一個元素的回流導致了其所有子元素以及DOM中緊隨其后的祖先元素的隨后的回流。


    render.png

    如何避免回流或將它們對性能的影響降到最低?

    • 如果想設定元素的樣式,通過改變元素的 class 名 (盡可能在 DOM 樹的最末端)(Change classes on the element you wish to style (as low in the dom tree as possible))
    • 避免設置多項內聯樣式(Avoid setting multiple inline styles)
    • 應用元素的動畫,使用 position 屬性的 fixed 值或 absolute 值(Apply animations to elements that are position fixed or absolute)
    • 權衡平滑和速度(Trade smoothness for speed)
    • 避免使用table布局(Avoid tables for layout)
    • 避免使用CSS的JavaScript表達式 (僅 IE 瀏覽器)(Avoid JavaScript expressions in the CSS (IE only))

    結合著看

    • “離線”的批量改變和表現DOM。“離線”意味著不在當前的DOM樹中做修改。你可以:通過documentFragment來保留臨時變動。
    • 復制你即將更新的節點,在副本上工作,然后將之前的節點和新節點交換。
    • 通過display:none屬性隱藏元素(只有一次重排重繪),添加足夠多的變更后,通過display屬性顯示(另一次重排重繪)。通過這種方式即使大量變更也只觸發兩次重排。
    • 不要頻繁計算樣式。如果你有一個樣式需要計算,只取一次,將它緩存在一個變量中并且在這個變量上工作。
    • 通常情況下,考慮一下渲染樹和變更后需要重新驗證的消耗。舉個例子,使用絕對定位會使得該元素單獨成為渲染樹中body的一個子元素,所以當你對其添加動畫時,它不會對其它節點造成太多影響。當你在這些節點上放置這個元素時,一些其它在這個區域內的節點可能需要重繪,但是不需要重排。

    5.2 事件綁定

    當使用 addEventListener()為一個元素注冊事件的時候,句柄里的 this 值是該元素的引用。其與傳遞給句柄的 event 參數的 currentTarget 屬性的值一樣

    document.addEventListener("mouseover", function(e){var target = e.target;if(target.nodeName.toLowerCase() === 'a'){target.style.color = 'red';} }, false) document.addEventListener("mouseout", function(e){var target = e.target;if(target.nodeName.toLowerCase() === 'a'){target.style.color = '';} }, false)

    6. 請設計一個算法。將兩個有序數組合并為一個數組。請不要使用concat以及sort方法。

    Javascript排序算法之合并排序(歸并排序)的2個例子

    function merge(left, right) {var result = [],il = 0,ir = 0;while (il < left.length && ir < right.length) {if (left[il] < right[ir]) {result.push(left[il++]);} else {result.push(right[ir++]);}}result.push(left[il] ? left[il] : right[ir]);return result; } var left = [1, 4, 7]; var right = [2, 5]; console.log(merge(left, right))

    這個方法有個缺陷,left更大的時候,后面的元素沒了
    改下:

    function merge(left, right) {var result = [],il = 0,ir = 0;while (il < left.length && ir < right.length) {if (left[il] < right[ir]) {result.push(left[il++]);} else {result.push(right[ir++]);}}//這里注意result = result.concat(left[il] ? left.slice(il) : right.slice(ir));return result; } var left = [1, 4, 7, 8, 9, 10]; var right = [2, 5]; console.log(merge(left, right))

    作者:darr250
    鏈接:http://www.jianshu.com/p/258a2f734a85
    來源:簡書
    著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

    轉載于:https://www.cnblogs.com/sivkun/p/7586971.html

    總結

    以上是生活随笔為你收集整理的【转】前端面试的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。