uni-app?PC端寬屏適配方案圖文詳解
前言
隨著互聯(lián)網(wǎng)的發(fā)展,iOS、Android、H5以及各種小程序快應(yīng)用層出不窮,隨之而來的問題就是如何用一套代碼,適配多個平臺,其中uni-app表現(xiàn)優(yōu)異,已經(jīng)實現(xiàn)了手機端全覆蓋,支持iOS、Android、H5、微信小程序、阿里小程序、百度小程序、字節(jié)跳動小程序、QQ小程序、快應(yīng)用、360小程序,并且在各端均有優(yōu)異的運行性能。并且從2.9版本起,uni-app 進(jìn)一步提供了PC等寬屏的適配方案,完成了大統(tǒng)一。
具體怎么用
我們下面用一個簡單的案列讓大家直觀感受:
比如現(xiàn)在的需求是,一個列表卡片,點擊卡片進(jìn)入卡片詳情頁,在小程序,ios, Android, 以及h5上表現(xiàn)形式如下:
小程序

H5

但是我想在寬屏pc端兼容這個需求,現(xiàn)在左邊固定寬度展示列表卡片,右邊剩余寬度展示選中的卡片詳情,表現(xiàn)形式如下:

Uni-app具體做法如下:
- 窗體級適配:leftwindow、rightwindow、topwindow等分欄
- 組件級適配:match-media組件
- rpx的寬屏響應(yīng)
窗體級適配:leftwindow分欄
新建rightWindow.vue頁面(這個頁面不需要從寫,只需要復(fù)用原來的組件detail.vue)
<template>
// 原來的組件detail.vue
<detail ref="detailPage" :text="detail" ></detail>
</template>
<script>
export default {
data(){
return {
detail:''
}
},
created(e) {
//監(jiān)聽自定義事件,該事件由左側(cè)列表頁的點擊觸發(fā)
uni.$on('updateDetail', (e) => {
this.detail = decodeURIComponent(e.detail)
// 執(zhí)行 detailPage組件,即:/pages/detail/detail.vue 頁面的load方法
this.$refs.detailPage.load(e.detail);
})
}
}
</script>
在列表卡片頁面,處理點擊卡片后與rightWindow交互通信
<template>
<view class="content-box">
<view class="each-box" v-for="(item,index) in list" :key="index" @click="goDetail(item?.des)">
<image class="content-img" :src="item?.url" mode="scaleToFill" />
<view class="content-des">
{{item?.des}}
</view>
</view>
</view>
</template>
<script>
methods: {
goDetail(detail){
if (this.pageWidth > 768) {
//若為寬屏,則觸發(fā)右側(cè)分欄詳情頁的自定義事件,通知右側(cè)窗體刷新新聞詳情
uni.$emit('updateDetail', {
detail: encodeURIComponent(detail)
})
} else {
// 若為窄評,則打開新窗體,在新窗體打開詳情頁面
uni.navigateTo({
url: '/pages/detail/detail?detail=' + encodeURIComponent(detail)
});
}
}
}
</script>
在pages.json中注冊rightWindow
// 頁面適配
"rightWindow": {
"path": "pages/rightWindow/rightWindow.vue", // 指定 rightWindow 頁面文件
"style": {
"width": "calc(100vw - 390px)" // 頁面寬度(390px是左邊固定寬度)
},
"matchMedia": {
"minWidth": 580 //生效條件,當(dāng)窗口寬度大于580px時分屏顯示
}
},
更多配置詳見文檔:https://uniapp.dcloud.net.cn/tutorial/adapt.html
效果如下:

組件級適配:match-media組件
rightWindow等方案是頁面窗體級適配方案,適用于多頁面的組合分欄顯示,那么在同一個頁面內(nèi),不同組件根據(jù)適配方案除了傳統(tǒng)的媒體查詢外,uni-app提供了match-media組件
用法:
在match-media組件中放置內(nèi)容,并為該組件指定一組 media query 媒體查詢規(guī)則,如屏幕寬度。運行時,如屏幕寬度滿足查詢條件,則這個組件就會被展示,反之則隱藏。
<template>
<view class="component-style">
<!-- 這個寬度是整個屏幕寬度,不是分屏的寬度-->
<match-media :min-width="375" :max-width="768" >
<view class="min">
{{ text }}
</view>
<view class="min">
{{ text }}
</view>
</match-media>
<match-media :min-width="769">
<view class="max">
{{ text }}
</view>
<view class="max">
{{ text }}
</view>
</match-media>
</view>
</template>
<style scoped lang="less">
.component-style{
padding: 20px 10px;
border-radius: 4px;
.max{
font-size: 30px;
color: palevioletred;
}
.min{
font-size: 20px;
color: olive;
}
}
</style>
效果如下:
width<=580

width>580

rpx的寬度適應(yīng)
設(shè)計Mobile App時,設(shè)計師常會以 iPhone6 作為視覺稿的標(biāo)準(zhǔn),即按照750px屏幕寬度出圖;程序員以750px作為基準(zhǔn),根據(jù)設(shè)備實際尺寸,動態(tài)換算(縮放)出適合當(dāng)前設(shè)備屏幕的元素寬高。
這就是rpx(responsive pixel)的實現(xiàn)思路,只不過rpx由框架引擎動態(tài)換算元素尺寸,無需程序員寫代碼干預(yù)。
面向mobile端時,rpx是一種很理想的解決方案,因為各種移動設(shè)備的屏幕寬度差異不是很大,相對于750px微調(diào)縮放后的效果,可最大化的還原設(shè)計師的設(shè)計。
但是,一旦脫離移動設(shè)備,在pc屏幕,或者pad橫屏狀態(tài)下,因為屏幕寬度遠(yuǎn)大于750了。此時rpx根據(jù)屏幕寬度變化的結(jié)果就嚴(yán)重脫離了預(yù)期,大的慘不忍睹。
下面我們用一個32 x 32的icon為例
.icon-style{
width: 64rpx ; // 若設(shè)計稿寬度為 375px,icon在設(shè)計稿上的寬度為32px,那么icon在 uni-app 里面的寬度應(yīng)該設(shè)為(750 * 32 / 375)rpx
height: 64rpx ;
}
在小屏,顯示效果:


運行到1200px的pc端,經(jīng)過計算的icon = 102px,效果如下(icon太大了):

為此,在uni-app 2.9+起,新增了 rpx 按750px做基準(zhǔn)屏寬的生效范圍控制,即屏幕寬度超過某閥值(默認(rèn)為960px)后,將不再以屏幕實際寬度換算元素寬高,而改以固定屏幕寬度(默認(rèn)為375px)計算元素寬高
以上述圖文列表為例,當(dāng)屏幕寬度為1200px(大于960px)時,將采用固定的屏幕寬度(默認(rèn)375px)計算縮略圖的寬高,按照這個機制,pc端運行效果如下,相比上圖的放大變丑,展現(xiàn)更為理想優(yōu)雅。

pages.json配置如下
"globalStyle": {
"rpxCalcMaxDeviceWidth": 960, // rpx 計算所支持的最大設(shè)備寬度,單位 px,默認(rèn)值為 960
"rpxCalcBaseDeviceWidth": 375// 設(shè)備實際寬度超出 rpx 計算所支持的最大寬度時,rpx計算所采用的固定屏幕寬度,單位 px,默認(rèn)值為 375
},
當(dāng)然,開發(fā)者可在rpx寬度管控的基礎(chǔ)上,略作調(diào)整,實現(xiàn)更好的pc寬屏效果,如寬屏大于多少px時候,固定列表寬度且居中顯示,如下圖。實際應(yīng)用中,可采用前面介紹的分欄窗口,將列表在左側(cè)分欄中顯示。

總結(jié)
到此這篇關(guān)于uni-app PC端寬屏適配方案的文章就介紹到這了,更多相關(guān)uni-app PC端寬屏適配內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
xml分頁+ajax請求數(shù)據(jù)源+dom取結(jié)果實例代碼
最近做的一個項目里的某個小功能,主要是為了方便選擇數(shù)據(jù) 演示地址:由于有惡意程序,所以去掉地址2008-10-10
javascript 最常用的10個自定義函數(shù)[推薦]
如果不使用類庫或者沒有自己的類庫,儲備一些常用函數(shù)總是有好處的。2009-12-12
webpack 如何同時輸出壓縮和未壓縮的文件的實現(xiàn)步驟
這篇文章主要介紹了webpack 如何同時輸出壓縮和未壓縮的文件的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
利用JS響應(yīng)式修改vue實現(xiàn)頁面的input值
這篇文章主要給大家介紹了關(guān)于如何利用JS響應(yīng)式修改vue實現(xiàn)頁面的input值,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用JS具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
微信小程序如何調(diào)用json數(shù)據(jù)接口并解析
這篇文章主要介紹了微信小程序如何調(diào)用json數(shù)據(jù)接口并解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-06-06
基于javascript實現(xiàn)按圓形排列DIV元素(三)
本篇文章主要介紹基于javascript實現(xiàn)按圓形排列DIV元素的方法,此文著重于介紹怎樣實現(xiàn)圖片按橢圓形轉(zhuǎn)動,需要的朋友來看下吧2016-12-12
用javascript實現(xiàn)頁內(nèi)搜索的腳本代碼
用javascript實現(xiàn)頁內(nèi)搜索的腳本代碼...2007-08-08

