問題1.retina下圖片的高清的問題css
解決:兩倍圖片html
舉例:200*300 css pixel 的img標籤,要提供 400*600 的圖片。 -- 這樣位圖像素點的個數就是原來的四倍,在retina下,位圖像素點個數就能夠跟物理像素點個數造成 1:1的比例。app
缺點:1)普通屏幕下,一樣下載了2倍大小的圖片 2)因爲downsampling 會失去銳利度函數
完美解決辦法: 不一樣的dpr下,加載不一樣尺寸的圖片,(經過css媒體查詢,js判斷均可以)佈局
準備兩套圖片經過url參數控制圖片的質量。字體
示例:url
如,這樣一張原圖:spa
https://img.alicdn.com/tps/TB1AGMmIpXXXXafXpXXXXXXXXXX.jpg // 原圖
能夠相似這樣,進行圖片裁剪:
// 200×200scala
https://img.alicdn.com/tps/TB1AGMmIpXXXXafXpXXXXXXXXXX.jpg_200x200.jpg
// 100×100code
https://img.alicdn.com/tps/TB1AGMmIpXXXXafXpXXXXXXXXXX.jpg_100x100.jpg
(ps: 固然裁剪只是對原圖的等比裁剪,得保證圖片的清晰嘛~)
問題2 reatina下 border:1px的問題
解決:頁面的scale的方案,對於dpr = 2的retian屏幕,
<meta name="viewport" content="width=640,initial-scale=0.5,maximum-scale=0.5, minimum-scale=0.5,user-scalable=no">
這樣將頁面中全部的 border:1px 都縮小0.5,從而達到了border:0.5px 的效果
缺點:1.字體的大小 和頁面的元素會被縮放???
問題3 多屏適配佈局問題
解決:rem 概念略
示例:rem = document.documentElement.clientWidth * dpr / 10
具體:1.經過css 媒體查詢的方案 -- 不夠精確,具體略
2.js計算
var dpr, rem, scale; var docEl = document.documentElement; var fontEl = document.createElement('style'); var metaEl = document.querySelector('meta[name="viewport"]'); scale = 1 / dpr; dpr = win.devicePixelRatio || 1; rem = docEl.clientWidth * dpr / 10; // 設置viewport,進行縮放,達到高清效果 metaEl.setAttribute('content', 'width=' + dpr * docEl.clientWidth + ',initial-scale=' + scale + ',maximum-scale=' + scale + ', minimum-scale=' + scale + ',user-scalable=no'); // 設置data-dpr屬性,留做的css hack之用 docEl.setAttribute('data-dpr', dpr); // 動態寫入樣式 docEl.firstElementChild.appendChild(fontEl); fontEl.innerHTML = 'html{font-size:' + rem + 'px!important;}'; // 給js調用的,某一dpr下rem和px之間的轉換函數 window.rem2px = function(v) { v = parseFloat(v); return v * rem; }; window.px2rem: function(v) { v = parseFloat(v); return v / rem; }; window.dpr = dpr; window.rem = rem;
優勢:
1.解決了border:1px問題,2.解決了圖片高清問題, 3. 屏幕