一個100x100,單位px的div在蘋果6和蘋果6p上的大小同樣嗎?css
單位像素是相對單位html
在一樣一個設備上,每1個CSS像素所表明的物理像素是能夠變化的(即CSS像素的第一方面的相對性);web
在不一樣的設備之間,每1個CSS像素所表明的物理像素是能夠變化的(即CSS像素的第二方面的相對性);安全
隨着蘋果發佈更多尺寸的大屏手機,加上Android生態中紛繁複雜的各類奇葩尺寸,移動設計全面進入「雜屏」時代。bash
沒有別的緣由,iphone6 只是中型手機的一個表明,從中間尺寸向上和向下適配的時候界面調整的幅度最小。app
var dc = document.documentElement;
var mt = document.createElement("meta");
mt.name = "viewport";
mt.content = "width=device-width,initial-scale=1.0,maximum-scale=1.0, minimum-scale=1.0,user-scalable=no";
dc.firstElementChild.appendChild(mt);
var autoSizie = function () {
var dw = dc.clientWidth;
var dpr = Math.min(window.devicePixelRatio, 3);
//dw / dpr > 750 && (dw = 750 * dpr);
window.remScale = dw / 750;
dc.style.fontSize = 200 * (dw / 750) + "px";
dc.dataset.dpr = dpr;
};
autoSizie();
window.addEventListener('resize', autoSizie, false);
複製代碼
幀動畫在部分機型上抖動問題dom
解決方案:iphone
1.原始尺寸作動畫,再用transform:scale()作縮放處理
2.採用svg替代方案,推薦方案svg
div {
width: 10vw;
height: 10vw;
font-size: .12vw;
}
複製代碼
這樣的頁面雖然看起來適配得很好,可是你會發現因爲它是利用視口單位實現的佈局,依賴於視口大小而自動縮放,不管視口過大仍是太小,它也隨着視口過大或者太小,失去了最大最小寬度的限制函數
解決方案:結合rem單位來實現佈局
1.給根元素大小設置隨着視口變化而變化的 vw 單位,這樣就能夠實現動態改變其大小。
2.限制根元素字體大小的最大最小值,配合 body 加上最大寬度和最小寬度
對屏幕 resize 事件進行監聽,當判斷爲豎屏時將整個根容器進行逆時針 CSS3 旋轉 90 度
var detectOrient = function() {
var width = document.documentElement.clientWidth,
height = document.documentElement.clientHeight,
$wrapper = document.getElementById("J_wrapper"),
style = "";
if( width >= height ){ // 橫屏
style += "width:" + width + "px;"; // 注意旋轉後的寬高切換
style += "height:" + height + "px;";
style += "-webkit-transform: rotate(0); transform: rotate(0);";
style += "-webkit-transform-origin: 0 0;";
style += "transform-origin: 0 0;";
}
else{ // 豎屏
style += "width:" + height + "px;";
style += "height:" + width + "px;";
style += "-webkit-transform: rotate(90deg); transform: rotate(90deg);";
// 注意旋轉中點的處理
style += "-webkit-transform-origin: " + width / 2 + "px " + width / 2 + "px;";
style += "transform-origin: " + width / 2 + "px " + width / 2 + "px;";
}
$wrapper.style.cssText = style;
}
window.onresize = detectOrient;
detectOrient();
複製代碼
解決橫屏的dom適配問題
$vw_base: 375;
$vw_fontsize: 20;
html {
font-size: 20px; //不支持vw單位時,回退到px單位
font-size: ($vw_fontsize / $vw_base) * 100vw;
}
@media screen and (orientation: landscape) {
html {
font-size: 20px;
font-size: ($vw_fontsize / $vw_base) * 100vh;
}
}
複製代碼
viewport-fit
iOS11 新增特性,蘋果公司爲了適配 iPhoneX 對現有 viewport meta 標籤的一個擴展,用於設置網頁在可視窗口的佈局方式,可設置三個值:
env() 和 constant()
iOS11 新增特性,Webkit 的一個 CSS 函數,用於設定安全區域與邊界的距離,有四個預約義的變量:
// 須要適配 iPhoneX 必須設置 viewport-fit=cover,這是適配的關鍵步驟。
<meta name="viewport" content="width=device-width, viewport-fit=cover">
// 根據狀況設置padding或者margin
padding-bottom: constant(safe-area-inset-bottom); /* 兼容 iOS < 11.2 */
padding-bottom: env(safe-area-inset-bottom); /* 兼容 iOS >= 11.2 */
複製代碼
關於移動端適配,就說這麼多了。 路漫漫其修遠兮,吾將上下而求索···