如何實(shí)現(xiàn)微信小程序的橫屏及適配

微信小程序如何橫屏

從小程序基礎(chǔ)庫(kù)版本 2.4.0 開(kāi)始,小程序在手機(jī)上支持屏幕旋轉(zhuǎn)。使小程序中的頁(yè)面支持屏幕旋轉(zhuǎn)的方法是:在 app.jsonwindow 段中設(shè)置 "pageOrientation": "auto" 妆档,或在頁(yè)面 json 文件中配置 "pageOrientation": "auto" 主经。

微信小程序開(kāi)發(fā)文檔

PS:1排霉、以這種方式實(shí)現(xiàn)小程序屏幕旋轉(zhuǎn),需要用戶關(guān)閉手機(jī)上的“屏幕鎖定”選項(xiàng)
PS:2硬纤、由于開(kāi)啟橫屏需要修改json文件的配置,而這個(gè)文件我們無(wú)法在程序運(yùn)行中進(jìn)行修改碘梢,故我們無(wú)法通過(guò)點(diǎn)擊按鈕或其他操作去使手機(jī)屏幕發(fā)生旋轉(zhuǎn)咬摇,只是是設(shè)置為"pageOrientation": "auto"用戶主動(dòng)旋轉(zhuǎn)手機(jī)觸發(fā)
PS:3、我們可以在進(jìn)入某一個(gè)頁(yè)面的時(shí)候煞躬,固定屏幕橫屏展示肛鹏,設(shè)置"pageOrientation": "landscape "

如何獲取當(dāng)前屏幕狀態(tài)

使用 selectorQuery.selectViewport可以獲取到當(dāng)前的屏幕狀態(tài)。這種方式比較麻煩恩沛,這里介紹一種使用wx.onWindowResize進(jìn)行監(jiān)聽(tīng)的方式在扰。

    onShow() {
        let that = this;
        wx.onWindowResize(function(res) {
            if (res.deviceOrientation === 'landscape') {
                that.isRotating = true;
            } else {
                that.isRotating = false;
            }
        })
          }

上面代碼中,我們可以在wx.onWindowResize函數(shù)的回調(diào)中獲取到當(dāng)前屏幕的方向雷客,并賦值給isRotating芒珠。當(dāng)然,我們還可以在回調(diào)中拿到windowWidth(變化后的窗口寬度搅裙,單位 px)和windowHeight(變化后的窗口高度皱卓,單位 px)屬性裹芝。

wx.onWindowResize函數(shù)是一個(gè)監(jiān)聽(tīng)函數(shù),類似Vue中的watch娜汁,我們可以把它放到onShow中嫂易。

橫屏后出現(xiàn)的適配問(wèn)題

我們都知道,微信小程序在豎屏狀態(tài)下掐禁,寬度100%怜械,100VW的值為750rpx。但是在橫屏之后傅事,750rpx的實(shí)際寬度為手機(jī)屏幕的高缕允。如圖:

豎屏狀態(tài)使用rpx,px進(jìn)行布局
橫屏狀態(tài)使用rpx,px進(jìn)行布局1
橫屏狀態(tài)使用rpx,px進(jìn)行布局2

在這種情況下,我們的界面將會(huì)變大蹭越。
舉個(gè)簡(jiǎn)單例子障本,假如手機(jī)屏幕的寬高比為1:2,我們有一個(gè)按鈕大小為100rpx100rpx响鹃,那么在豎屏狀態(tài)下彼绷,顯示正常,橫屏狀態(tài)下茴迁,按鈕的顯示寬高將會(huì)變成原來(lái)的2倍寄悯,當(dāng)然他仍然是100rpx100rpx,但是顯示出來(lái)卻是變大了堕义。

橫屏后的適配方案

使用px進(jìn)行布局

我們可以看到猜旬,使用px進(jìn)行布局時(shí),橫屏之后元素并沒(méi)有變大倦卖,所以這種方案是可行的洒擦。
但是,我們可以看到的是怕膛,375px在橫屏?xí)r并沒(méi)有占滿全屏熟嫩,也就是pxrpx之間并不是簡(jiǎn)單的1:2的對(duì)應(yīng)關(guān)系。

rpx與px的對(duì)應(yīng)關(guān)系

這里我們不討論個(gè)物理像素褐捻、pt掸茅、px之間復(fù)雜的關(guān)系(/ω\)
所以,使用px布局柠逞,也不是那么好用昧狮。

使用vmin進(jìn)行布局

先介紹下css3的兩個(gè)屬性vmaxvmin

vmax 相對(duì)于視口的寬度或高度中較大的那個(gè)。其中最大的那個(gè)被均分為100單位的vmax
vmin 相對(duì)于視口的寬度或高度中較小的那個(gè)板壮。其中最小的那個(gè)被均分為100單位的vmin
文檔說(shuō)明

在這里我們只用到了vmin逗鸣。

當(dāng)我們?cè)谪Q屏?xí)r候,100vmin的取值為手機(jī)屏幕寬度,當(dāng)橫屏?xí)r候撒璧,100vmin的取值仍然為手機(jī)屏幕寬度透葛,所以以vmin為單位的元素,在手機(jī)屏幕發(fā)生旋轉(zhuǎn)的時(shí)候卿樱,其顯示大小并不會(huì)發(fā)生改變(畢竟不管橫屏豎屏获洲,100vmin都等于屏幕的寬度)。
在使用rpx進(jìn)行布局時(shí)殿如,750rpx的取值為手機(jī)屏幕的寬度,而在使用vmin時(shí)最爬,100vmin的取值為手機(jī)屏幕的寬度涉馁,所以,rpxvmin之間存在一個(gè)換算關(guān)系爱致,即:x rpx=( x * 100 / 750)vmin烤送。舉個(gè)例子,75rpx轉(zhuǎn)化為vmin75 * 100 / 750 = 10 vmin糠悯。所以帮坚,我們只要將rpx轉(zhuǎn)化成vmin就可以愉快的碼頁(yè)面了~

使用scss進(jìn)行轉(zhuǎn)化

在實(shí)際開(kāi)發(fā)中,我們不可能去手動(dòng)計(jì)算每一個(gè)vmin的值互艾,由于我用的是scss试和,所以我用scss進(jìn)行了一下預(yù)處理。這里提供兩種方式纫普,一種是css函數(shù)阅悍,另一種是css mixin

//css函數(shù)
@function tovmin($rpx){//$rpx為需要轉(zhuǎn)換的字號(hào)
    @return #{$rpx * 100 / 750}vmin; 
}
//使用方式
.slideAddPanel {
    width: tovmin(48);
    height: tovmin(80);
    background: rgba(0, 0, 0, 0.5);
    box-shadow: 0 tovmin(2) tovmin(12) 0 rgba(0, 0, 0, 0.2);
    line-height: tovmin(80);
    border-radius: 0 tovmin(10) tovmin(10) 0;
}
//css mixin
@mixin upx2vmin($property, $values...) {
    
  $max: length($values);//返回$values列表的長(zhǎng)度值
  $pxValues: '';
  $remValues: '';

  @for $i from 1 through $max {
    $value: nth($values, $i);
    $remValues: #{$remValues + ($value * 100 / 750)}vmin;

    @if $i < $max {
      $remValues: #{$remValues + " "};
    }
  } 

  #{$property}: $remValues; 
}

//使用方式
.slideAddPanel {
    @include remCalc(width,45);
    @include remCalc(margin,1,.5,2,3);
}

PS:這兩種方法均來(lái)自網(wǎng)絡(luò),我還是比較喜歡第一種~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末昨稼,一起剝皮案震驚了整個(gè)濱河市节视,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌假栓,老刑警劉巖寻行,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異匾荆,居然都是意外死亡拌蜘,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門牙丽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)拦坠,“玉大人,你說(shuō)我怎么就攤上這事剩岳≌瓯酰” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)晓铆。 經(jīng)常有香客問(wèn)我勺良,道長(zhǎng),這世上最難降的妖魔是什么骄噪? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任尚困,我火速辦了婚禮,結(jié)果婚禮上链蕊,老公的妹妹穿的比我還像新娘事甜。我一直安慰自己,他們只是感情好滔韵,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布逻谦。 她就那樣靜靜地躺著,像睡著了一般陪蜻。 火紅的嫁衣襯著肌膚如雪邦马。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,682評(píng)論 1 312
  • 那天宴卖,我揣著相機(jī)與錄音滋将,去河邊找鬼。 笑死症昏,一個(gè)胖子當(dāng)著我的面吹牛随闽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肝谭,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼橱脸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了分苇?” 一聲冷哼從身側(cè)響起添诉,我...
    開(kāi)封第一講書(shū)人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎医寿,沒(méi)想到半個(gè)月后栏赴,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡靖秩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年须眷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沟突。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡花颗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惠拭,到底是詐尸還是另有隱情扩劝,我是刑警寧澤庸论,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站棒呛,受9級(jí)特大地震影響聂示,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜簇秒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一鱼喉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧趋观,春花似錦扛禽、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至麸恍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間搀矫,已是汗流浹背抹沪。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瓤球,地道東北人融欧。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像卦羡,于是被迫代替她去往敵國(guó)和親噪馏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361