图文详解uni-app PC端宽屏适配方案

news/2025/3/14 0:59:08/

图文详解uni-app PC端宽屏适配方案

随着互联网的发展,iOS、Android、H5以及各种小程序快应用层出不穷,随之而来的问题就是如何用一套代码,适配多个平台,其中uni-app表现优异,已经实现了手机端全覆盖,支持iOS、Android、H5、微信小程序、阿里小程序、百度小程序、字节跳动小程序、QQ小程序、快应用、360小程序,并且在各端均有优异的运行性能。并且从2.9版本起,uni-app 进一步提供了PC等宽屏的适配方案,完成了大统一。

具体怎么用,我们下面用一个简单的案列让大家直观感受:

比如现在的需求是,一个列表卡片,点击卡片进入卡片详情页,在小程序,ios, Android, 以及h5上表现形式如下:

  • 小程序
    在这里插入图片描述

  • H5
    在这里插入图片描述

但是我想在宽屏pc端兼容这个需求,现在左边固定宽度展示列表卡片,右边剩余宽度展示选中的卡片详情,表现形式如下:
在这里插入图片描述

Uni-app具体做法如下:

  • 窗体级适配:leftwindow、rightwindow、topwindow等分栏
  • 组件级适配:match-media组件
  • rpx的宽屏响应
  1. 窗体级适配:leftwindow分栏
  • 新建rightWindow.vue页面(这个页面不需要从写,只需要复用原来的组件detail.vue)

    <template>// 原来的组件detail.vue<detail ref="detailPage" :text="detail" ></detail>
    </template><script>export default {data(){return {detail:''}},created(e) {//监听自定义事件,该事件由左侧列表页的点击触发uni.$on('updateDetail', (e) => {this.detail = decodeURIComponent(e.detail)// 执行 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) { //若为宽屏,则触发右侧分栏详情页的自定义事件,通知右侧窗体刷新新闻详情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 //生效条件,当窗口宽度大于580px时分屏显示}},
    

更多配置详见文档:https://uniapp.dcloud.net.cn/tutorial/adapt.html

效果如下:
在这里插入图片描述

  1. 组件级适配:match-media组件

rightWindow等方案是页面窗体级适配方案,适用于多页面的组合分栏显示,那么在同一个页面内,不同组件根据适配方案除了传统的媒体查询外,uni-app提供了match-media组件

用法:

match-media组件中放置内容,并为该组件指定一组 media query 媒体查询规则,如屏幕宽度。运行时,如屏幕宽度满足查询条件,则这个组件就会被展示,反之则隐藏。

<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
    在这里插入图片描述

  1. rpx的宽度适应

设计Mobile App时,设计师常会以 iPhone6 作为视觉稿的标准,即按照750px屏幕宽度出图;程序员以750px作为基准,根据设备实际尺寸,动态换算(缩放)出适合当前设备屏幕的元素宽高。

这就是rpx(responsive pixel)的实现思路,只不过rpx由框架引擎动态换算元素尺寸,无需程序员写代码干预。

面向mobile端时,rpx是一种很理想的解决方案,因为各种移动设备的屏幕宽度差异不是很大,相对于750px微调缩放后的效果,可最大化的还原设计师的设计。

但是,一旦脱离移动设备,在pc屏幕,或者pad横屏状态下,因为屏幕宽度远大于750了。此时rpx根据屏幕宽度变化的结果就严重脱离了预期,大的惨不忍睹。

下面我们用一个32 x 32的icon为例

.icon-style{width: 64rpx ;  // 若设计稿宽度为 375px,icon在设计稿上的宽度为32px,那么icon在 uni-app 里面的宽度应该设为(750 * 32 / 375)rpxheight: 64rpx ;
}

在小屏,显示效果:
在这里插入图片描述
在这里插入图片描述

运行到1200px的pc端,经过计算的icon = 102px,效果如下(icon太大了):

在这里插入图片描述

为此,在uni-app 2.9+起,新增了 rpx 按750px做基准屏宽的生效范围控制,即屏幕宽度超过某阀值(默认为960px)后,将不再以屏幕实际宽度换算元素宽高,而改以固定屏幕宽度(默认为375px)计算元素宽高

以上述图文列表为例,当屏幕宽度为1200px(大于960px)时,将采用固定的屏幕宽度(默认375px)计算缩略图的宽高,按照这个机制,pc端运行效果如下,相比上图的放大变丑,展现更为理想优雅。
在这里插入图片描述

pages.json配置如下

	"globalStyle": {"rpxCalcMaxDeviceWidth": 960, // rpx 计算所支持的最大设备宽度,单位 px,默认值为 960"rpxCalcBaseDeviceWidth": 375// 设备实际宽度超出 rpx 计算所支持的最大宽度时,rpx计算所采用的固定屏幕宽度,单位 px,默认值为 375},

当然,开发者可在rpx宽度管控的基础上,略作调整,实现更好的pc宽屏效果,如宽屏大于多少px时候,固定列表宽度且居中显示,如下图。实际应用中,可采用前面介绍的分栏窗口,将列表在左侧分栏中显示。

在这里插入图片描述


http://www.ppmy.cn/news/384994.html

相关文章

宽屏文章列表 html,HTML5宽屏简洁文章资讯博客织梦模板

★模板介绍★ HTML5宽屏简洁文章资讯博客织梦CMS整站SEO模板&#xff0c;测试完整无错&#xff0c;兼容主流浏览器。 模板包含安装说明&#xff0c;并包含测试数据。 本模板基于DEDECms 5.7 UTF-8设计&#xff0c;需要GBK版本的请自己转换或使用在线转换工具转换。 如果您购买后…

宽屏图片轮播html,jQuery实现宽屏图片轮播实例教程

本文实例讲述了jQuery实现宽屏图片轮播实例教程。分享给大家供大家参考。具体如下&#xff1a; 运行效果截图如下&#xff1a; 引入jquery库 构建html 整个代码分为三部分&#xff1a; 1、加载部分loadding &#xff1b; 2、图片部分&#xff0c;这里图片只能是4张&#xff0c;…

软件测试工程师如何推进项目进度?

在软件研发中&#xff0c;有一种思想叫TDD&#xff0c;即测试驱动开发&#xff0c;TDD是敏捷方法中的一项核心实践&#xff0c;其原理是在开发功能代码之前&#xff0c;先编写单元测试用例代码&#xff0c;对要编写的函数或类明确测试方法后&#xff0c;再进行设计与编码。 本…

面向制造业的IT管理

制造业的数字化和工业4.0技术的应用&#xff0c;使制造商能够优化生产&#xff0c;转变价值链&#xff0c;创造卓越的客户体验。随着行业采用新的技术&#xff0c;如人工智能(AI)、工业物联网(IIOT)和其他策略&#xff0c;制造商需要找到有效的方法来监控和管理他们的生产环境、…

MongoDB 索引操作引起的 Crash

摘要&#xff1a;本文详细阐述了根据引起 Crash 操作进行从配置到源码的分析过程&#xff0c;层层递进&#xff0c;定位复现并给出解决故障方案。 作者&#xff1a;徐耀荣 爱可生南区交付服务部 DBA 团队成员&#xff0c;主要负责 MySQL 故障处理以及相关技术支持。爱好电影&am…

设计模式相关内容介绍

文章目录 1、软件设计模式的背景2、软件设计模式的概念3、学习设计模式的必要性4、设计模式分类 1、软件设计模式的背景 "设计模式"最初并不是出现在软件设计中&#xff0c;而是被用于建筑领域的设计中。1977年美国著名建筑大师、加福尼亚大学伯克分校环境结构中心主…

vue02---事件指令/属性指令/style和class/条件渲染/列表渲染/事件处理/数据双向绑定/过滤案例

事件指令 vm对象 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><script src"./js/vue.js"></script> </head> <body> <div id"app…

剖析Linux文件系统

Linux 文件系统体系结构是一个对复杂系统进行抽象化的有趣例子。通过使用一组通用的 API 函数&#xff0c;Linux 可以在许多种存储设备上支持许多种文件系统。例如&#xff0c;read 函数调用可以从指定的文件描述符读取一定数量的字节。read 函数不了解文件系统的类型&#xff…