1.移動端開發視視窗的新增
h5端開發下面這段話是必須配置的
1 |
meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"> |
其它相關配置內容如下:
- width viewport 寬度(數值/device-width)
- height viewport 高度(數值/device-height)
- initial-scale 初始縮放比例
- maximum-scale 最大縮放比例
- minimum-scale 最小縮放比例
- user-scalable 是否允許使用者縮放(yes/no)
- minimal-ui iOS 7.1 beta 2 中新增屬性(注意:iOS8 中已經刪除),可以在頁面載入時最小化上下狀態列。
2.媒體查詢的改進
之前在做移動端開發的時候,為了適配多螢幕。使用的是rem
單位。這個時候就需要根據螢幕的尺寸來來動態的設定根節點html
的font-size
值。這樣可以解決多螢幕適配的問題。
比如下面的 媒體查詢程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
html { //iphone5 font-size: 62.5%; } @media (max-width: 414px) { html { //iphone6+ font-size: 80.85%; } } @media (max-width: 375px) { html { //iphone6 font-size: 73.24%; } } |
這樣做的結果,有兩個很明顯的缺點。
- 適配螢幕的尺寸不是連續的。
- 在自己的 css 檔案中新增大段的這樣查詢程式碼。增加了 css 檔案的體積。
後來參考淘寶移動端頁面適配規則,使用 js 獲取客戶端的寬度,根據設計稿的原型動態的計算font-size
的值。
詳細的內容請看這裡 根據iPhone6設計稿動態計算rem值
3.a標籤內容語義化
大多數時候我們都會給一片區域加上點選跳轉的功能。如下圖:
很可能我們商品區域都是使用的div
標籤。很容易我們會給最外層加上一個 a
標籤。因為a
是行內元素,是沒有寬和高的。不能夠把容器撐開。
一種解決辦法就是給a
標籤設定block
屬性。如下:
1 2 3 4 5 6 7 |
<style> a{display:block;} </style> <a> <div></div> </a> |
功能上已經沒有問題。但是在語義化的層面上,上面的程式碼是不標準的。
最好的做法就是做如下的修改,這樣不會使自己的 html 程式碼顯的太突兀:
1 2 3 4 5 6 7 8 9 10 |
<style> a{display:block;} span{dispaly:block;} </style> <a> <span></span> <span></span> <span></span> </a> |
4.為自己的頁面設定最大寬度和最小寬度
如果我們使用的是rem
單位,使用 js
動態計算font-size
值的話,我們可以無限適配最大和最小的終端螢幕。但是當使用者的螢幕超過一定的尺寸以後還繼續顯示h5
頁面的話對使用者會很不友好。
我們參看下京東和淘寶的h5
頁面
我們看到了都是定義了頁面的最大和最小寬度。這樣在螢幕超過一定的尺寸以後可以更友好的展示(當然這不是必須的)。
我給自己的產品頁面定義的最大的寬度和最小寬度分別是:
1 2 3 4 |
{ max-width:640px; min-width:320px; } |
5.去掉 a,input 在移動端瀏覽器中的預設樣式
1.禁止 a 標籤背景
在移動端使用 a
標籤做按鈕的時候,點按會出現一個“暗色”的背景,去掉該背景的方法如下
1 2 3 |
a,button,input,optgroup,select,textarea { -webkit-tap-highlight-color:rgba(0,0,0,0); /*去掉a、input和button點選時的藍色外邊框和灰色半透明背景*/ } |
2.禁止長按 a,img 標籤長按出現選單欄
使用 a
標籤的時候,移動端長按會出現一個 選單欄,這個時候禁止撥出選單欄的方法如下:
1 2 3 |
a, img { -webkit-touch-callout: none; /*禁止長按連結與圖片彈出選單*/ } |
3.流暢滾動
1 2 3 |
body{ -webkit-overflow-scrolling:touch; } |
6.CSS 截斷字串
單行截斷字串,這裡必須指定字串的寬度
1 2 3 4 5 6 7 8 |
{ /*指定字串的寬度*/ width:300px; overflow: hidden; /* 當字串超過規定長度,顯示省略符*/ text-overflow:ellipsis; white-space: nowrap; } |
7.calc 相關問題
之前在做佈局的時候使用calc
出現了很嚴重的線上 BUG。後來就深究了下這個屬性的使用。
calc
好用的地方就是,可以在任何單位之間進行換算。但是瀏覽器支援的不是很好。看一下 can i use 截圖:
而且在使用的時候要加上廠商字首,達到相容性。不過現在不推薦使用,畢竟,瀏覽器支援有限。
示例程式碼:
1 2 3 4 5 6 7 8 9 |
#formbox { width: 130px; /*加廠商字首,操作符(+,-,*,/)兩邊要有空格)*/ width: -moz-calc(100% / 6); width: -webkit-calc(100% / 6); width: calc(100% / 6); border: 1px solid black; padding: 4px; } |
研究過淘寶,天貓,京東的 h5端頁面看到這個單位用的不多,主要還是相容性的問題吧。
8.box-sizing 的使用
解決盒模型在不同瀏覽器中表現不一致的問題。但是仍然會有相容性問題。看最下面的瀏覽器支援列表。
box-sizing 屬性用來改變預設的 CSS 盒模型 對元素高寬的計算方式。這個屬性用於模擬那些非正確支援標準盒模型的瀏覽器的表現。
它有三個屬性值分別是:
content-box
預設值,標準盒模型。 width 與 height 只包括內容的寬和高, 不包括邊框,內邊距,外邊距。注意: 內邊距, 邊框 & 外邊距 都在這個盒子的外部。 比如. 如果 .box {width: 350px}; 而且 {border: 10px solid black;} 那麼在瀏覽器中的渲染的實際寬度將是370px;
padding-box
width 與 height 包括內邊距,不包括邊框與外邊距。
border-box
width 與 height 包括內邊距與邊框,不包括外邊距。這是IE 怪異模式(Quirks mode)使用的 盒模型 。注意:這個時候外邊距和邊框將會包括在盒子中。比如 .box {width: 350px; border: 10px solid black;} 瀏覽器渲染出的寬度將是350px.
瀏覽器支援:
9.水平垂直居中的問題
可以看之前寫定位的一篇文章,末尾有講到各種定位:【從0到1學Web前端】CSS定位問題三(相對定位,絕對定位)
這裡實現一個相對定位和絕對定位配合實現水平垂直居中的樣式。看效果:
html 程式碼如下:
1 2 3 |
<div class="parent-div"> <div class="child-div"></div> </div> |
css程式碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
.parent-div{ width: 100px; height: 100px; background-color:red; position:relative; } .child-div{ width:50px; height:50px; background-color:#000; position: absolute; margin:auto; top:0; left:0; right:0; bottom:0; } |
絕對定位在佈局中可以很方邊的解決很多問題,但是大多數時候都不去使用絕對定位,而是使用浮動等方法。而當需要 DOM 元素脫離當前文件流的時候才使用絕對定位。如: 彈層,懸浮層等。
10. css 中 line-height 的問題
line-height
一個很重要的用途就是讓我們的文字可以在父級元素中垂直居中,但是在使用它的過程中也會遇到一些問題。
先來看一個例項,如下圖:
程式碼也很簡單,就是當我們在div
中定義的字型很大的情況下,我們看到字型和父級元素之間有一些空隙。那麼這是為什麼?
我們查一下 line-height
的定義,如下:
normal
預設。設定合理的行間距。
number
設定數字,此數字會與當前的字型尺寸相乘來設定行間距。
length
設定固定的行間距。
%
基於當前字型尺寸的百分比行間距。
inherit
規定應該從父元素繼承 line-height 屬性的值。
所以在以上的情況我們要想使,我們的字型能夠撐滿我們的容器,就需要給父級容器新增 line-height
屬性且值為 100%
程式碼和效果如下:
那麼為什麼會出現上面的問題呢?
line-height 與 font-size 的計算值之差(行距)分為兩半,分別加到一個文字行內容的頂部和底部。
所以,可以得出下面的一個公式:
空白間距 = line-height – font-size
所以,當設定為line-height
的值為100%
的時候,line-height
的值就等於 font-size
的尺寸,此時的空白間距為0。
11.使用 vertical-align 調整圖示垂直居中
很多時候我們要把圖示和文字配合使用,而且需要圖示和文字都能夠垂直居中。如下圖所示:
如果要實現文字的垂直居中很容易,只需要使用line-height=父容器高度
。但是要想使圖示能夠垂直居中就比較麻煩。
正常情況下我們的文字或者說相鄰的容器,都應該和文字保持在相同的底線上,如下圖:
明顯的可以看到我們的返回圖示不是垂直居中的。那麼應該怎麼樣使圖示垂直居中呢?
首先,我們先來搞清楚幾個線的關係(圖片來源於網路,侵權請告知):
這樣我們就要用到 vertical-align
這個屬性,最重要的一點是:
指定了行內(inline)元素或表格單元格(table-cell)元素的垂直對齊方式
baseline
:將支援valign特性的物件的內容與父級元素基線對齊
sub
:元素基線與父元素的下標基線對齊。
super
:元素基線與父元素的上標基線對齊。
top
: 元素及其後代的頂端與整行的頂端對齊。
text-top
:元素頂端與父元素字型的頂端對齊。
middle
:元素中線與父元素的基線對齊。
bottom
:元素及其後代的底端與整行的底端對齊。
text-bottom
:元素底端與父元素字型的底端對齊。
percentage
:用百分比指定由基線算起的偏移量。可以為負值。基線對於百分數來說就是0%。
length
:用長度值指定由基線算起的偏移量。可以為負值。基線對於數值來說為0。(CSS2)
看下邊的一段 html :
1 2 3 4 5 |
<div class="title-div"> <img src="1_icon.png" alt="返回圖示"> <!-- <span >圖示位置</span> --> <span>我就是標題</span> </div> |
最初的結果是這樣子的
我們想實現如下圖所示的結果,圖示相對於右邊的字型居中:
這個時候我們就要使用vertical-align
屬性和設定他的length屬性,即設定我們的圖示相對與文字基線的偏移量。
當我們加入屬性的時候很容易使圖示和文字都垂直居中。
1 2 3 |
{ vertical-align:15px; } |
這個時候就會是我們的圖示和字型相對於父級元素居中。
12.flex 彈性盒模型的使用
flex 現在 pc 端支援的不好(主要是因為還有很多 IE8,9的使用者存在。)大多情況下我們都是在移動端使用flex
佈局。但是就算是這樣,也會有很多坑人的 bug出現。
談談一些基本的使用經驗吧,什麼時候使用 flex 。
1.什麼時候使用 flex 屬性
先來看一個產品模型如下圖
我的左邊商品和右邊商品的寬度是一樣的。當我看到這個模型的時候,第一件就是想就是使用 flex
讓我們兩列商品列表平分螢幕區域。這個時候就是用flex
來做。
父級元素如下定義
1 2 3 4 5 6 7 8 9 10 11 |
{ margin-bottom: .5rem; display: box; display: -webkit-box; display: -ms-flexbox; display: flex; display: -webkit-flex; -webkit-flex-flow: row; -ms-flex-flow: row; flex-flow: row; } |
2.新增廠商字首
使用 flex 的時候一定要記得加廠商字首(目前使用方式都有三種寫法:1,舊的2,過度的3,新的)。不然肯定會有相容性問題。
1 2 3 4 5 6 |
{ display: -webkit-box; display: -ms-flexbox; display: flex; display: -webkit-flex; } |
3.flex低版本瀏覽器的相容
先看我的程式碼:
1 2 3 4 5 6 7 8 |
{ box-flex: 1; -webkit-box-flex: 1; -webkit-flex: 1; -ms-flex: 1; flex: 1; width: 18.5rem; } |
這裡只是讓左右兩邊平分螢幕的寬度。
之前使用 flex在安卓4.3的手機上遇到一個問題。正常的頁面應該如下圖所示,
但是在 安卓4.3的手機上卻是如下的結果
後來研究了下天貓的頁面(因為之前使用這個 flex 就是參考天貓來學習的),看到他們在定義flex
值的時候 都會有這樣的一個屬性width=0;
而且當我給我的頁面也加上這個屬性的時候,頁面的佈局也變得正常了。我現在想不明白願意是什麼,只能當一個 hack 來使用。如果大家也遇到這個問題,請試一下新增這個屬性。如果大家知道為什麼這麼用,請指教一下。
13.CSS3動畫效能的問題
給大家推薦一個網站(點選這裡)可以檢測我們平時使用的 css 屬性改變元素樣式的時候,觸發的是 cpu還是 gpu ,特別是在做動畫的時候,如果使用 gpu 渲染圖形,可以減少 cpu 的消耗,提高程式的效能。
比如我們做一個 slider 動畫切換圖片位置的時候,會使用margin-left
的屬性,通過網站查詢該屬性值得到如下的結果
由上可以知道使用margin-left
的時候會處罰頁面的重繪和重排。
但是當我們使用css3新屬性transform
來代替傳統的 margin-left
來改變元素位置的時候對頁面有什麼影響呢?先來看下網站查詢的結果:
由查詢結果可以知道,使用transform
不會觸發任何的重繪。而且會觸發 gpu 來幫助頁面的排版。即使用GPU操作渲染動畫,減少cpu的消耗,提高效能。
css動畫簡單例項,css程式碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
.lottery-animation { -webkit-animation: lottery-red 2s; animation: lottery-red 2s; -webkit-animation-iteration-count: infinite; animation-iteration-count: infinite; } @-webkit-keyframes lottery-red { from { -webkit-transform: rotateY(0deg); transform: rotateY(0deg); } to { -webkit-transform: rotateY(360deg); transform: rotateY(360deg); } } @keyframes lottery-red { from { -webkit-transform: rotateY(0deg); transform: rotateY(0deg); } to { -webkit-transform: rotateY(360deg); transform: rotateY(360deg); } } |
效果如下圖:
這裡我只是對影象標籤新增了一個 class="lottery-animation"
我擷取動態圖片軟體的問題,我的這個gif 截圖動畫有些卡頓,不流暢。在正常機器上是沒有問題的(如果大家有mac下好用的 gif截圖軟體可以推薦給我,謝謝!)。
關於 css3 動畫效能優化推薦閱讀文章:
1.前端效能優化之更平滑的動畫(更新)
2.CSS3硬體加速也有坑!!!
如果您覺得不錯,請訪問 github(點我) 地址給我一顆星。謝謝啦!
打賞支援我寫出更多好文章,謝謝!
打賞作者
打賞支援我寫出更多好文章,謝謝!
任選一種支付方式