移動(dòng)端適配方法合集

原文鏈接 http://azq.space/blog/bigcan-lesson-1/
首先我先說兩個(gè)概念绿聘,第一嗽上,響應(yīng)式:一個(gè)頁面在不同尺寸的瀏覽器中不同的表現(xiàn);第二熄攘,自適應(yīng):一個(gè)頁面在任何尺寸瀏覽器下表現(xiàn)一致.這里只說自適應(yīng)兽愤。

1.簡(jiǎn)單粗暴型

zoom方式:

<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0"><!--必須,放在head標(biāo)簽中-->   
<script>
    var _SCALE_ = 1;
    _SCALE_ = function (){
    var deviceWidth = document.documentElement.clientWidth,
    scale = deviceWidth / 640;
    scale = scale > 1 ? 1 : scale;
    document.body.style.zoom = scale;
    return scale;//留著給js用
}();//在body下執(zhí)行即可
</script>

以上是通過css屬性zoom來縮放頁面,設(shè)計(jì)稿寬度為640(以下設(shè)計(jì)稿尺寸都為640)挪圾,所以這樣的好處就是直接按照原來設(shè)計(jì)稿的尺寸用px來寫css浅萧,不過這個(gè)顯然不夠高大上,頁面有時(shí)會(huì)不清晰哲思,但是通過和%的配合也可以快速的構(gòu)建你的h5頁面

css3的scale方式:

此方式bug眾多洼畅,不適合新手,也不適合老司機(jī)棚赔,所以 略略略

2.溫柔小巧型

meta-viewport-scale方式:

通過比例來對(duì)initial-scale等屬性進(jìn)行重置帝簇,少部分瀏覽器不識(shí)別重置

<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0"><!--必須,放在head標(biāo)簽中-->   
<script>
var _SCALE_ = 1;
    _SCALE_ = function (){
    var deviceWidth = document.documentElement.clientWidth,
    scale = deviceWidth / 640;
    scale = scale > 1 ? 1 : scale;
    var metaEl = document.querySelector('meta[name="viewport"]');
    metaEl.setAttribute('content', 'width=640,initial-scale=' + scale + ',maximum-scale=' + scale + ', minimum-scale=' + scale + ',user-scalable=no');
    return scale;
}();
</script>

這種方式和zoom的方式類似也是采用縮放,css也是按照原始設(shè)計(jì)稿來寫,也能解決1px的問題靠益,暫時(shí)沒有發(fā)現(xiàn)什么問題,也許會(huì)有不清晰的現(xiàn)象,如果有同學(xué)在使用這種方法的時(shí)候遇到問題請(qǐng)及時(shí)告訴我,趕緊填坑

3.高端時(shí)尚型

這是個(gè)高清適配的方法,除了重置meta失效的瀏覽器

dpr丧肴,rem,meta

var dpr, rem, scale;
        var docEl = document.documentElement;
        var fontEl = document.createElement('style');
        var metaEl = document.querySelector('meta[name="viewport"]');

        dpr = window.devicePixelRatio || 1;
        rem = docEl.clientWidth * dpr / 10;
        scale = 1 / dpr;
        // 設(shè)置viewport胧后,進(jìn)行縮放芋浮,達(dá)到高清效果
        metaEl.setAttribute('content', 'width=' + dpr * docEl.clientWidth + ',initial-scale=' + scale + ',maximum-scale=' + scale + ', minimum-scale=' + scale + ',user-scalable=no');

        // 設(shè)置data-dpr屬性,留作的css hack之用
        docEl.setAttribute('data-dpr', dpr);

        // 動(dòng)態(tài)寫入樣式
        docEl.firstElementChild.appendChild(fontEl);
        fontEl.innerHTML = 'html{font-size:' + rem + 'px!important;}';

        // 給js調(diào)用的壳快,某一dpr下rem和px之間的轉(zhuǎn)換函數(shù)
        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;

然后為了方便我們可以采用less或者sass途样、scss來對(duì)我們的css樣式進(jìn)行管理,這里簡(jiǎn)單的介紹less

.px2rem(@name, @px){
    @{name}: @px / 64 * 1rem;
}
.px2px(@name, @px){
    @{name}: round(@px / 2) * 1px;
  [data-dpr="2"] & {
      @{name}: @px * 1px;
  }
  // for mx3
  [data-dpr="2.5"] & {
      @{name}: round(@px * 2.5 / 2) * 1px;
  }
  // for 小米note
  [data-dpr="2.75"] & {
      @{name}: round(@px * 2.75 / 2) * 1px;
  }
  [data-dpr="3"] & {
      @{name}: round(@px / 2 * 3) * 1px
  }
  // for 三星note4
  [data-dpr="4"] & {
      @{name}: @px * 2px;
  }
}
/*簡(jiǎn)單的圓角半徑*/
.border-radius (@radius: 5px) {
  -webkit-border-radius: @radius;
  -moz-border-radius: @radius;
  border-radius: @radius;
}
/*四角的半徑定制*/
.border-radius-custom (@topleft: 5px, @topright: 5px, @bottomleft: 5px, @bottomright: 5px) {
  -webkit-border-radius: @topleft @topright @bottomright @bottomleft;
  -moz-border-radius: @topleft @topright @bottomright @bottomleft;
  border-radius: @topleft @topright @bottomright @bottomleft;
}
/*方塊陰影 Box Shadow*/
.box-shadow (@x: 0px, @y: 3px, @blur: 5px, @alpha: 0.5) {
  -webkit-box-shadow: @x @y @blur rgba(0, 0, 0, @alpha);
  -moz-box-shadow: @x @y @blur rgba(0, 0, 0, @alpha);
  box-shadow: @x @y @blur rgba(0, 0, 0, @alpha);
}
/*元素過渡效果 Transition*/
.transition (@prop: all, @time: 1s, @ease: linear) {
  -webkit-transition: @prop @time @ease;
  -moz-transition: @prop @time @ease;
  -ms-transition: @prop @time @ease;
  transition: @prop @time @ease;
}
/*轉(zhuǎn)換/旋轉(zhuǎn) Transform*/
.transform (@rotate: 90deg, @scale: 1, @skew: 1deg, @translate: 10px) {
  -webkit-transform: rotate(@rotate) scale(@scale) skew(@skew) translate(@translate);
  -moz-transform: rotate(@rotate) scale(@scale) skew(@skew) translate(@translate);
  -ms-transform: rotate(@rotate) scale(@scale) skew(@skew) translate(@translate);
  transform: rotate(@rotate) scale(@scale) skew(@skew) translate(@translate);
}
/*線性漸變*/
.gradient (@origin: left, @start: #ffffff, @stop: #000000) {
  background-color: @start;
  background-image: -webkit-linear-gradient(@origin, @start, @stop);
  background-image: -moz-linear-gradient(@origin, @start, @stop);
  background-image: -ms-linear-gradient(@origin, @start, @stop);
  background-image: linear-gradient(@origin, @start, @stop);
}
/*快速漸變*/
.quick-gradient (@origin: left, @alpha: 0.2) {
  background-image: -webkit-linear-gradient(@origin, rgba(0,0,0,0.0), rgba(0,0,0,@alpha));
  background-image: -moz-linear-gradient(@origin, rgba(0,0,0,0.0), rgba(0,0,0,@alpha));
  background-image: -ms-linear-gradient(@origin, rgba(0,0,0,0.0), rgba(0,0,0,@alpha));
  background-image: linear-gradient(@origin, rgba(0,0,0,0.0), rgba(0,0,0,@alpha));
}
/*鏡像效果*/
.reflect (@length: 50%, @opacity: 0.2){
  -webkit-box-reflect: below 0px
  -webkit-gradient(linear, left top, left bottom, from(transparent),
          color-stop(@length, transparent), to(rgba(255,255,255,@opacity)));
}

這里寫了一些css3的效果備用

less是不被瀏覽器識(shí)別的所以我們要編譯它濒憋,一種是用在線的js編譯何暇,這種要多加載一條js;建議用程序來編譯less凛驮,例如使用npm包中的less來編譯;或者用構(gòu)建工具gulp或者包管理工具webpack來編譯裆站,有時(shí)間可以分享給大家我的幾個(gè)項(xiàng)目的源碼;再或者在css中直接寫px然后利用npm包中的px2rem來直接編譯成rem,然后引用編譯好的即可;其實(shí)上面的less中的前綴是可以省略的,然后用npm包中的autoprefixer來自動(dòng)生成即可

這個(gè)適配方法對(duì)于Swiper滑動(dòng)組件有點(diǎn)麻煩

var mySwiper = new Swiper('.swiper-container', {
        height : window.innerHeight,//這里需要給一個(gè)高度
        direction : 'vertical'
})

請(qǐng)大家踩坑

4.css型

%
這個(gè)就不多說了,就是需要計(jì)算和設(shè)計(jì)稿寬度的比和高度比宏胯,注意的是:padding羽嫡,margin的百分比計(jì)算是根據(jù)寬度的,這點(diǎn)要很注意
vw&vh
這個(gè)是忘記了是css3新出來的還是以前就有了肩袍,這個(gè)類似%杭棵,但是他的父級(jí)是屏幕,即vw對(duì)應(yīng)屏幕寬度氛赐,vh對(duì)應(yīng)高度魂爪,整個(gè)屏幕的大小是100vw*100vh

5.自由發(fā)揮型

下面說一個(gè)我最常用的方式:
rem,vw&vh艰管,%,flex

    var dpr, rem, scale;
    var docEl = document.documentElement;
    var fontEl = document.createElement('style');
    scale = docEl.clientWidth / 640;
    scale = scale>1?1:scale;
    rem = 64;
    rem = rem*scale;
    // 動(dòng)態(tài)寫入樣式
    docEl.firstElementChild.appendChild(fontEl);
    fontEl.innerHTML = 'html,body{font-size:' + rem + 'px!important;}';

動(dòng)態(tài)的設(shè)置根的字體大小

css中rem的處理方式還是同第三種的解決方式

這種方法兼容性比較好滓侍,移動(dòng)端基本都o(jì)k了;有的時(shí)候設(shè)計(jì)出來的設(shè)計(jì)稿可能,略微的長(zhǎng)一些牲芋,這時(shí)候我們?cè)诓季稚暇鸵蒙?和vh,flex,圖片要設(shè)置高度寬自動(dòng),這種方法真的要隨機(jī)應(yīng)變了撩笆,但是這種方法也是對(duì)于觀看者最友好的,能最大程度的不因可視區(qū)域的變小而影響觀看

以上是我用過的缸浦,踩過坑的方法夕冲,還有其他方法請(qǐng)一起踩坑哦
以上有什么代碼、概念之類的錯(cuò)誤請(qǐng)及時(shí)批斗裂逐,也歡迎批斗

不知道以上對(duì)大家有沒有幫助歹鱼,沒有的話我也寫了這篇文章了;有的話那我就心滿意足了

原文鏈接 http://azq.space/blog/bigcan-lesson-1/
公眾號(hào)

BigCan

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末絮姆,一起剝皮案震驚了整個(gè)濱河市醉冤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌篙悯,老刑警劉巖蚁阳,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異鸽照,居然都是意外死亡螺捐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門矮燎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來定血,“玉大人,你說我怎么就攤上這事诞外±焦担” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵峡谊,是天一觀的道長(zhǎng)茫虽。 經(jīng)常有香客問我刊苍,道長(zhǎng),這世上最難降的妖魔是什么濒析? 我笑而不...
    開封第一講書人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任正什,我火速辦了婚禮,結(jié)果婚禮上号杏,老公的妹妹穿的比我還像新娘婴氮。我一直安慰自己,他們只是感情好盾致,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開白布主经。 她就那樣靜靜地躺著,像睡著了一般绰上。 火紅的嫁衣襯著肌膚如雪旨怠。 梳的紋絲不亂的頭發(fā)上渠驼,一...
    開封第一講書人閱讀 49,837評(píng)論 1 290
  • 那天蜈块,我揣著相機(jī)與錄音,去河邊找鬼迷扇。 笑死百揭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蜓席。 我是一名探鬼主播器一,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼厨内!你這毒婦竟也來了祈秕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬榮一對(duì)情侶失蹤雏胃,失蹤者是張志新(化名)和其女友劉穎请毛,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瞭亮,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡方仿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了统翩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仙蚜。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖厂汗,靈堂內(nèi)的尸體忽然破棺而出委粉,到底是詐尸還是另有隱情,我是刑警寧澤娶桦,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布贾节,位于F島的核電站匣掸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏氮双。R本人自食惡果不足惜碰酝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望戴差。 院中可真熱鬧送爸,春花似錦、人聲如沸暖释。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽球匕。三九已至纹磺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間亮曹,已是汗流浹背橄杨。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留照卦,地道東北人式矫。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像役耕,于是被迫代替她去往敵國(guó)和親采转。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案瞬痘? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,737評(píng)論 1 92
  • 什么是Rem rem和em很容易混淆故慈,其實(shí)兩個(gè)都是css的單位,并且也都是相對(duì)單位框全,現(xiàn)有的em察绷,css3才引入的r...
    tobAlier閱讀 27,838評(píng)論 2 38
  • 響應(yīng)式布局的實(shí)現(xiàn)依靠媒體查詢( Media Queries )來實(shí)現(xiàn),選取主流設(shè)備寬度尺寸作為斷點(diǎn)針對(duì)性寫額外的樣...
    iyimao閱讀 539評(píng)論 0 0
  • 都說君子報(bào)仇,十年不晚丹泉。沒錯(cuò)情萤,復(fù)仇可以讓一個(gè)人變得不擇手段,甚至不惜舍掉自己的尊嚴(yán)摹恨。而我今天要講的這位人物筋岛,就是一...
    有趣的歷史段子閱讀 731評(píng)論 0 12
  • 夜深氣涼 遇知佳人 聊之盛歡 拜我為兄 心中常思 擔(dān)憂疾勞 吾不在旁 望其安康 吾會(huì)久伴
    凡咪日眼閱讀 227評(píng)論 0 0