使用 uni-app 开发的 H5 页面,为了根据屏幕宽度自适应,我们一般都采用官方推荐的动态单位 rpx,但是在 PC 端展现的时候可能出现文字等相关元素太大,导致页面错乱或不美观。

为了解决该问题,我们可以限定页面最大宽度,超过就固定宽度,并居中显示。

比如 笔者 要开发一个 uni-app 应用,在 PC 端当浏览器可见宽度超过 375px 时,页面固定宽度 375px,并居中显示。具体步骤如下:

去掉 H5 端页面原生导航栏

在 pages.json 文件中,pages->style->h5 节点中 titleNView 设置成 false。

{
    "path": "pages/index/index",
    "style": {
        "navigationBarTitleText": "uni-app",
        "h5": {
            "titleNView": false
        }
    }
}

限制 H5 端页面宽度

在 App.vue 文件中,<style></style> 中增加相应的样式,控制页面最大 375px 且居中显示。

/* #ifdef H5 */
body {
    max-width: 375px;
    margin: auto;
}
/* #endif */

这里通过条件编译限制了该样式只在 H5 端生效。

自定义模板

工程根目录下新建一个 html 文件,从 官网 上复制下面的基本模板内容到这个 html 文件,并在 manifest.json->h5->template 节点中关联这个 html 文件的路径,文件名随意,只要符合文件名命名规范就可以了。

<!DOCTYPE html>
<html lang="zh-CN">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
        <title>
            <%= htmlWebpackPlugin.options.title %>
        </title>
        <script>
            document.addEventListener('DOMContentLoaded', function() {
                document.documentElement.style.fontSize = document.documentElement.clientWidth / 20 + 'px'
            })
        </script>
        <link rel="stylesheet" href="<%= BASE_URL %>static/index.<%= VUE_APP_INDEX_CSS_HASH %>.css" />
    </head>
    <body>
        <noscript>
            <strong>Please enable JavaScript to continue.</strong>
        </noscript>
        <div id="app"></div>
        <!-- built files will be auto injected -->
    </body>
</html>

根据页面宽度,限制 rpx 对应字体等元素编译后的 px 大小

修改上面模板中的 <script></script> 中的内容,修改成如下代码:

<script>
    document.addEventListener('DOMContentLoaded', function() {
        window.innerWidth = Math.min(window.innerWidth, 375)
        document.documentElement.style.fontSize = window.innerWidth / 20 + 'px'
    })
</script>

该部分为本文的核心,网络上比较难找,暂时还没找到其他的解决方式。如有更好的解决方案,欢迎留言交流。另外,可根据实际情况搜索全文中的 375 替换成其他限定宽度。

附:Demo下载

假设浏览器宽度 600px(大于 375px 的任意宽度),设置了页面最大宽度 375px,“文字大小测试”字体为48rpx,最终demo运行效果如下(html节点最大字号被限定为375/20=18.75px,“文字大小测试”最大字号被限定为48rpx/750*375=24px):

另外,也可以用嵌套 iframe 的方式来实现,具体可以看 官方示例 以及 官方示例源码