摘要:一思考在移動端越來越重要的背景下,每位開發者對移動適配都有自己的想法。這個和移動端的設計體驗方式是比較像的。對移動端的特殊性進行適配,如問題,默認樣式等。
一、思考
在移動端越來越重要的背景下,每位web開發者對移動適配都有自己的想法。是移動優先,還是PC優先,還是兩者兼得?在實際開發中這個問題是和項目產品定位有關的,也涉及到UI的設計,不是開發者能決定。但不管產品如何定位,作為開發者總是要提供最優的解決方案,是用一套樣式還是多套樣式?網上一搜,有靜態布局、流式布局,響應式布局,自適應布局,彈性布局等一堆,云里霧里,到底要怎么選呢?看完這篇文章相信心中就有數了。
二、viewport的使用
1、最常見的設置,大多數的框架(如bootstrap)和知名的站點基本是這個配置
2、這個配置重點在width=device-width,就是讓視窗口等于設配寬度,也就是我們開發中能用document的寬度,其它幾個“初始縮放大小”“最大縮放大小”“最小縮放大小”和“是否允許用戶縮放”可以理解為用來“固定”這個設置不被破壞的。
3、這個設置很簡單,但同時也會帶來一些需要解決的問題。
a、現在的手機都是兩倍三倍的Retina高清屏,1px實際的效果是不止一個像素的,對不同的設備設置不同
的initial-scale可以有比較好的效果,比如在2倍Retina的iphone6(6s,7,8)中設置為0.5。一旦
動態設置這個,也就意味這視窗口不同了,需要不同樣式適配。這也是分配樣式的一套基準,如何分配樣式
后面會有更詳細的講解。
b、在PC端如果有最小寬度的限制,同樣需要配置不同的width值。
三、單位的使用
1、css中單位很多,這里只介紹最常用的幾種:
(1) px:這個可以理解為“基準”單位,就是不管在什么設備中其值是不會變的,就像cm,kg這些一樣
(2) em:這個是相對父容器的單位,一般用在字體font-size中比較好。如父容器font-size為16px,則
1em=16px
(3) rem:相對于根元素html的單位,如html的font-size為16px,則1rem=16px
(4) vw/vh: 視口寬高為100vw/100vh,這個和百分比類似,只是百分比是相對于父容器,其相對于視口
2、移動適配最常用的應該是rem,很多框架和淘寶的flexible適配都是基于這個單位,而自己做的話,一般
在首頁加載時全局js設置html的font-size即可,代碼如下:
(function (doc, win) { var docEl = doc.documentElement, resizeEvt = "orientationchange" in window ? "orientationchange" : "resize", recalc = function () { var clientWidth = docEl.clientWidth; if (!clientWidth) return; //這里根據設計稿為750,設置1rem=100px, docEl.style.fontSize = 100 * (clientWidth / 375) + "px"; }; // Abort if browser does not support addEventListener if (!doc.addEventListener) return; win.addEventListener(resizeEvt, recalc, false); doc.addEventListener("DOMContentLoaded", recalc, false); })(document, window);
3.如果用了sass/less等預編譯語言可以更靈活的配置的,在上面方法內配置(設計稿為750的情況下):
docEl.style.fontSize = 40 * (clientWidth / 750) + "px";
在編譯函數中配置:
@function px2rem($px, $base-font-size: 20px) {
@return ($px / $base-font-size) * 1rem; }
這樣我們就可以直接使用設計稿的尺寸,如:px2rem(100px),省去了自己計算,如果沒用預編譯語言(推
薦使用),編輯器也有插件支持單位轉化。
4.上面是基于屏幕寬度來設置根元素font-size,如果設置不同的initial-scale,我們需要基于設備像素比設置,通過window.devicePixelRatio獲取。
四、頁面布局方式
1.理解html的文檔流方式,其實就是流式布局,即橫向需要我們設置,縱向自動疊加。這個和移動端的設計體驗方式是比較像的。在寬度中就要用自適應的方式,如百分比,有設置相對單位的,可用相對單位,靈活使用,css3的display:flex也是很好的選擇,現代瀏覽器和移動設備基本都支持了。
2.剛才說到體驗,很明顯移動端和pc端的體驗真的很不同,所以光有上面的自適應是遠遠不夠,是不是需要對這兩個完全不同的體驗方式響應不同的布局和樣式。
五、媒體查詢
1.我們除了可以用js來判斷不同的設備,設置相對單位所用的根元素。另一個強大的方式是可以通過css3強大的媒體查詢來指定不同的樣式。
2.媒體查詢的規則
@media all and ([min-width|max-width|orientation|min-device-width|...]) { ... }
中括號[]中表示需要添加的條件,可匹配寬高/橫豎屏/設備類型等,比如min-width:750px,表示最小寬度為750px,{}是在匹配模式下的樣式。也有邏輯判斷and/or/not連接不同的規則
3.要是引入整個文件,可以在link標簽中使用
表示:當屏幕大于或等于900px時,將采用big.css樣式來渲染Web頁面。
4.Bootstrap響應式設計這類柵格布局采用的就是這套方式。
六、1px像素邊框問題
1.除了上面說到在viewport中設置縮放外,直接設置一個空元素縮放也是可以的
p{ width: 100px; height: 1px; background: red; display: block; transform: scaleY(.5); }
不足:圓角無法實現,實現4條邊框比較麻煩,并且只能多帶帶實現,如果嵌套,會對包含的效果產生不想要的效果,所以此方案配合:after和before獨立使用較多
2.利用CSS對陰影處理的方式實現0.5px的效果
box-shadow:0 1px 1px -1px rgba(0, 0, 0, 0.5);
不足:顏色不好處理, 黑色 rgba(0,0,0,1) 最深的情況了。有陰影出現,不好用大量使用box-shadow可能會導致性能瓶頸。四條邊框實現效果不理想。
3.圖片實現,使用 background-image 實現1px有兩種方式: 漸變 linear-gradient 或直接使用圖片(base64)。漸變 linear-gradient (50%有顏色,50%透明)
div{ height: 1px; background-image:-webkit-linear-gradient(top,transparent 50%,#000 50%); background-position: top left; background-repeat: no-repeat; background-size: 100% 1px; }
不足:大量使用漸變可能導致性能瓶頸,代碼量大,多背景圖片有兼容性問題
七、圖片高清化
1.可以使用srcset屬性設置,使用看https://www.zhangxinxu.com/wo...
2.背景圖高清
a.使用上面介紹的媒體查詢,如:
/* 普通顯示屏(設備像素比例小于等于1)使用1倍的圖 */ .css{ background-image: url(img_1x.png); } /* 高清顯示屏(設備像素比例大于等于2)使用2倍圖 */ @media only screen and (-webkit-min-device-pixel-ratio:2){ .css{ background-image: url(img_2x.png); } } /* 高清顯示屏(設備像素比例大于等于3)使用3倍圖 */ @media only screen and (-webkit-min-device-pixel-ratio:3){ .css{ background-image: url(img_3x.png); } }
b.image-set 實現高清化
.css { background-image: url(1x.png); /*不支持image-set的情況下顯示*/ background: -webkit-image-set( url(1x.png) 1x,/* 支持image-set的瀏覽器的[普通屏幕]下 */ url(2x.png) 2x,/* 支持image-set的瀏覽器的[2倍Retina屏幕] */ url(3x.png) 3x/* 支持image-set的瀏覽器的[3倍Retina屏幕] */ ); }
c.很多網頁端對圖片的要求還是沒那么高的,不像app那樣,圖片一般用一張2倍高清圖就行,最新的設備對以上屬性的支持還是可以的,對于要求高的應用使用
八、移動端click屏幕產生300ms的延時響應
1.原因:在瀏覽器需要如何判斷快速點擊上,當用戶在屏幕上單擊某一個元素時候,例如跳轉鏈接,此處瀏覽器會先捕獲該次單擊,但瀏覽器不能決定用戶是單純要點擊鏈接還是要雙擊該部分區域進行縮放操作,所以,捕獲第一次單擊后,瀏覽器會先Hold一段時間t,如果在t時間區間里用戶未進行下一次點擊,則瀏覽器會做單擊跳轉鏈接的處理,如果t時間里用戶進行了第二次單擊操作,則瀏覽器會禁止跳轉,轉而進行對該部分區域頁面的縮放操作。那么這個時間區間t有多少呢?在IOS safari下,大概為300毫秒。這就是延遲的由來。造成的后果用戶純粹單擊頁面,頁面需要過一段時間才響應,給用戶慢體驗感覺,對于web開發者來說是,頁面js捕獲click事件的回調函數處理,需要300ms后才生效,也就間接導致影響其他業務邏輯的處理。
2.解決方案:
(1)使用fastclick.js,只要全局加入該文件并設置如下:
FastClick.attach(document.body);
(2) zepto的touch模塊,tap事件也是為了解決在click的延遲問題
九、更改默認樣式
//使用appearance改變webkit瀏覽器的默認外觀 input,select { -webkit-appearance:none; appearance: none; } //winphone下,使用偽元素改變表單元素默認外觀 //1.禁用select默認箭頭,::-ms-expand修改表單控件下拉箭頭,設置隱藏并使用背景圖片來修飾 select::-ms-expand { display:none; } //2.禁用radio和checkbox默認樣式,::-ms-check修改表單復選框或單選框默認圖標,設置隱藏并使用背景圖片來修飾 input[type=radio]::-ms-check, input[type=checkbox]::-ms-check { display:none; } //3.禁用pc端表單輸入框默認清除按鈕,::-ms-clear修改清除按鈕,設置隱藏并使用背景圖片來修飾 input[type=text]::-ms-clear, input[type=tel]::-ms-clear, input[type=number]::-ms-clear { display:none; } // 禁止長按鏈接與圖片彈出菜單 a,img { -webkit-touch-callout: none } // 禁止ios和android用戶選中文字 html,body {-webkit-user-select:none; user-select: none; } // 改變輸入框placeholder的顏色值 ::-webkit-input-placeholder { /* WebKit browsers */ color: #999; } :-moz-placeholder { /* Mozilla Firefox 4 to 18 */ color: #999; } ::-moz-placeholder { /* Mozilla Firefox 19+ */ color: #999; } :-ms-input-placeholder { /* Internet Explorer 10+ */ color: #999; } input:focus::-webkit-input-placeholder{ color:#999; } // android上去掉語音輸入按鈕 input::-webkit-input-speech-button {display: none}
十、總結
1.網站適配的終端可以用js或媒體查詢的方式獲取,分配對應的樣式。
2.布局上采用相對單位,百分比和flex的彈性方式。
3.對移動端的特殊性進行適配,如1px問題,默認樣式等。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/54084.html
閱讀 3313·2023-04-26 00:58
閱讀 1268·2021-09-22 16:04
閱讀 3311·2021-09-02 15:11
閱讀 1554·2019-08-30 15:55
閱讀 2339·2019-08-30 15:55
閱讀 3248·2019-08-23 18:41
閱讀 3458·2019-08-23 18:18
閱讀 2752·2019-08-23 17:53