ie兼容響應式布局的實現總結 和 針對ie瀏覽器的CSS

參考鏈接:http://zhidao.baidu.com/link?url=bQioDKMnG_eQoE6dCxzd2hPtMyiB7phu6hBdOupn1Pjk1hV-ItXFZS5GDUBoH5qrfi9LXkUoSciXTiGN36G6LK

參考鏈接:http://blog.sina.com.cn/s/blog_601b97ee0101aszo.html


ie瀏覽器hack
.demo {padding:10px;padding:9px\9; /* all ie */padding:8px\0; /* ie8-9 目前應用于IE8的單獨hack,情況比較少 */*padding:5px; /* ie6-7 */+padding:7px; /* ie7 */_padding:6px; /* ie6 */
}這是所有ie的hack了,360用的ie內核,跟本機的ie有關系


雖然說響應式設計的理想狀態是,需對pc/移動各種終端進行響應;但是現實是高分辨率的pc端與手機終端屏幕相差太大,像電商這樣有大量圖片和文字信息的同時排版要求精準的頁面,設計一個同時適應高分辨率pc又適合小尺寸的手機終端是挑戰;同時高分辨率下pc頁面信息量巨大,對于手機端用戶是否需要,也許會造成帶寬浪費;再者手機終端和pc終端的用戶操作習慣也相差甚大,這種多圖多信息量要求精準的頁面,設計出來恐怕會是2個完全不同的版本,也許各自維護更方便。由于業務形態原因,隨著用戶分辨率的提高,1024×768已不再是主流,寬屏用戶比例越來越大,因此我們的響應式考慮如何充分利用PC用戶設備上更多空間而設計。下圖為淘寶用戶的屏幕分辨率和瀏覽器比例,鑒于ie8-瀏覽器目前占比約70%,mediaquery的ie8-兼容迫于現實還是要做,淚……

media query簡介

miediaquery有2種引入方式:

1.link標簽方式

<link "stylesheet" type="text/css"media="screen" href="sans-serif.css">
<link "stylesheet" type="text/css"media="print" href="serif.css">

2.css方式

@mediascreen {* { font-family: sans-serif }
}

媒體類型有很多種:‘aural’, ‘braille’, ‘handheld’, ‘print’, ‘projection’,‘screen’, ‘tty’, ‘tv’、‘embossed’、‘speech’、’3d-glasses’,但最常用的是screen和print,對于前端們來講最常用的應該只有screen了。應用于所有媒體類型可以用all,省略不寫默認就是all。media query支持很多表達式,常用的如下,完整的查看這里:

@mediaall and (min-width: 400px) and (max-width: 700px) {}
@mediaall and (orientation: portrait) {   }
@mediaand (min-device-width: 800px) { }

利用media query可以輕松實現不同屏幕寬度時切換不同的頁面布局,但是很不幸ie8及以下都還不支持mediaquery,于是開始了下面的media query兼容之旅……

目前實現media query ie兼容的庫比較成熟的有respond.js和css3-mediaqueries-js;它們各有優劣,respond.js 壓縮后1k,只實現了mediaquery中最常用的min-widthmax-width的兼容;css3-mediaqueries-js基本實現了所有css3規范中的mediaquery特性的兼容,所以導致壓縮有16k,測試反饋其性能遠低于respond.js;不過確實一淘首頁2次響應式設計均只需用到max-width和min-width,Modernizr 和 H5BP也均推薦使用respond.js,下面具體看看它們的實現吧

respond.js源碼分析

使用方式

官方demo地址:http://scottjehl.github.com/Respond/test/test.html

1.在css中正常用 min/max-width media queries
????@mediascreen and (min-width: 480px){
????????...stylesfor 480pxand up go here
????}
2.引入respond.min.js,但要在css的后面(越早引入越好,在ie下面看到頁面閃屏的概率就越低,因為最初css會先渲染出來,如果respond.js加載得很后面,這時重新根據mediaquery解析出來的css會再改變一次頁面的布局等,所以看起來有閃屏的現象)

實現思路

  • 1.把head中所有的css路徑取出來放入數組
  • 2.然后遍歷數組一個個發ajax請求
  • 3.ajax回調后僅分析response中的mediaquery的min-width和max-width語法,分析出viewport變化區間對應相應的css塊
  • 4.頁面初始化時和window.resize時,根據當前viewport使用相應的css塊。
window.matchMedia = window.matchMedia ||(function(doc, undefined){var bool,docElem = doc.documentElement,refNode = docElem.firstElementChild || docElem.firstChild,//fakeBody required forfakeBody= doc.createElement_x('body'),div     = doc.createElement_x('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);
//檢測是否支持mediaquery,檢測css是否有效的方法都差不多,創建一個元素應用該css后檢測元素寬度,然后清除該元素。
<pre name="code" class="css">.......
if( !!href &&isCSS && !parsedSheets[ href ] ){//selectivizr exposes css through the rawCssText expandoif(sheet.styleSheet &&sheet.styleSheet.rawCssText) {//sheet.styleSheet.rawCssText看不懂,原來是方便selectivizr和respond.js聯用,http://selectivizr.com/tests/respond///selectivizr的作用是CSS3 selectors forIE;約定將原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-widthmin-width的邏輯了;可以看出這里必須依賴ajax請求css路徑才能得到css文件中的mediaquery的內容,那ajax的跨域問題就要解決了;由于我們的靜態資源都是要放cdn的,respond.js也給出了跨域方法,即引入代理頁面。

//把cross-domain/respond-proxy.html放到cdn上
//把cross-domain/respond.proxy.gif放到當前域服務器上
"http://externalcdn.com/respond-proxy.html"id="respond-proxy" rel="respond-proxy" />"/path/to/respond.proxy.gif" id="respond-redirect" rel="respond-redirect" />"/path/to/respond.proxy.js">

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

function checkFrameName() {varcssText;try{cssText= iframe.contentWindow.name;varnow = new Date().getTime(),useTime = now - initTime;alert('獲取css耗時:'+useTime + 'ms');}catch(e) { }if(cssText) {……//銷毀之前用于通信的iframe,后續回調callbackcallback(cssText);}else{win.setTimeout(checkFrameName,100);}
}
win.setTimeout(checkFrameName, 500);//500ms后確認內部iframe的name值是否傳遞過來,后續再更新當前viewport該用的css。

因為實現跨域代理的問題,初始化頁面時應用上全部css耗時較長,以下光測試從開始執行該js文件到css取回調用之前的耗時為500ms-515ms之間(每次刷新結果不一樣).

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

同時因為是ajax請求css,所以會因為響應式而額外產生一個請求,好在之前css請求過一遍,這次ajax請求是讀取瀏覽器緩存中的.


respond.js總結

  • 優點:壓縮后僅1k,不跨域時性能ok,只需引入respond.js通用易用
  • 缺點:僅支持mediaquery的min-width和max-width(用于響應式夠用);支持跨域,雖然配置有點麻煩,實現跨域代價高而且有閃屏體驗欠佳。

css3-mediaqueries-js源碼分析

css3-mediaqueries-js官方文檔和demo都沒有,相對于respond.jscss3-mediaqueries-js支持幾乎所有的media query的語法,訪問測試demo

實現邏輯

其實現邏輯和respond.js差不多,只是更加支持的mediaquery更加全面,同時支持內聯style,支持各種寬度單位(em|ex|px|in|cm|mm|pt|pc),但是這里的初始化是在domready后執行,為了讓用戶感覺不出頁面有閃屏(之前應用初始化樣式然后js提取mediaquery中的樣式再覆蓋一遍)現象,這里的實現是先將html移出可視區域外,等解析完mediaquery后再重置回來,但實際目測感覺稍有閃屏(當然這里的測試是測試body背景色,移出可視區域外不管用,當然絕大部分響應式場景是適用的),實現如下:

//prevent jumping of layout by hiding everything beforepainting 先將html移出可視區域外
var docEl =document.documentElement;docEl.style.marginLeft= '-32767px';//make sure it comes back after a while 異常處理,萬一獲取mediaquerycss失敗,重置回來
setTimeout(function (){docEl.style.marginTop = '';
},20000);……// return visibility after media queries are tested生效后重新可見
cssHelper.addListener('cssMediaQueriesTested', function() {//force repaint in IE by changing widthif(ua.ie) {docEl.style.width= '1px';}setTimeout(function() {docEl.style.width= ''; // undowidthdocEl.style.marginLeft= ''; // undohidevarnow = new Date().getTime();varuseTime = now - initTime;alert('mediaquery生效時間:'+useTime+'ms');},0);//remove this listener to prevent following executioncssHelper.removeListener('cssMediaQueriesTested',arguments.callee);
});

其余實現和respond.js基本一致,也需要使用ajax,所以css3-media-queries.js本身不支持跨域,當然非要支持跨域也可以,也可以像respond.js一樣使用代理頁面跨域即可,但也會出現閃屏的現象。還是先看看不跨域情況下,大多數人為什么選擇respond.js,主要原因還是完美支持的mediaquery特性導致壓縮后16K,下載和執行時間都遜于respond.js.

css3-mediaqueries-js總結

  • 優點:1、基本支持所有css3中的media query語法
  • 缺點:1、不支持跨域(如cdn),就算支持了跨域也存在閃屏現象;2、和respond.js對比性能較差

全局切換class

因為css/js需要放到cdn上面,需要跨域,css3-mediaqueries-js不支持跨域,respond.js支持跨域但是實現跨域后性能較差,有閃屏體驗也差,而且配置麻煩,不方便各個業務通用。對比respond.js和css3-mediaqueries-js可知,實現響應式應用min-width和max-width足矣;同時模擬mediaquery的效果只需要在2個關鍵時間點根據viewport切換css(初始化頁面時和window.resize)即可。所以可以選擇切換csslink,可以動態切換css塊,也可以切換class

  • 切換csslink(優點:邏輯清晰;缺點:增加請求數,維護麻煩,如修改一個模塊涉及到3個尺寸的響應,至少需要改3個文件)
"stylesheet" type="text/css"media="screenand (max-width: 990px)" href="respond750.css&uuot;>
stylesheet"type="text/css" media="screen and(max-width: 1200px)"href="respond990.css">

  • 切換內聯css塊(respond.js和css3-mediaqueries-js就是通過js分析出mediaquery然后自動根據當前viewport切換css塊,這個理想環境下是最好的,自動分析只管寫mediaquery,但是依賴ajax獲取css內容,跨域實現成本高體驗也不好)
  • 全局切換class(特別是初始化頁面時最好在頁面內容未開始渲染之前切換class,不然會出現像韓國naver購物頻道在寬屏時刷新效果,刷新時內容由中間向外偏),特定viewport用特殊全局class標記,響應式樣式繼承在該class下,實現大致如下:

實現方式

@mediascreen and (min-width: 990px) {.content{width:990px;color:red;}
}
@mediascreen and (min-width: 1200px) {.content{width:1200px;color:green;}
}
.w990 .content {width: 990px;color: red;
}
.w1200 .content {width: 1200px;color: green;
}
"w990">
"content">content

全局切換class這種方式維護也是個問題,首先是js分散2處,body最上方切換全局class,domready時window.resize時切換class,同時響應式尺寸增加時,需要改變js判斷條件;再看css的維護,mediaquery一份,加全局class一份相同的,維護需要同時修改2次,初期media query幾十行也能接受,但是后來改版mediaquery幾百行,這樣維護成本就大大增加了,全局class和media querycopy相同的代碼引入less解決,使用方法如下:

#channels {.w1200(){.etao-channels{padding:170px 0 0 30px;li{margin-right:25px;}}}.w990(){.etao-channels{padding:25px 0 0 15px;li{margin-right:8px;}}.w750(){.etao-channels{padding:5px 00 5px;li{margin-right:5px;}a{color:#333;}}}
}
/*這樣只需維護上面一處代碼即可*/
#channels > .w1200;
@media (max-width:1119px){#channels> .w990;
}
@media (max-width:989px){#channels> .w750;
}
.w990{#channels> .w990;
}
.w750{#channels> .w750;
}

目前 一淘新首頁采用以上方法維護,支持1200px、990px、750px三個尺寸的響應,不得不承認維護成本還是偏高,歡迎各種改進建議,

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276258.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276258.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276258.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

group by 保留哪一條數據_使用R語言繪制一維數據統計圖總結

加載數據 繪制莖葉圖 繪制直方圖 繪制概率密度曲線 繪制小提琴圖 繪制箱線圖 繪制小提琴圖箱線圖 集中趨勢統計 分散程度 apply的使用加載數據模擬數據下載library(tidyverse) cjb <- read.csv("/home/wy/Downloads/cjb.csv",header TRUE,stringsAsFactors FALS…

npm安裝和Vue運行

一、開始&#xff1a; 下載地址&#xff1a;http://nodejs.cn/download/ 下載安裝&#xff1a; 直到 二、打開CMD,檢查是否正常 在安裝目錄里新增兩個文件夾 然后運行命令&#xff1a;如下圖&#xff1a; npm config set prefix "D:\InstallSoftWare\nodejs\node_global&q…

Scott 32 歲前端年終總結,探尋另一種可能

今年一年都是飛快 這 10 年編程好時光&#xff0c;花費在不經意間&#xff0c;而立的第三年也即將用完&#xff1a;23 到 26 歲&#xff0c;花在了阿里&#xff0c;從入門到職業迷茫&#xff0c;27 到 29 歲&#xff0c;花在了創業&#xff0c;從熱血到倒閉還錢&#xff0c;30 …

跨頁數據傳遞的兩種方式

選擇具有PostBackUrl屬性的三個控件Button、LinkButton、ImageButton。PostBackUrl屬性的值就是投遞的頁面URL。 要在接收頁面按對象的方式接收投遞頁面的表單中的值有兩種方式&#xff1a; 1、PreviousPage.FindControl(“控件變量名”)&#xff0c;這個方法返回的是Control類…

linux批量殺進程_Linux下批量殺JAVA進程

在工作中經常需要停止JAVA進程&#xff0c;停止時間也比較長&#xff0c;那么有時候因為一些情況&#xff0c;需要把 linux 下JAVA所有進程kill 掉&#xff0c;又不能用killall 直接殺掉某一進程名稱包含的所有運行中進程(我們可能只需要殺掉其中的某一類或運行指定參數命令的進…

用jquery1.9版本判斷ie瀏覽器及ie6瀏覽器

參考鏈接&#xff1a;http://www.my0832.com/158182/blog-117887.html jQuery 從 1.9 版開始&#xff0c;移除了 $.browser 和 $.browser.version &#xff0c; 取而代之的是 $.support 。 在更新的 2.0 版本中&#xff0c;將不再支持 IE 6/7/8。 以后&#xff0c;如果用戶需要…

嵌入式操作系統 NuttX 5.0 發布

Nuttx 是一個實時嵌入式操作系統&#xff08;RTOS&#xff09;&#xff0c;它有一個小巧是在微控制器的環境中使用。這是完全可擴展&#xff0c;從小型&#xff08;8位&#xff09;至中型嵌入式&#xff08;32位&#xff09;系統。它的目的還 在于要完全符合標準&#xff0c;完…

Windows下Mysql 的安裝和卸載

2019獨角獸企業重金招聘Python工程師標準>>> 一、安裝 1、下載zip文件 2、解壓&#xff0c;在bin目錄下新建my.ini [mysql] # 設置mysql客戶端默認字符集 default-character-setutf8 [mysqld] # 設置3306端口 port3306 # 設置mysql的安裝目錄 basedirC:\Program Fil…

現在學前端還來得及嗎?總聽人說飽和了

“前端已經飽和了&#xff0c;現在學前端沒有前途了”每次聽到這種論調我都氣不打一處來。自己技藝不精&#xff0c;然后就說市場飽和了。是&#xff0c;現在的確不是那個會切個圖&#xff0c;懂點htmlCSS就能找到工作的年代了。現在對前端的技術要求稍微高了點&#xff0c;但這…

jquery網頁刷新后控件失效_jquery動態增減控件如何才能不刷新頁面

已結貼√問題點數&#xff1a;20 回復次數&#xff1a;9jquery動態增減控件如何才能不刷新頁面用jquery動態管理控件&#xff0c;可是每一次增減控件都會刷新頁面&#xff0c;然后控件里面原來輸入的值就都不在了&#xff0c;可以怎么來實現在動態增減控件時不刷新頁面呢&#…

HTML代碼 網頁設置 QQ空間等分享

轉載鏈接&#xff1a;http://zhidao.baidu.com/link?urlgpehGR7eSSyilECgVIOuZnDycBUjKABR2VubZAUSRD89qQrNhlCBxHuIUq9mQmvGaQy2RUSw1gAx614JlroXFK 右邊&#xff1a; <!-- Baidu Button BEGIN --> <script type"text/javascript" id"bdshare_js&qu…

固定資產減值準備與累計折舊會計核算的關系

轉載http://hi.baidu.com/ddumy/blog/item/d96b361901776e7ddab4bdd6.html固定資產減值準備與累計折舊會計核算的關系【摘 要】 固定資產減值準備與累計折舊是固定資產核算的重要組成部分&#xff0c;又都是“固定資產”的備抵項目&#xff0c;它們共同反映著固定資產的現時價值…

DotNetNuke 5 C#版本解讀之2--HTTP Modules

在前面文章里說明了DNN的架構&#xff0c;下面這個圖應該說是更加能夠全面的讓你去了解它的結構&#xff1a; 如果你是個asp.net新手建議你看看前面這部分&#xff0c;因為它會向你介紹什么是http module,以及其他的一些概念。我想通過你讀這篇文章來明白asp.net的機制&#xf…

用框架的你,可能早已忽略了這些事件API

DOMContentLoaded&#xff0c;load&#xff0c;beforeunload&#xff0c;unloadHTML 頁面的生命周期包含三個重要事件&#xff1a;DOMContentLoaded —— 瀏覽器已完全加載 HTML&#xff0c;并構建了 DOM 樹&#xff0c;但像 <img> 和樣式表之類的外部資源可能尚未加載完…

調用接口登錄禪道_有java調用api登錄并驗證禪道的實例嗎

展開全部本文實例為大家分享了32313133353236313431303231363533e78988e69d8331333363396466JAVA的短信驗證碼api調用代碼&#xff0c;供大家參考&#xff0c;具體內容如下import java.io.BufferedReader;import java.io.DataOutputStream;import java.io.IOException;import j…

[Docker]Docker快速上手學習筆記

0. 學習的一些疑問 如何熱更新鏡像(images)&#xff1f;&#xff08;你可以快速啟動或者銷毀容器。這種時間幾乎是實時的&#xff09;如何熱更新游戲服&#xff1f;好處在于各個應用之間環境相互獨立&#xff0c;即使某一個容器崩潰也不會影響到其它容器&#xff1b;每個容器使…

原來 Clipboard 還能復制圖像?原理是什么

在寫了 這個 29.7 K 的剪貼板 JS 庫有點東西&#xff01; 這篇文章之后&#xff0c;收到了小伙伴提的兩個問題&#xff1a;1.clipboard.js 這個庫除了復制文字之外&#xff0c;能復制圖像么&#xff1f;2.clipboard.js 這個庫依賴的 document.execCommand API 已被廢棄了&…

計算機大數據的前景方向_計算機方向,網絡與信息安全和大數據哪個前景好一點?...

大數據是我目前的研究方向之一&#xff0c;我也曾經做過網絡安全相關的項目&#xff0c;主要涉及的是各種網絡環境下數據傳輸的安全處理方案。另外&#xff0c;我曾經給高校的學生做過網絡安全的系列講座&#xff0c;系統地整理過網絡安全的相關內容&#xff0c;所以我來談一談…

Smarty 顯示大括號 | 在Smarty中計算數組元素的長度 | Smarty字符串拼接

參考鏈接&#xff1a;http://hi.baidu.com/bdusnb/item/289d160e6a9c92cd9157183d 參考鏈接&#xff1a;http://hi.baidu.com/mayimu789/item/b565088d047da0d05f0ec16f 參考鏈接&#xff1a;http://blog.sina.com.cn/s/blog_8155e74d0101el2k.html Smarty 3 &#xff1a;大…

ftp協議分析(一)

作者: 肖建彬 | 可以轉載, 轉載時務必以超鏈接形式標明文章原始出處和作者信息及版權聲明網址&#xff1a;http://www.xiaojb.com/archives/it/ftp.shtml根據是使用port模式還是passive模式&#xff0c;ftp使用不同的tcp端口號&#xff0c;在詳細描述ftp前&#xff0c;我們來簡…