1. 程式人生 > >認識響應式相容問題respond.js和html5shiv.js

認識響應式相容問題respond.js和html5shiv.js

//檢測是否支援media query,檢測css是否有效的方法都差不多,建立一個元素應用該css後檢測元素寬度,然後清除該元素。
window.matchMedia = window.matchMedia || (function(doc, undefined){
  var bool,
      docElem  = doc.documentElement,
      refNode  = docElem.firstElementChild || docElem.firstChild,
      // fakeBody required for 
      fakeBody = doc.createElement('body'),
      div      = doc.createElement('div');
  div.id = 'mq-test-1';
  div.style.cssText = "position:absolute;top:-100em";
  fakeBody.style.background = "none";
  fakeBody.appendChild(div);
  return function(q){
    div.innerHTML = '­';
    docElem.insertBefore(fakeBody, refNode);
    bool = div.offsetWidth == 42;
    docElem.removeChild(fakeBody);
    return { matches: bool, media: q };
  };
})(document);
		
        .......
if( !!href && isCSS && !parsedSheets[ href ] ){
    // selectivizr exposes css through the rawCssText expando
    if (sheet.styleSheet && sheet.styleSheet.rawCssText) {
                //sheet.styleSheet.rawCssText看不懂,原來是方便selectivizr和respond.js聯用,http://selectivizr.com/tests/respond/
                //selectivizr的作用是 CSS3 selectors for IE;約定將原csstext放在styleSheet的link上的擴充套件屬性rawCssText上;這裡如果聯用selectivizr可以少次ajax請求
        translate( sheet.styleSheet.rawCssText, href, media );
        parsedSheets[ href ] = true;
    } else {
        if( (!/^([a-zA-Z:]*\/\/)/.test( href ) && !base)
            || href.replace( RegExp.$1, "" ).split( "/" )[0] === win.location.host ){
            requestQueue.push( {
                href: href,
                media: media
            } );
        }
    }
}
.......

其餘的程式碼就是ajax實現和translate media query的max-width min-width的邏輯了;可以看出這裡必須依賴ajax請求css路徑才能得到css檔案中的mediaquery的內容,那ajax的跨域問題就要解決了;由於我們的靜態資源都是要放cdn的,respond.js也給出了跨域方法,即引入代理頁面。

		
//把cross-domain/respond-proxy.html 放到cdn上
//把cross-domain/respond.proxy.gif 放到當前域伺服器上
<!-- Respond.js proxy on external server -->
<link href="http://externalcdn.com/respond-proxy.html" id="respond-proxy" rel="respond-proxy" />

<!-- Respond.js redirect location on local server -->
<link href="/path/to/respond.proxy.gif" id="respond-redirect" rel="respond-redirect" />

<!-- Respond.js proxy script on local server -->
<script src="/path/to/respond.proxy.js"></script>

這裡ajax跨域實現是通過代理頁面將獲取到的css,再通過window.name通訊實現;如在respond.proxy.js中

function checkFrameName() {
    var cssText;
    try {
        cssText = iframe.contentWindow.name;
                var now = new Date().getTime(),useTime = now - initTime;
        alert('獲取css耗時:'+ useTime + 'ms');
    }
    catch (e) { }

    if (cssText) {
        ……//銷燬之前用於通訊的iframe,後續回撥callback
        callback(cssText);
    }
    else{
        win.setTimeout(checkFrameName, 100);
    }
}
win.setTimeout(checkFrameName, 500);//500ms後確認內部iframe的name值是否傳遞過來,後續再更新當前viewport該用的css。

因為實現跨域代理的問題,初始化頁面時應用上全部css耗時較長,以下光測試從開始執行該js檔案到css取回呼叫之前的耗時為500ms-515ms之間(每次重新整理結果不一樣),ie8下測試結果如下 T10Xg1Xl0cXXXxfAUk-634-396

測試結果發現,重新整理頁面後會有明顯的閃屏(以該測試demo為例,一開始頁面背景是黑色的,這是預設css中的,跨域js執行完成後分析出media query中的該viewport尺寸下應該應用red的背景,所以又變成紅色),間隔時間為500ms以上。所以體驗不是很好,而且該場景中ajax跨域目前已經沒有更好的實現方式,500ms間隔的閃屏避免不了。

同時因為是ajax請求css,所以會因為響應式而額外產生一個請求,好在之前css請求過一遍,這次ajax請求是讀取瀏覽器快取中的,如下圖中fiddler的檢測結果中的第三個請求和第六個請求: T1IHM0XaleXXaqU36o-600-217

相關推薦

認識響應相容問題respond.jshtml5shiv.js

//檢測是否支援media query,檢測css是否有效的方法都差不多,建立一個元素應用該css後檢測元素寬度,然後清除該元素。 window.matchMedia = window.matchMedia || (function(doc, undefined){ var bool, do

bootstrap響應相容PC移動端圖片無縫滾動效果demo

效果如圖所示: js程式碼部分: /** * Created by Administrator on 2017/9/15. */ (function(){ var firstD

響應Web設計:HTML5CSS3實戰 第2版 (本·弗萊恩) 中文pdf完整版

教程 理解 第2章 web設計 掌握 不可 css3過渡 div and 本書將當前Web 設計中熱門的響應式設計技術與HTML5 和CSS3 結合起來,為讀者全面深入地講解了針對各種屏幕大小設計和開發現代網站的各種技術。書中不僅討論了媒體查詢、彈性布局、響應式圖片,更

響應布局想法實現

收藏 後退 append pre complete 一個 reat time rec 看過這篇文章,寫的挺全面, 從幾個方面分析響應式寫法優劣,先收藏: http://caibaojian.com/web-app-rem.html 最終方案: //designWidt

[譯]Flutter響應程式設計:StreamsBLoC

想看原文請出門右轉原文傳送門 版本所有,轉載請註明出處。本文主要介紹Streams,Bloc和Reactive Programming(響應式程式設計)的概念。 理論和實踐範例。 難度:中級 介紹 我花了很長時間才找到介紹Reactive Programming,B

淺談移動端的自適應問題——響應、rem/em、利用Js動態實現移動端自適應

隨著3G的普及,越來越多的人使用手機上網。移動裝置正超過桌面裝置,成為訪問網際網路的最常見終端。於是,網頁設計師不得不面對一個難題:如何才能在不同大小的裝置上呈現同樣的網頁?本篇文章將講述自適應網頁設計的概念和方法,使網頁開發人員維護同一個網頁程式碼,即可使網站在多種裝置上具

響應佈局設計指南教程(1)--響應時代的設計歷程

如果你還沒有接觸過響應式佈局,你得先明白響應式佈局和之前用的佈局方式稍稍有些不同,因為響應式佈局的目的是為了使網頁適應不同裝置,你需要一段時間的學習來最終實現一個響應式佈局的網頁。 我想展示一些舊的設計流程帶來的問題,在此基礎上引入一些新的方法和工具,在這個過程中,你將在學

響應Web設計——HTML5CSS3實戰》——知識點整理總結(持更~)

1.HTML5、CSS3及響應式入門 1.1 什麼是響應式 如果要用一句話概括,那麼響應式網頁是針對人以裝置對網頁內容進行完美佈局的一種顯示機制。相反,如果需要根據不同裝置提供特定的內容和功能,那就需要一個真正的“手機版”網站。這種情況下,手機版網站會提供與

[譯]Flutter 響應程式設計:Steams BLoC 實踐範例

原文:Reactive Programming - Streams - BLoC - Practical Use Cases 是作者 Didier Boelens 為 Reactive Programming - Streams - BLoC 寫的後續 閱讀本文前建議先閱讀前篇,前篇中文翻譯有兩個版

loadrunner 壓力測試 平均響應時間20秒 100使用者併發 jquery.easyui.min.js jquery.js佔用時間最長

loadrunner 壓力測試 平均響應時間20秒  100使用者併發 jquery.easyui.min.js 和jquery.js佔用時間最長 很無奈。jquery.easyui.min.js和jquery.js 都是原始的。這個速度還說慢,沒有辦法,優化吧。 把

讀《響應 Web 設計 HTML5 CSS3 實戰》

書的內容一般,沒有帶來驚喜。快速讀完。一,響應式設計入門固定寬度(960 畫素)響應式網頁設計 RWD Responsive Web Design(整合:彈性網格佈局,彈性圖片,媒體和媒體查詢)HTML

Angular JS node.js

ret prot 通過 開發 webdriver 下載工具 registry 配置 命令行 首先安裝node.js 。網址:https://nodejs.org/en/ 然後從GitHub上拉取angular-phonecat代碼 。網址:https://github.co

MUI之圖片預覽(zoom.jspreviewimage.js

line fill dex size posit fixed slide col auto 1 <style type="text/css"> 2 .mui-preview-image.mui-fullscreen { 3

pdf .jstableexport.js使用時遇到的2問題。

js使用 app net quest ons supports 配置 -c val pdf .js 問題一:報錯 network.js:71 The provided value ‘moz-chunked-arraybuffer‘ is not a valid enum v

JS檔案的**.js**.min.js的區別,以及js函式執行的順序

①**.js和**.min.js的區別 引用 Q: .js和.min.js檔案分別是什麼? A: .js是JavaScript 原始碼檔案, .min.js是壓縮版的js檔案。 Q:為什麼要壓縮為.min.js檔案? 減小體積 .min.js檔案經過壓縮,相對編譯前的js檔案體積較小

angular.jsvue.js中實現函數去抖(debounce)

搜索輸入框 sea class 方案 get clas 電路 dia ive 問題描述 搜索輸入框中,只當用戶停止輸入後,才進行後續的操作,比如發起Http請求等。 學過電子電路的同學應該知道按鍵防抖。原理是一樣的:就是說當調用動作n毫秒後,才會執行該動作,若在這n毫秒內又

登入介面記住密碼之jquery.cookie.jsmd5.js

  最近做了個登入介面,要實現記住密碼效果,然而看似很簡單,做起來略複雜。我就在不斷改進中,有如下成果,如果可以優化,或有什麼問題,可以評論留言。     首先,需下載jquery.cookie.js,和md5.js。    介紹一下這兩個j

如何在vscode裡面除錯jsnode.js

一般大家除錯都是在瀏覽器端除錯js的,不過有些時候也想和後臺一樣在程式碼工具裡面除錯js或者node.js,下面介紹下怎樣在vscode裡面走斷點。 1,用來除錯js 一:在左側擴充套件中搜索Debugger for Chrome並點選安裝:    二:在自己的html工程目錄下面點選f

關於view.jsService.js程式碼分析

關於require.js中的require和define的問題 基礎知識:http://www.runoob.com/w3cnote/requirejs-tutorial-1.html 關於baseURL配置:https://www.cnblogs.com/lcngu/p/5712098

node.jsvue.js安裝配置

安裝配置node.js1.      官網下載node.js相關安裝包2.      配置環境變數(為nodejs安裝目錄)3.      新建兩個資料夾:node_cache和node_global4.      命令列輸入:npm config set prefix"D: