uni-app?PC端寬屏適配方案圖文詳解
前言
隨著互聯(lián)網(wǎng)的發(fā)展,iOS、Android、H5以及各種小程序快應(yīng)用層出不窮,隨之而來的問題就是如何用一套代碼,適配多個平臺,其中uni-app表現(xiàn)優(yōu)異,已經(jīng)實現(xiàn)了手機(jī)端全覆蓋,支持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)計算縮略圖的寬高,按照這個機(jī)制,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-10javascript 最常用的10個自定義函數(shù)[推薦]
如果不使用類庫或者沒有自己的類庫,儲備一些常用函數(shù)總是有好處的。2009-12-12webpack 如何同時輸出壓縮和未壓縮的文件的實現(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