整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          企業常問的CSS基礎面試題(附答案)

          企業常問的CSS基礎面試題(附答案)

          中公優就業·浙江IT培訓的小U老師為大家帶來一些前端面試中,常問到的CSS基礎面試題,希望大家可以扎實基礎,應對各種面試。

          1、介紹一下標準的CSS的盒子模型?與低版本IE的盒子模型有什么不同的?

          標準盒子模型:寬度=內容的寬度(content)+ border + padding + margin

          低版本IE盒子模型:寬度=內容寬度(content+border+padding)+ margin

          2、display有哪些值?說明他們的作用?

          inline(默認)–內聯

          none–隱藏

          block–塊顯示

          table–表格顯示

          list-item–項目列表

          inline-block

          3、position的值?

          static(默認):按照正常文檔流進行排列;

          relative(相對定位):不脫離文檔流,參考自身靜態位置通過 top, bottom, left, right 定位;

          absolute(絕對定位):參考距其最近一個不為static的父級元素通過top, bottom, left, right 定位;

          fixed(固定定位):所固定的參照對像是可視窗口。

          4、CSS3有哪些新特性?

          RGBA和透明度

          background-image background-origin(content-box/padding-box/border-box) background-size background-repeat

          word-wrap(對長的不可分割單詞換行)word-wrap:break-word

          文字陰影:text-shadow: 5px 5px 5px #FF0000;(水平陰影,垂直陰影,模糊距離,陰影顏色)

          font-face屬性:定義自己的字體

          圓角(邊框半徑):border-radius 屬性用于創建圓角

          邊框圖片:border-image: url(border.png) 30 30 round

          盒陰影:box-shadow: 10px 10px 5px #888888

          媒體查詢:定義兩套css,當瀏覽器的尺寸變化時會采用不同的屬性

          5、請解釋一下CSS3的flexbox(彈性盒布局模型),以及適用場景?

          該布局模型的目的是提供一種更加高效的方式來對容器中的條目進行布局、對齊和分配空間。在傳統的布局方式中,block 布局是把塊在垂直方向從上到下依次排列的;而 inline 布局則是在水平方向來排列。彈性盒布局并沒有這樣內在的方向限制,可以由開發人員自由操作。

          試用場景:彈性布局適合于移動前端開發,在Android和ios上也完美支持。

          6、一個滿屏品字布局如何設計?

          第一種真正的品字:

          三塊高寬是確定的;

          上面那塊用margin: 0 auto;居中;

          下面兩塊用float或者inline-block不換行;

          用margin調整位置使他們居中。

          第二種全屏的品字布局:

          上面的div設置成100%,下面的div分別寬50%,然后使用float或者inline使其不換行。

          7、CSS優化、提高性能的方法有哪些?

          避免過度約束

          避免后代選擇符

          避免鏈式選擇符

          使用緊湊的語法

          避免不必要的命名空間

          避免不必要的重復

          最好使用表示語義的名字。一個好的類名應該是描述他是什么而不是像什么

          避免!important,可以選擇其他選擇器

          盡可能的精簡規則,你可以合并不同類里的重復規則

          8、瀏覽器是怎樣解析CSS選擇器的?

          CSS選擇器的解析是從右向左解析的。若從左向右的匹配,發現不符合規則,需要進行回溯,會損失很多性能。若從右向左匹配,先找到所有的最右節點,對于每一個節點,向上尋找其父節點直到找到根元素或滿足條件的匹配規則,則結束這個分支的遍歷。兩種匹配規則的性能差別很大,是因為從右向左的匹配在第一步就篩選掉了大量的不符合條件的最右節點(葉子節點),而從左向右的匹配規則的性能都浪費在了失敗的查找上面。

          而在 CSS 解析完畢后,需要將解析的結果與 DOM Tree 的內容一起進行分析建立一棵 Render Tree,最終用來進行繪圖。在建立 Render Tree 時(WebKit 中的「Attachment」過程),瀏覽器就要為每個 DOM Tree 中的元素根據 CSS 的解析結果(Style Rules)來確定生成怎樣的 Render Tree。

          9、在網頁中的應該使用奇數還是偶數的字體?為什么呢?

          使用偶數字體。偶數字號相對更容易和 web 設計的其他部分構成比例關系。Windows 自帶的點陣宋體(中易宋體)從 Vista 開始只提供 12、14、16 px 這三個大小的點陣,而 13、15、17 px時用的是小一號的點。(即每個字占的空間大了 1 px,但點陣沒變),于是略顯稀疏。

          10、 margin和padding分別適合什么場景使用?

          何時使用margin:

          需要在border外側添加空白

          空白處不需要背景色

          上下相連的兩個盒子之間的空白,需要相互抵消時。

          何時使用padding:

          需要在border內側添加空白

          空白處需要背景顏色

          上下相連的兩個盒子的空白,希望為兩者之和。

          兼容性的問題:在IE5 IE6中,為float的盒子指定margin時,左側的margin可能會變成兩倍的寬度。通過改變padding或者指定盒子的display:inline解決。

          11、為什么要初始化CSS樣式

          因為瀏覽器的兼容問題,不同瀏覽器對有些標簽的默認值是不同的,如果沒對CSS初始化往往會出現瀏覽器之間的頁面顯示差異。

          12、 absolute的containing block計算方式跟正常流有什么不同?

          無論屬于哪種,都要先找到其祖先元素中最近的 position 值不為 static 的元素,然后再判斷:

          若此元素為 inline 元素,則 containing block 為能夠包含這個元素生成的第一個和最后一個 inline box 的 padding box (除 margin, border 外的區域) 的最小矩形;

          否則,則由這個祖先元素的 padding box 構成。

          如果都找不到,則為 initial containing block。

          補充:

          static(默認的)/relative:簡單說就是它的父元素的內容框(即去掉padding的部分)

          absolute: 向上找最近的定位為absolute/relative的元素

          fixed: 它的containing block一律為根元素(html/body)

          13、CSS里的visibility屬性有個collapse屬性值?在不同瀏覽器下以后什么區別?

          當一個元素的visibility屬性被設置成collapse值后,對于一般的元素,它的表現跟hidden是一樣的。

          chrome中,使用collapse值和使用hidden沒有區別。

          firefox,opera和IE,使用collapse值和使用display:none沒有什么區別。

          14、display:none與visibility:hidden的區別?

          display:none 不顯示對應的元素,在文檔布局中不再分配空間(回流+重繪)

          visibility:hidden 隱藏對應元素,在文檔布局中仍保留原來的空間(重繪)

          15、position跟display、overflow、float這些特性相互疊加后會怎么樣?

          display屬性規定元素應該生成的框的類型;position屬性規定元素的定位類型;float屬性是一種布局方式,定義元素在哪個方向浮動。

          類似于優先級機制:position:absolute/fixed優先級最高,有他們在時,float不起作用,display值需要調整。float 或者absolute定位的元素,只能是塊元素或表格。

          16、對BFC規范(塊級格式化上下文:block formatting context)的理解?

          BFC規定了內部的Block Box如何布局。

          定位方案:

          內部的Box會在垂直方向上一個接一個放置。

          Box垂直方向的距離由margin決定,屬于同一個BFC的兩個相鄰Box的margin會發生重疊。

          每個元素的margin box 的左邊,與包含塊border box的左邊相接觸。

          BFC的區域不會與float box重疊。

          BFC是頁面上的一個隔離的獨立容器,容器里面的子元素不會影響到外面的元素。

          計算BFC的高度時,浮動元素也會參與計算。

          滿足下列條件之一就可觸發BFC

          根元素,即html

          float的值不為none(默認)

          overflow的值不為visible(默認)

          display的值為inline-block、table-cell、table-caption

          position的值為absolute或fixed

          17、為什么會出現浮動和什么時候需要清除浮動?清除浮動的方式?

          浮動元素碰到包含它的邊框或者浮動元素的邊框停留。由于浮動元素不在文檔流中,所以文檔流的塊框表現得就像浮動框不存在一樣。浮動元素會漂浮在文檔流的塊框上。

          浮動帶來的問題:

          父元素的高度無法被撐開,影響與父元素同級的元素

          與浮動元素同級的非浮動元素(內聯元素)會跟隨其后

          若非第一個元素浮動,則該元素之前的元素也需要浮動,否則會影響頁面顯示的結構。

          清除浮動的方式:

          父級div定義height

          最后一個浮動元素后加空div標簽 并添加樣式clear:both。

          包含浮動元素的父標簽添加樣式overflow為hidden或auto。

          父級div定義zoom

          18、上下margin重合的問題

          在重合元素外包裹一層容器,并觸發該容器生成一個BFC。

          例子:

          .aside {

          margin-bottom: 100px;

          width: 100px;

          height: 150px;

          background: #f66;

          }

          .main {

          margin-top: 100px;

          height: 200px;

          background: #fcc;

          }

          .text{

          /*盒子main的外面包一個div,通過改變此div的屬性使兩個盒子分屬于兩個不同的BFC,以此來阻止margin重疊*/

          overflow: hidden; //此時已經觸發了BFC屬性。 }

          19、box-sizing屬性?

          用來控制元素的盒子模型的解析模式,默認為content-box

          context-box:W3C的標準盒子模型,設置元素的 height/width 屬性指的是content部分的高/寬

          border-box:IE傳統盒子模型。設置元素的height/width屬性指的是border + padding + content部分的高/寬

          20、CSS選擇器有哪些?哪些屬性可以繼承?

          CSS選擇符:id選擇器(#myid)、類選擇器(.myclassname)、標簽選擇器(div, h1, p)、相鄰選擇器(h1 + p)、子選擇器(ul > li)、后代選擇器(li a)、通配符選擇器(*)、屬性選擇器(a[rel=”external”])、偽類選擇器(a:hover, li:nth-child)

          可繼承的屬性:font-size, font-family, color

          不可繼承的樣式:border, padding, margin, width, height

          優先級(就近原則):!important > [ id > class > tag ]

          !important 比內聯優先級高

          21、CSS優先級算法如何計算?

          元素選擇符: 1

          class選擇符: 10

          id選擇符:100

          元素標簽:1000

          !important聲明的樣式優先級最高,如果沖突再進行計算。

          如果優先級相同,則選擇最后出現的樣式。

          繼承得到的樣式的優先級最低。

          22、CSS3新增偽類有那些?

          p:first-of-type 選擇屬于其父元素的首個元素

          p:last-of-type 選擇屬于其父元素的最后元素

          p:only-of-type 選擇屬于其父元素唯一的元素

          p:only-child 選擇屬于其父元素的唯一子元素

          p:nth-child(2) 選擇屬于其父元素的第二個子元素

          :enabled :disabled 表單控件的禁用狀態。

          :checked 單選框或復選框被選中。

          23、設置元素浮動后,該元素的display值是多少?

          自動變成display:block

          24、移動端的布局用過媒體查詢嗎?

          通過媒體查詢可以為不同大小和尺寸的媒體定義不同的css,適應相應的設備的顯示。

          里邊

          CSS : @media only screen and (max-device-width:480px) {/css樣式/}

          上就是畢業季了,很多同學都準備實習面試找工作了,今天來分享我在面試的畢業生的時候,會經常考察的16道JavaScript原理題,僅提供相應的核心原理和思路,具體細節大家可以收藏自己敲一遍研究理解。

          一定要收藏自己練一遍!理解了才是自己的!



          1. 實現一個call函數

          // 思路:將要改變this指向的方法掛到目標this上執行并返回
          Function.prototype.mycall=function (context) {
            if (typeof this !=='function') {
              throw new TypeError('not funciton')
            }
            context=context || window
            context.fn=this
            let arg=[...arguments].slice(1)
            let result=context.fn(...arg)
            delete context.fn
            return result
          } 
          

          2. 實現一個apply函數

          // 思路:將要改變this指向的方法掛到目標this上執行并返回
          Function.prototype.myapply=function (context) {
            if (typeof this !=='function') {
              throw new TypeError('not funciton')
            }
            context=context || window
            context.fn=this
            let result
            if (arguments[1]) {
              result=context.fn(...arguments[1])
            } else {
              result=context.fn()
            }
            delete context.fn
            return result
          }

          3. 實現一個bind函數

          // 思路:類似call,但返回的是函數
          Function.prototype.mybind=function (context) {
            if (typeof this !=='function') {
              throw new TypeError('Error')
            }
            let _this=this
            let arg=[...arguments].slice(1)
            return function F() {
              // 處理函數使用new的情況
              if (this instanceof F) {
                return new _this(...arg, ...arguments)
              } else {
                return _this.apply(context, arg.concat(...arguments))
              }
            }
          }

          4. new本質

          function myNew (fun) {
            return function () {
              // 創建一個新對象且將其隱式原型指向構造函數原型
              let obj={
                __proto__ : fun.prototype
              }
              // 執行構造函數
              fun.call(obj, ...arguments)
              // 返回該對象
              return obj
            }
          }
          function person(name, age) {
            this.name=name
            this.age=age
          }
          let obj=myNew(person)('chen', 18) 
          // {name: "chen", age: 18}

          5. Object.create的基本實現原理

          // 思路:將傳入的對象作為原型
          function create(obj) {
            function F() {}
            F.prototype=obj
            return new F()
          }

          6. instanceof的原理

          // 思路:右邊變量的原型存在于左邊變量的原型鏈上
          function instanceOf(left, right) {
            let leftValue=left.__proto__
            let rightValue=right.prototype
            while (true) {
              if (leftValue===null) {
                return false
              }
              if (leftValue===rightValue) {
                return true
              }
              leftValue=leftValue.__proto__
            }
          }

          7. 實現一個基本的Promise

          // 未添加異步處理等其他邊界情況
          // ①自動執行函數,②三個狀態,③then
          class Promise {
            constructor (fn) {
              // 三個狀態
              this.state='pending'
              this.value=undefined
              this.reason=undefined
              let resolve=value=> {
                if (this.state==='pending') {
                  this.state='fulfilled'
                  this.value=value
                }
              }
              let reject=value=> {
                if (this.state==='pending') {
                  this.state='rejected'
                  this.reason=value
                }
              }
              // 自動執行函數
              try {
                fn(resolve, reject)
              } catch (e) {
                reject(e)
              }
            }
            // then
            then(onFulfilled, onRejected) {
              switch (this.state) {
                case 'fulfilled':
                  onFulfilled()
                  break
                case 'rejected':
                  onRejected()
                  break
                default:
              }
            }
          }

          8. 實現淺拷貝

          // 1. ...實現
          let copy1={...{x:1}}
          // 2. Object.assign實現
          let copy2=Object.assign({}, {x:1})

          9. 使用setTimeout模擬setInterval

          // 可避免setInterval因執行時間導致的間隔執行時間不一致
          setTimeout (function () {
            // do something
            setTimeout (arguments.callee, 500)
          }, 500)

          10. js實現一個繼承方法

          // 借用構造函數繼承實例屬性
          function Child () {
            Parent.call(this)
          }
          // 寄生繼承原型屬性
          (function () {
            let Super=function () {}
            Super.prototype=Parent.prototype
            Child.prototype=new Super()
          })()
          



          11. 實現一個基本的深拷貝

          // 1. JOSN.stringify()/JSON.parse()
          let obj={a: 1, b: {x: 3}}
          JSON.parse(JSON.stringify(obj))
          // 2. 遞歸拷貝
          function deepClone(obj) {
           let copy=obj instanceof Array ? [] : {}
           for (let i in obj) {
            if (obj.hasOwnProperty(i)) {
            copy[i]=typeof obj[i]==='object'?deepClone(obj[i]):obj[i]
              }
            }
            return copy
          }

          12. 實現一個基本的Event Bus

          // 組件通信,一個觸發與監聽的過程
          class EventEmitter {
            constructor () {
              // 存儲事件
              this.events=this.events || new Map()
            }
            // 監聽事件
            addListener (type, fn) {
              if (!this.events.get(type)) {
                this.events.set(type, fn)
              }
            }
            // 觸發事件
            emit (type) {
              let handle=this.events.get(type)
              handle.apply(this, [...arguments].slice(1))
            }
          }
          // 測試
          let emitter=new EventEmitter()
          // 監聽事件
          emitter.addListener('ages', age=> {
            console.log(age)
          })
          // 觸發事件
          emitter.emit('ages', 18)  // 18

          13. 實現一個雙向數據綁定

          let obj={}
          let input=document.getElementById('input')
          let span=document.getElementById('span')
          // 數據劫持
          Object.defineProperty(obj, 'text', {
            configurable: true,
            enumerable: true,
            get() {
              console.log('獲取數據了')
            },
            set(newVal) {
              console.log('數據更新了')
              input.value=newVal
              span.innerHTML=newVal
            }
          })
          // 輸入監聽
          input.addEventListener('keyup', function(e) {
            obj.text=e.target.value
          })

          14. 實現一個簡單路由

          // hash路由
          class Route{
            constructor(){
              // 路由存儲對象
              this.routes={}
              // 當前hash
              this.currentHash=''
              // 綁定this,避免監聽時this指向改變
              this.freshRoute=this.freshRoute.bind(this)
              // 監聽
              window.addEventListener('load', this.freshRoute, false)
              window.addEventListener('hashchange', this.freshRoute, false)
            }
            // 存儲
            storeRoute (path, cb) {
              this.routes[path]=cb || function () {}
            }
            // 更新
            freshRoute () {
              this.currentHash=location.hash.slice(1) || '/'
              this.routes[this.currentHash]()
            }   
          }

          15. 實現一個節流函數

          // 思路:在規定時間內只觸發一次
          function throttle (fn, delay) {
            // 利用閉包保存時間
            let prev=Date.now()
            return function () {
              let context=this
              let arg=arguments
              let now=Date.now()
              if (now - prev >=delay) {
                fn.apply(context, arg)
                prev=Date.now()
              }
            }
          }
          function fn () {
            console.log('節流')
          }
          addEventListener('scroll', throttle(fn, 1000)) 

          16. 實現一個防抖函數

          .Doctype作用?標準模式與兼容模式各有什么區別

          <!DOCTYPE>聲明位于位于HTML文檔中的第一行,處于 <html>標簽之前。告知瀏覽器的解析器,用什么文檔標準解析這個文檔。DOCTYPE不存在或格式不正確會導致文檔以兼容模式呈現。
          標準模式的排版 和JS運作模式都是以該瀏覽器支持的最高標準運行。在兼容模式中,頁面以寬松的向后兼容的方式顯示,模擬老式瀏覽器的行為以防止站點無法工作。

          2.HTML5 為什么只需要寫 <!DOCTYPE HTML>?

          HTML5 不基于 SGML,因此不需要對DTD進行引用,但是需要doctype來規范瀏覽器的行為(讓瀏覽器按照它們應該的方式來運行);
          而HTML4.01基于SGML,所以需要對DTD進行引用,才能告知瀏覽器文檔所使用的文檔類型。**

          3.行內元素有哪些?塊級元素有哪些? 空(void)元素有那些?

          首先:CSS規范規定,每個元素都有display屬性,確定該元素的類型,每個元素都有默認的display值,如div的display默認值為“block”,則為“塊級”元素;span默認display屬性值為“inline”,是“行內”元素
          (1)行內元素有:a b span img input select strong(強調的語氣)
          (2)塊級元素有:div ul ol li dl dt dd h1 h2 h3 h4…p
          (3)常見的空元素:


          <img><input><link><meta>
          鮮為人知的是:
          <area><base><col><command><embed><keygen><param><source><track><wbr>
          4.頁面導入樣式時,使用link和@import有什么區別?
          link屬于XHTML標簽,除了加載CSS外,還能用于定義RSS, 定義rel連接屬性等作用;而@import是CSS提供的,只能用于加載CSS;
          頁面被加載的時,link會同時被加載,而@import引用的CSS會等到頁面被加載完再加載;
          import是CSS2.1 提出的,只在IE5以上才能被識別,而link是XHTML標簽,無兼容問題;

          5.介紹一下你對瀏覽器內核的理解?

          主要分成兩部分:渲染引擎(layout engineer或Rendering Engine)和JS引擎。
          渲染引擎:負責取得網頁的內容(HTML、XML、圖像等等)、整理訊息(例如加入CSS等),以及計算網頁的顯示方式,然后會輸出至顯示器或打印機。瀏覽器的內核的不同對于網頁的語法解釋會有不同,所以渲染的效果也不相同。所有網頁瀏覽器、電子郵件客戶端以及其它需要編輯、顯示網絡內容的應用程序都需要內核。
          JS引擎則:解析和執行javascript來實現網頁的動態效果。
          最開始渲染引擎和JS引擎并沒有區分的很明確,后來JS引擎越來越獨立,內核就傾向于只指渲染引擎。

          6.常見的瀏覽器內核有哪些?

          Trident內核:IE,MaxThon,TT,The World,360,搜狗瀏覽器等。[又稱MSHTML]
          Gecko內核:Netscape6及以上版本,FF,MozillaSuite/SeaMonkey等
          Presto內核:Opera7及以上。 [Opera內核原為:Presto,現為:Blink;]
          Webkit內核:Safari,Chrome等。 [ Chrome的:Blink(WebKit的分支)]

          7.html5有哪些新特性、移除了那些元素?如何處理HTML5新標簽的瀏覽器兼容問題?如何區分 HTML 和 HTML5?

          • HTML5 現在已經不是 SGML 的子集,主要是關于圖像,位置,存儲,多任務等功能的增加。繪畫 canvas;
            用于媒介回放的 video 和 audio 元素;
            本地離線存儲 localStorage 長期存儲數據,瀏覽器關閉后數據不丟失;
            sessionStorage 的數據在瀏覽器關閉后自動刪除;
            語意化更好的內容元素,比如 article、footer、header、nav、section;
            表單控件,calendar、date、time、email、url、search;
            新的技術webworker, websocket, Geolocation;


          移除的元素:
          純表現的元素:basefont,big,center,font, s,strike,tt,u;
          對可用性產生負面影響的元素:frame,frameset,noframes;

          • 支持HTML5新標簽:IE8/IE7/IE6支持通過document.createElement方法產生的標簽,
            可以利用這一特性讓這些瀏覽器支持HTML5新標簽,
            瀏覽器支持新標簽后,還需要添加標簽默認的樣式。
            當然也可以直接使用成熟的框架、比如html5shim;
            <!--[if lt IE 9]>
            <scriptsrc="http://html5shim.googlecode.com/svn/trunk/html5.js"> </script>
            <![endif]-->
          • 如何區分HTML5: DOCTYPE聲明新增的結構元素功能元素
            H5新特性
            表單 畫布 音視頻 地理定位 媒體查詢 css新特性 離線緩存 本地存儲 拖拽

          8.簡述一下你對HTML語義化的理解?

          用正確的標簽做正確的事情。
          html語義化讓頁面的內容結構化,結構更清晰,便于對瀏覽器、搜索引擎解析;
          即使在沒有樣式CSS情況下也以一種文檔格式顯示,并且是容易閱讀的;
          搜索引擎的爬蟲也依賴于HTML標記來確定上下文和各個關鍵字的權重,利于SEO;
          使閱讀源代碼的人對網站更容易將網站分塊,便于閱讀維護理解。

          9.HTML5的離線儲存怎么使用,工作原理能不能解釋一下?

          在用戶沒有連網時,可以正常訪問站點或應用,在用戶與網絡連接時更新用戶機器上的緩存文件。
          原理:HTML5的離線存儲是基于一個新建的.appcache文件的緩存機制(不是存儲技術),通過這個文件上的解析清單離線存儲資源,這些資源就會像cookie一樣被存儲了下來。之后當網絡在處于離線狀態下時,瀏覽器會通過被離線存儲的數據進行頁面展示。
          如何使用
          頁面頭部像下面一樣加入一個manifest的屬性;
          在cache.manifest文件的編寫離線存儲的資源;
          CACHE MANIFEST
          #v0.11
          CACHE:
          js/app.js
          css/style.css
          NETWORK:
          resourse/logo.png
          FALLBACK:
          / /offline.html
          在離線狀態時,操作window.applicationCache進行需求實現。

          10.瀏覽器是怎么對HTML5的離線儲存資源進行管理和加載的呢?

          在線的情況下,瀏覽器發現html頭部有manifest屬性,它會請求manifest文件,如果是第一次訪問app,那么瀏覽器就會根據manifest文件的內容下載相應的資源并且進行離線存儲。如果已經訪問過app并且資源已經離線存儲了,那么瀏覽器就會使用離線的資源加載頁面,然后瀏覽器會對比新的manifest文件與舊的manifest文件,如果文件沒有發生改變,就不做任何操作,如果文件改變了,那么就會重新下載文件中的資源并進行離線存儲。
          離線的情況下,瀏覽器就直接使用離線存儲的資源。

          11.iframe有那些缺點?

          iframe會阻塞主頁面的Onload事件;
          搜索引擎的檢索程序無法解讀這種頁面,不利于SEO;
          iframe和主頁面共享連接池,而瀏覽器對相同域的連接有限制,所以會影響頁面的并行加載。
          使用iframe之前需要考慮這兩個缺點。如果需要使用iframe,最好是通過javascript
          動態給iframe添加src屬性值,這樣可以繞開以上兩個問題。

          12.Label的作用是什么?是怎么用的?

          label標簽來定義表單控制間的關系,當用戶選擇該標簽時,瀏覽器會自動將焦點轉到和標簽相關的表單控件上。

          <label for="Name">Number:</label>
          <input type=“text“name="Name" id="Name"/>
          <label>Date:<input type="text" name="B"/></label>

          13.如何實現瀏覽器內多個標簽頁之間的通信?

          WebSocket、也可以調用localstorge、cookies等本地存儲方式,還可以使用頁面的路有參數傳遞
          localstorge另一個瀏覽上下文里被添加、修改或刪除時,它都會觸發一個事件,
          我們通過監聽事件,控制它的值來進行頁面信息通信;
          14.如何在頁面上實現一個圓形的可點擊區域?
          map+area或者svg
          border-radius
          純js實現 需要求一個點在不在圓上簡單算法、獲取鼠標坐標等等

          15.title與h1的區別、b與strong的區別、i與em的區別?

          title屬性沒有明確意義只表示是個標題,H1則表示層次明確的標題,對頁面信息的抓取也有很大的影響;
          strong是標明重點內容,有語氣加強的含義,使用閱讀設備閱讀網絡時:會重讀,而是展示強調內容。
          i內容展示為斜體,em表示強調的文本;

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

          h5新增的屬性
          可以通過ele.dataset獲取到標簽上的data-x的屬性
          返回一個對象

          17.常見兼容性問題?

          問題:png24位的圖片在iE6瀏覽器上出現背景,

          解決:解決方案是做成PNG8.

          問題:瀏覽器默認的margin和padding不同。

          解決:方案是加一個全局的*{margin:0;padding:0;}來統一。

          問題:IE6雙邊距bug:塊屬性標簽float后,又有橫行的margin情況下,在ie6顯示margin比設置的大。浮動ie產生的雙倍距離 #box{ float:left; width:10px; margin:0 0 0 100px;}這種情況之下IE會產生20px的距離**

          解決:解決方案是在float的標簽樣式控制中加入 ——_display:inline;將其轉化為行內屬性。(_這個符號只有ie6會識別)
          漸進識別的方式,從總體中逐漸排除局部。
          首先,巧妙的使用“9”這一標記,將IE游覽器從所有情況中分離出來。 接著,再次使用“+”將IE8和IE7、IE6分離開來,這樣IE8已經獨立識別。
          css

          .bb{ 
             background-color:#f1ee18;/*所有識別*/ 
            .background-color:#00deff\9; /*IE6、7、8識別*/ 
            +background-color:#a200ff;/*IE6、7識別*/ 
            _background-color:#1e0bd1;/*IE6識別*/ 
            } 
          

          問題:IE下,可以使用獲取常規屬性的方法來獲取自定義屬性,也可以使用getAttribute()獲取自定義屬性,Firefox下,只能使用getAttribute()獲取自定義屬性.

          解決:解決方法:統一通過getAttribute()獲取自定義屬性.

          問題:IE下,even對象有x,y屬性,但是沒有pageX,pageY屬性,Firefox下,event對象有pageX,pageY屬性,但是沒有x,y屬性.

          解決方法:(條件注釋)缺點是在IE瀏覽器下可能會增加額外的HTTP請求數。

          問題:Chrome 中文界面下默認會將小于 12px 的文本強制按照 12px 顯示,

          解決:可通過加入 CSS 屬性 -webkit-text-size-adjust: none; 解決.

          問題:超鏈接訪問過后hover樣式就不出現了 被點擊訪問過的超鏈接樣式不在具有hover和active了

          解決:方法是改變CSS屬性的排列順序:L-V-H-A : a:link {} a:visited {} a:hover {} a:active {}

          18.你知道多少種Doctype文檔類型?

          該標簽可聲明三種 DTD 類型,分別表示嚴格版本、過渡版本以及基于框架的 HTML 文檔。
          HTML 4.01 規定了三種文檔類型:Strict、Transitional 以及 Frameset。
          XHTML 1.0 規定了三種 XML 文檔類型:Strict、Transitional 以及 Frameset。
          Standards (標準)模式(也就是嚴格呈現模式)用于呈現遵循最新標準的網頁,而 Quirks(包容)模式(也就是松散呈現模式或者兼容模式)用于呈現為傳統瀏覽器而設計的網頁。

          19.HTML與XHTML——二者有什么區別?

          1)所有的標記都必須要有一個相應的結束標記
          2)所有標簽的元素和屬性的名字都必須使用小寫
          3)所有的XML標記都必須合理嵌套
          4)所有的屬性必須用引號""括起來
          5)把所有<和&特殊符號用編碼表示
          6)給所有屬性賦一個值
          7)不要在注釋內容中使“--”
          8)圖片必須有說明文字

          20.<img>的title和alt有什么區別?

          title是global attributes之一,用于為元素提供附加的advisory information。通常當鼠標滑動到元素上的時候顯示。
          alt是<img>的特有屬性,是圖片內容的等價描述,用于圖片無法加載時顯示、讀屏器閱讀圖片。可提圖片高可訪問性,除了純裝飾圖片外都必須設置有意義的值,搜索引擎會重點分析。

          21.div+css的布局較table布局有什么優點?

          改版的時候更方便 只要改css文件。
          頁面加載速度更快、結構化清晰、頁面顯示簡潔。
          表現與結構相分離。
          易于優化(seo)搜索引擎更友好,排名更容易靠前。

          22.CSS都有哪些選擇器?

          派生選擇器(用HTML標簽申明)
          id選擇器(用DOM的ID申明)
          類選擇器(用一個樣式類名申明)
          屬性選擇器(用DOM的屬性申明,屬于CSS2,IE6不支持,不常用,不知道就算了)
          除了前3種基本選擇器,還有一些擴展選擇器,包括
          后代選擇器(利用空格間隔,比如div .a{ })
          群組選擇器(利用逗號間隔,比如p,div,#a{ })
          那么問題來了,CSS選擇器的優先級是怎么樣定義的?

          基本原則:

          一般而言,選擇器越特殊,它的優先級越高。也就是選擇器指向的越準確,它的優先級就越高。
          復雜的計算方法:
          用1表示派生選擇器的優先級
          用10表示類選擇器的優先級
          用100標示ID選擇器的優先級
          div.test1 .span var 優先級 1+10 +10 +1
          span#xxx .songs li 優先級1+100 + 10 + 1
          xxx li 優先級 100 +1
          那么問題來了,看下列代碼,<p>標簽內的文字是什么顏色的?
          <style>
          .classA{ color:blue;}
          .classB{ color:red;}
          </style>
          <body>
          <p class='classB classA'> 123 </p>
          </body>
          答案:red。與樣式定義在文件中的先后順序有關,即是后面的覆蓋前面的,與在<p class=’classB classA’>中的先后關系無關。

          23.行內元素和塊級元素的具體區別是什么?行內元素的padding和margin可設置嗎?

          塊級元素(block)特性:
          總是獨占一行,表現為另起一行開始,而且其后的元素也必須另起一行顯示;
          寬度(width)、高度(height)、內邊距(padding)和外邊距(margin)都可控制;
          內聯元素(inline)特性:
          和相鄰的內聯元素在同一行;
          寬度(width)、高度(height)、內邊距的top/bottom(padding-top/padding-bottom)和外邊距的top/bottom(margin-top/margin-bottom)都不可改變(也就是padding和margin的left和right是可以設置的),就是里面文字或圖片的大小。
          那么問題來了,瀏覽器還有默認的天生inline-block元素(擁有內在尺寸,可設置高寬,但不會自動換行),有哪些?
          答案:<input> 、<img> 、<button> 、<texterea> 、<label>。

          24.什么是外邊距重疊?重疊的結果是什么?

          外邊距重疊就是margin-collapse。
          在CSS當中,相鄰的兩個盒子(可能是兄弟關系也可能是祖先關系)的外邊距可以結合成一個單獨的外邊距。這種合并外邊距的方式被稱為折疊,并且因而所結合成的外邊距稱為折疊外邊距。
          折疊結果遵循下列計算規則:
          兩個相鄰的外邊距都是正數時,折疊結果是它們兩者之間較大的值。
          兩個相鄰的外邊距都是負數時,折疊結果是兩者絕對值的較大值。
          兩個外邊距一正一負時,折疊結果是兩者的相加的和。

          25.rgba()和opacity的透明效果有什么不同?

          rgba()和opacity都能實現透明效果,但最大的不同是opacity作用于元素,以及元素內的所有內容的透明度,
          而rgba()只作用于元素的顏色或其背景色。(設置rgba透明的元素的子元素不會繼承透明效果!)

          26.CSS 選擇符有哪些?哪些屬性可以繼承?優先級算法如何計算? CSS3新增偽類有那些?

          *   1.id選擇器( # myid)
              2.類選擇器(.myclassname)
              3.標簽選擇器(div, h1, p)
              4.相鄰選擇器(h1 + p)
              5.子選擇器(ul < li)
              6.后代選擇器(li a)
              7.通配符選擇器( * )
              8.屬性選擇器(a[rel="external"])
              9.偽類選擇器(a: hover, li: nth - child)
          *   可繼承: font-size font-family color, UL LI DL DD DT;
          *   不可繼承 :border padding margin width height ;
          *   優先級就近原則,樣式定義最近者為準;
          *   載入樣式以最后載入的定位為準;

          優先級為:

             !important >  id > class > tag  
             important 比 內聯優先級高

          CSS3新增偽類舉例:

          p:first-of-type 選擇屬于其父元素的首個 <p> 元素的每個 <p> 元素。
          p:last-of-type  選擇屬于其父元素的最后 <p> 元素的每個 <p> 元素。
          p:only-of-type  選擇屬于其父元素唯一的 <p> 元素的每個 <p> 元素。
          p:only-child    選擇屬于其父元素的唯一子元素的每個 <p> 元素。
          p:nth-child(2)  選擇屬于其父元素的第二個子元素的每個 <p> 元素。
          :enabled、:disabled 控制表單控件的禁用狀態。
          :checked,單選框或復選框被選中。

          27.如何居中div,如何居中一個浮動元素?

          給div設置一個寬度,然后添加margin:0 auto屬性

          div{

          width:200px;
          margin:0 auto;

          }

          居中一個浮動元素

            確定容器的寬高 寬500 高 300 的層
            設置層的外邊距
          
          

          .div {
          Width:500px ; height:300px;//高度可以不設
          Margin: -150px 0 0 -250px;
          position:relative;相對定位
          background-color:pink;//方便看效果
          left:50%;
          top:50%;
          }

          28.瀏覽器的內核分別是什么?經常遇到的瀏覽器的兼容性有哪些?原因,解決方法是什么,常用hack的技巧 ?

          *  IE瀏覽器的內核Trident、 Mozilla的Gecko、google的WebKit、Opera內核Presto;
          *  png24為的圖片在iE6瀏覽器上出現背景,解決方案是做成PNG8.
          *  瀏覽器默認的margin和padding不同。解決方案是加一個全局的*{margin:0;padding:0;}來統一。
          *  IE6雙邊距bug:塊屬性標簽float后,又有橫行的margin情況下,在ie6顯示margin比設置的大。 
            浮動ie產生的雙倍距離 #box{ float:left; width:10px; margin:0 0 0 100px;} 
           這種情況之下IE會產生20px的距離,解決方案是在float的標簽樣式控制中加入 ——_display:inline;將其轉化為行內屬性。(_這個符號只有ie6會識別)
            漸進識別的方式,從總體中逐漸排除局部。 
            首先,巧妙的使用“\9”這一標記,將IE游覽器從所有情況中分離出來。 
            接著,再次使用“+”將IE8和IE7、IE6分離開來,這樣IE8已經獨立識別。
          
          

          css

            .bb{
             background-color:#f1ee18;/*所有識別*/
            .background-color:#00deff\9; /*IE6、7、8識別*/
            +background-color:#a200ff;/*IE6、7識別*/
            _background-color:#1e0bd1;/*IE6識別*/
            }
          
          
          *  IE下,可以使用獲取常規屬性的方法來獲取自定義屬性,
             也可以使用getAttribute()獲取自定義屬性;
             Firefox下,只能使用getAttribute()獲取自定義屬性. 
             解決方法:統一通過getAttribute()獲取自定義屬性.
          *  IE下,even對象有x,y屬性,但是沒有pageX,pageY屬性; 
            Firefox下,event對象有pageX,pageY屬性,但是沒有x,y屬性.
          * (條件注釋)缺點是在IE瀏覽器下可能會增加額外的HTTP請求數。
          *  Chrome 中文界面下默認會將小于 12px 的文本強制按照 12px 顯示, 可通過加入 CSS 屬性 -webkit-text-size-adjust: none; 解決.
          超鏈接訪問過后hover樣式就不出現了 被點擊訪問過的超鏈接樣式不在具有hover和active了解決方法是改變CSS屬性的排列順序:
          L-V-H-A :  a:link {} a:visited {} a:hover {} a:active {}
          

          29.css優先級算法如何計算?

          !important > id > class > 標簽
          !important 比 內聯優先級高

          • 優先級就近原則,樣式定義最近者為準;
          • 以最后載入的樣式為準;

          30.哪些css屬性可以繼承?

          可繼承: font-size font-family color, ul li dl dd dt;
          不可繼承 :border padding margin width height ;

          DOM

          講 DOM 先從 HTML 講起,講 HTML 先從 XML 講起。XML 是一種可擴展的標記語言,所謂可擴展就是它可以描述任何結構化的數據,它是一棵樹!

          1.documen.write和 innerHTML的區別

          document.write只能重繪整個頁面
          innerHTML可以重繪頁面的一部分

          2.DOM操作——怎樣添加、移除、移動、復制、創建和查找節點?

          1)創建新節點

          createDocumentFragment() //創建一個DOM片段
          createElement() //創建一個具體的元素
          createTextNode() //創建一個文本節點

          2)添加、移除、替換、插入

          appendChild()
          removeChild()
          replaceChild()
          insertBefore() //在已有的子節點前插入一個新的子節點

          3)查找

          getElementsByTagName() //通過標簽名稱
          getElementsByName() //通過元素的Name屬性的值(IE容錯能力較強,會得到一個數組,其中包括id等于name值的)
          getElementById() //通過元素Id,唯一性

          3.attribute和property的區別是什么?

          attribute是dom元素在文檔中作為html標簽擁有的屬性;
          property就是dom元素在js中作為對象擁有的屬性。
          所以:
          對于html的標準屬性來說,attribute和property是同步的,是會自動更新的,
          但是對于自定義的屬性來說,他們是不同步的,

          4.src和href的區別

          src用于替換當前元素,href用于在當前文檔和引用資源之間確立聯系。
          src是source的縮寫,指向外部資源的位置,指向的內容將會嵌入到文檔中當前標簽所在位置;在請求src資源時會將其指向的資源下載并應用到文檔內,當瀏覽器解析到該元素時,會暫停其他資源的下載和處理,直到將該資源加載、編譯、執行完畢,圖片和框架等元素也如此,類似于將所指向資源嵌入當前標簽內。這也是為什么將js腳本放在底部而不是頭部。
          Src source,指向外部資源的位置,如果我們添加<script src="js.js"></script>瀏覽器會暫停其他資源的下載和處理,直到該資源加載,編譯,執行完畢(圖片和框架也是如此),這也就是為什么js腳本要放在底部。
          src用于替換當前元素,href用于在當前文檔和引入資源之間建立聯系。

          存儲

          cookie

          cookie 本身不是用來做服務器端存儲的(計算機領域有很多這種“狗拿耗子”的例子,例如 CSS 中的 float),它是設計用來在服務器和客戶端進行信息傳遞的,因此我們的每個 HTTP 請求都帶著 cookie。但是 cookie 也具備瀏覽器端存儲的能力(例如記住用戶名和密碼),因此就被開發者用上了。
          使用起來也非常簡單,document.cookie=....即可。
          但是 cookie 有它致命的缺點:
          存儲量太小,只有 4KB
          所有 HTTP 請求都帶著,會影響獲取資源的效率
          API 簡單,需要封裝才能用

          locationStorage 和 sessionStorage

          后來,HTML5 標準就帶來了sessionStorage和localStorage,先拿localStorage來說,它是專門為了瀏覽器端緩存而設計的。

          其優點有:

          存儲量增大到 5MB
          不會帶到 HTTP 請求中
          API 適用于數據存儲 localStorage.setItem(key, value) localStorage.getItem(key)
          sessionStorage的區別就在于它是根據 session 過去時間而實現,而localStorage會永久有效,應用場景不同。例如,一些需要及時失效的重要信息放在sessionStorage中,一些不重要但是不經常設置的信息,放在localStorage中。

          對WEB標準以及W3C的理解與認識

          標簽閉合、標簽小寫、不亂嵌套、提高搜索機器人搜索幾率、使用外 鏈css和js腳本、結構行為表現的分離、文件下載與頁面速度更快、內容能被更多的用戶所訪問、內容能被更廣泛的設備所訪問、更少的代碼和組件,容易維 護、改版方便,不需要變動頁面內容、提供打印版本而不需要復制內容、提高網站易用性;


          主站蜘蛛池模板: 国产在线视频一区| 伊人久久大香线蕉av一区| 国产一区麻豆剧传媒果冻精品| 久久久久女教师免费一区| 一区二区三区在线|欧| 日韩毛片基地一区二区三区| 日韩精品一区二区三区国语自制| 一区二区三区在线播放| 欧洲无码一区二区三区在线观看| 色婷婷综合久久久久中文一区二区| 亚洲一区无码中文字幕乱码| 久久99国产精品一区二区| 无码国产精品久久一区免费| 久久婷婷色综合一区二区| 国产乱码精品一区二区三区中| 人妻无码一区二区三区四区| 在线免费视频一区二区| 亚洲一区二区三区在线观看蜜桃| 国产一区二区三区91| 中文乱码精品一区二区三区| 国产成人精品一区二区三区 | 91精品一区二区三区久久久久 | 亚洲欧洲一区二区| 久久亚洲中文字幕精品一区四| 精品3d动漫视频一区在线观看| 无码日本电影一区二区网站| 国产美女在线一区二区三区| 中文字幕一区二区三区久久网站| 久久精品一区二区东京热| 国产主播一区二区| 激情一区二区三区| 日本不卡免费新一区二区三区| 在线观看免费视频一区| 中文字幕一区二区人妻| 中文字幕一区二区在线播放| 中日韩一区二区三区| 国产福利视频一区二区| 国产精品丝袜一区二区三区| 色噜噜狠狠一区二区三区果冻 | 精品免费久久久久国产一区| 亚洲国产一区视频|