移動端 h5開發相關內容總結——CSS篇

2021-12-30 前端大全

(點擊上方公眾號,可快速關注)

作者:伯樂在線專欄作者 - zhiqiang21

如有好文章投稿,請點擊 → 這裡了解詳情

如需轉載,發送「轉載」二字查看說明

1.移動端開發視窗口的添加

h5端開發下面這段話是必須配置的

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 值。這樣可以解決多屏幕適配的問題。

比如下面的 媒體查詢代碼

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%;

    }

}

這樣做的結果,有兩個很明顯的缺點。

後來參考淘寶移動端頁面適配規則,使用 js 獲取客戶端的寬度,根據設計稿的原型動態的計算font-size 的值。

詳細的內容請看這裡 根據iPhone6設計稿動態計算rem值

3.a標籤內容語義化

大多數時候我們都會給一片區域加上點擊跳轉的功能。如下圖:

很可能我們商品區域都是使用的div 標籤。很容易我們會給最外層加上一個 a 標籤。因為a 是行內元素,是沒有寬和高的。不能夠把容器撐開。

一種解決辦法就是給a 標籤設置block 屬性。如下:

<style>

    a{display:block;}

</style>

 

<a>

    <div></div>

</a>

功能上已經沒有問題。但是在語義化的層面上,上面的代碼是不標準的。

最好的做法就是做如下的修改,這樣不會使自己的 html 代碼顯的太突兀:

<style>

a{display:block;}

span{dispaly:block;}

</style>

 

<a>

    <span></span>

    <span></span>

    <span></span>

</a>

4.為自己的頁面設置最大寬度和最小寬度

如果我們使用的是rem 單位,使用 js 動態計算font-size 值的話,我們可以無限適配最大和最小的終端屏幕。但是當用戶的屏幕超過一定的尺寸以後還繼續顯示h5頁面的話對用戶會很不友好。

我們參看下京東和淘寶的h5 頁面

我們看到了都是定義了頁面的最大和最小寬度。這樣在屏幕超過一定的尺寸以後可以更友好的展示(當然這不是必須的)。

我給自己的產品頁面定義的最大的寬度和最小寬度分別是:

{

    max-width:640px;

    min-width:320px;

}

5.去掉 a,input 在移動端瀏覽器中的默認樣式

1.禁止 a 標籤背景

在移動端使用 a標籤做按鈕的時候,點按會出現一個「暗色」的背景,去掉該背景的方法如下

a,button,input,optgroup,select,textarea {

    -webkit-tap-highlight-color:rgba(0,0,0,0); /*去掉a、input和button點擊時的藍色外邊框和灰色半透明背景*/

}

2.禁止長按 a,img 標籤長按出現菜單欄

使用 a標籤的時候,移動端長按會出現一個 菜單欄,這個時候禁止呼出菜單欄的方法如下:

a, img {

    -webkit-touch-callout: none; /*禁止長按連結與圖片彈出菜單*/

}

3.流暢滾動

body{

    -webkit-overflow-scrolling:touch;

}

6.CSS 截斷字符串

單行截斷字符串,這裡必須指定字符串的寬度

{

    /*指定字符串的寬度*/

    width:300px;  

    overflow: hidden;  

    /* 當字符串超過規定長度,顯示省略符*/

    text-overflow:ellipsis;  

    white-space: nowrap;  

}

7.calc 相關問題

之前在做布局的時候使用calc 出現了很嚴重的線上 BUG。後來就深究了下這個屬性的使用。

calc好用的地方就是,可以在任何單位之間進行換算。但是瀏覽器支持的不是很好。看一下 can i use 截圖:

而且在使用的時候要加上廠商前綴,達到兼容性。不過現在不推薦使用,畢竟,瀏覽器支持有限。

示例代碼:

#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 代碼如下:

<div class="parent-div">

        <div class="child-div"></div>

</div>

css代碼如下:

.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 :

<div class="title-div">

        <img src="1_icon.png" alt="返回圖標">

        <!-- <span >圖標位置</span> -->

        <span>我就是標題</span>

</div>

最初的結果是這樣子的

我們想實現如下圖所示的結果,圖標相對於右邊的字體居中:

這個時候我們就要使用vertical-align屬性和設置他的length屬性,即設置我們的圖標相對與文字基線的偏移量。

當我們加入屬性的時候很容易使圖標和文字都垂直居中。

{

    vertical-align:15px;

}

這個時候就會是我們的圖標和字體相對於父級元素居中。

12.flex 彈性盒模型的使用

flex 現在 pc 端支持的不好(主要是因為還有很多 IE8,9的用戶存在。)大多情況下我們都是在移動端使用flex布局。但是就算是這樣,也會有很多坑人的 bug出現。

談談一些基本的使用經驗吧,什麼時候使用 flex 。

1.什麼時候使用 flex 屬性

先來看一個產品模型如下圖

我的左邊商品和右邊商品的寬度是一樣的。當我看到這個模型的時候,第一件就是想就是使用 flex 讓我們兩列商品列表平分屏幕區域。這個時候就是用flex 來做。

父級元素如下定義

{  

    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,新的)。不然肯定會有兼容性問題。

{

    display: -webkit-box;

    display: -ms-flexbox;

    display: flex;

    display: -webkit-flex;

}

3.flex低版本瀏覽器的兼容

先看我的代碼:

{

    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代碼如下:

.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);

    }

}

效果如下圖:

這裡我只是對圖像標籤添加了一個

我截取動態圖片軟體的問題,我的這個gif 截圖動畫有些卡頓,不流暢。在正常機器上是沒有問題的(如果大家有mac下好用的 gif截圖軟體可以推薦給我,謝謝!)。

覺得本文對你有幫助?請分享給更多人

關注「前端大全」,提升前端技能

專欄作者簡介 ( 點擊 → 加入專欄作者 )

zhiqiang21:做認為對的事情,如果可能是錯的,那就做認為自己承受得起的事情!

相關焦點

  • vue移動端開發總結
    相對於PC端來說,移動端設備解析度百花齊放,千奇百怪,對於每一個開發者來說,移動端適配是我們進行移動端開發第一個需要面對的問題。所以現在我們知道,這段在移動端常見的代碼的意思,即將visualviewport和layoutviewport設置為idealviewport的值;這樣我們在移動端就不會出現滾動條,網頁內容可以比較好的展示出來,在這個前提下我們再考慮頁面的適配問題。
  • H5 移動端開發基礎知識
    而本文的主題 -- 移動端開發的兼容適配與性能優化,就是希望能從一些常見的移動端開發問題出發,釐清 Web 移動端開發的前前後後,一些技術的發展過程,一些問題的優化手段以及給出一些常見的兼容性問題的解決方案。
  • 移動端H5前端開發調試經驗總結
    這裡的方法僅能作為基礎的響應式測試,對於中小型、比較簡單的項目,完全足夠用了,對於稍微複雜的頁面,還是需要用虛擬機或者真機測試,這樣更加可靠。基於 Android 的移動端前端開發調試Android 系統是份額最大的移動端設備作業系統。
  • 收藏 | 移動端H5開發常用技巧總結
    html 篇常用的meta屬性設置meta對於移動端的一些特殊屬性,可根據需要自行設置<meta name="screen-orientation" content="portrait"> //Android 禁止屏幕旋轉<meta name="
  • vuejs開發H5頁面總結
    最近參與了APP內嵌H5頁面的開發,這次使用vuejs替代了jQuery,僅僅把vuejs當做一個庫來使用,效率提高之外代碼可讀性更強,在此分享一下自己的一些開發中總結的經驗
  • 開發 h5| Hybrid | 微信小程序 | 實踐踩坑總結十六條
    app嵌入的h5項目和微信小程序商城項目,在此期間遇到很多坑。這篇文章主要是針對 h5| Hybrid | 微信小程序 三個方向來講述我遇到的坑,以及詳細講解我是如何解決問題的。一直以來,移動端適配就是一個令人頭疼的問題。如果想要吃透移動端,還需要不少的實踐經驗,有的時候在pc端調試沒有問題,但是在m端就會出現問題。以下這16個問題是我在實際工作中遇到的,親自奉上給大家。希望大家收藏一波,以備不時之需。
  • 【Vuejs】845- Vuejs開發移動端經驗總結
    移動端適配相對於PC端來說,移動端設備解析度百花齊放,千奇百怪,對於每一個開發者來說,移動端適配是我們進行移動端開發第一個需要面對的問題。user-scale=no禁止縮放所以現在我們知道,這段在移動端常見的代碼的意思,即將visualviewport和layoutviewport設置為idealviewport的值;這樣我們在移動端就不會出現滾動條,網頁內容可以比較好的展示出來,在這個前提下我們再考慮頁面的適配問題。
  • Vue.js開發移動端經驗總結
    移動端適配相對於PC端來說,移動端設備解析度百花齊放,千奇百怪,對於每一個開發者來說,移動端適配是我們進行移動端開發第一個需要面對的問題。user-scale=no禁止縮放所以現在我們知道,這段在移動端常見的代碼的意思,即將visualviewport和layoutviewport設置為idealviewport的值;這樣我們在移動端就不會出現滾動條,網頁內容可以比較好的展示出來,在這個前提下我們再考慮頁面的適配問題。
  • H5移動端知識點總結(一)
    移動開發基本知識點一.
  • HTML+CSS,PC端/手機端公用部分樣式代碼整理(自己收藏)
    把自己平時用的CSS公共樣式整理髮上來,方便自己查看也方便共享一:移動端公共樣式
  • 移動端h5自適應適配之flexible.js打假
    最近做一個移動端的h5適配,在網上找方案基本上都是使用flexible.js,然後順理成章我也入了這個坑
  • 基於 Vue和 TS的 Web 移動端混合開發實戰
    因為公司在這方面沒有太多技術沉澱,所以在開發期間遇到了很多坑,經過一年多的技術攻克積累,最終形成了這套比較完善的解決方案,總結出來希望能夠幫助到大家,尤其是對一些中小公司這方面經驗不足的(PS: 大公司估計有他們自己的一套方案了)。
  • 總結個人使用過的移動端布局方法
    ,主要是總結一下,我在移動端布局用過的方法。而且用這種方式有一個好處,就是不用在css裡寫@media。平常響應式網站的開發平時響應式網站的開發,我都會先對比PC和MOBILE的設計稿,看看有什麼區別,然後才進行編寫css。通常都是使用flex。寬度儘量用百分比,間距、高度、字體大小使用 em,就可以很方便的進行大小的控制。
  • Web移動端開發的兼容適配與性能優化(上)
    前端的一大工作內容就是去兼容頁面在不同內核的瀏覽器,不同的設備,不同的解析度下的行為,使頁面的能正常工作在各種各樣的宿主環境當中。而本文的主題——移動端開發的兼容適配與性能優化,就是希望能從一些常見的移動端開發問題出發,理清 Web 移動端開發的前前後後,一些技術的發展過程,一些問題的優化手段以及給出一些常見的兼容性問題的解決方案。
  • 移動端開發的屏幕、圖像、字體與布局的兼容適配
    而本文的主題 -- 移動端開發的兼容適配與性能優化,就是希望能從一些常見的移動端開發問題出發,釐清 Web 移動端開發的前前後後,一些技術的發展過程,一些問題的優化手段以及給出一些常見的兼容性問題的解決方案。
  • 總結移動端 H5 開發的 20 常用技巧(乾貨滿滿哦!)
    H5開發常見的問題給大家做下分享,這裡很多是自己在開發過程中遇到的大坑或者遭到過吐糟的問題,希望能給大家帶來或多或少的幫助,喜歡的大佬們可以給個小贊,如果有問題也可以一起討論下。html 篇常用的meta屬性設置meta對於移動端的一些特殊屬性,可根據需要自行設置<meta name="screen-orientation" content="portrait"> //Android 禁止屏幕旋轉<meta name="full-screen" content="yes"> //
  • 基於 Vue 和 TS 的 Web 移動端項目實戰心得
    因為公司在這方面沒有太多技術沉澱,所以在開發期間遇到了很多坑,經過一年多的技術攻克積累,最終形成了這套比較完善的解決方案,總結出來希望能夠幫助到大家,尤其是對一些中小公司這方面經驗不足的(PS: 大公司估計有他們自己的一套方案了)。
  • web移動端的開發注意事項
    通常我們再滑屏頁面,會調用css的html{-ms-touch-action: none;}可以阻止默認情況的發生:阻止頁面滾動MSPointerUp——當手指離開屏幕時觸發4、移動端click屏幕產生200-300 ms的延遲響應行動裝置上的web網頁是有300ms延遲的,玩玩會造成按鈕點擊延遲甚至是點擊失效。
  • 移動端開發H5調試方案
    一、概要因為移動端作業系統分為 iOS 和 Android 兩派,所以本文的調試技巧也會按照不同的系統來區分。尋找最合適高效的方式,才能讓你事半功倍。文章會列舉目前適合移動端調試的多種方案,快來選擇你的最佳實踐吧!
  • 移動端設備前端開發調試的方法技巧
    通過移動端使用Web服務的比率越來越大,掌握移動端的前端開發和測試是非常有必要的,但本文只介紹與調試有關的內容,至於其他移動端開發知識太多太大,我們在此就不一一的介紹了。一、響應式測試響應式現在基本是中小型項目的標配了,先來談談響應式測試技巧。