UzumakiItachi
首页
  • JavaSript
  • Vue

    • Vue2
    • Vue3
  • React

    • React_18
  • WebPack
  • 浏览器相关
  • 工程化相关
  • 工作中遇到的问题以及解决方案
  • Git
  • 面试
  • 学习
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
  • 个人产出
  • 实用工具
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

UzumakiItachi

起风了,唯有努力生存。
首页
  • JavaSript
  • Vue

    • Vue2
    • Vue3
  • React

    • React_18
  • WebPack
  • 浏览器相关
  • 工程化相关
  • 工作中遇到的问题以及解决方案
  • Git
  • 面试
  • 学习
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
  • 个人产出
  • 实用工具
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • WebPack

  • 浏览器相关

  • 工程化相关

  • 工作中遇到的问题以及解决方案

    • 解决浏览器返回页面不刷新的问题
    • 前端如何下载文件流
    • uniapp APP端实现更新最新安装包
    • GitHub Actions Process completed with exit code 128 的解决方案
    • 保留文字输入的空格和换行
    • 缩放适配大屏页
      • 前言
      • 开始
      • 解决白边问题
      • demo
      • 总结
    • 一次性加载n多张图片的性能优化方案
    • NOT-Cool 低代码页面架构思路
    • h5下载vcard快捷保存联系人信息
    • 结合elementui实现的动态主题
    • 解决monorepo场景下子包作为依赖项在开发和生产暴露文件的问题
    • 给npm配置github令牌
    • 移动端电子印章解决方案
    • 小程序canvas绘制海报中遇到的一些坑
    • 超详细的虚拟列表实现过程
    • 小程序实现一个事件中心
    • 请求超时后如何优雅的重新请求
    • 超详细的大文件上传实现方案
    • 仿抖音短视频组件实现方案
    • swiper渲染大量数据的优化方案
    • 前端检测更新,自动刷新网页
  • Git

  • Vite

  • 一些小工具

  • 算法

  • 服务器

  • HTTP

  • 技术
  • 工作中遇到的问题以及解决方案
hanhanbuku
2023-06-28
目录

缩放适配大屏页

# 前言

此前需要开发一个大屏活动页,相信提到大屏页面。适配是一个让人非常头疼的问题。需要适配各种分辨率,显然媒体查询之类的方案是不可取的。总结下来也只有rem适配以及通过transform:scale来实现。 rem的话大家都知道怎么做,就不多说了。下面主要介绍一下scale的方式应该如何去适配。

# 开始

首先通过缩放去适配的话,我们需要计算出一个缩放比。因为有的屏幕宽比高大而有的则是高比宽大。通常我们是取屏幕的宽高比大于设计稿的宽高比则采用宽的比例否则采用高的比例。也就是下面这样

      if (
    (document.documentElement.clientWidth / document.documentElement.clientHeight) < (designDraftWidth / designDraftHeight)
      ) {
        scale = document.documentElement.clientWidth / designDraftWidth
      } else {
        scale = document.documentElement.clientHeight / designDraftHeight
      }
1
2
3
4
5
6
7

有了这个宽高比,我们接下来只需要将他设置到跟标签的transform:scale上就行了。

# 解决白边问题

通过上述设置已经完成了一个最基本的缩放适配。但是使用过的同学会发现,有白边。也就是网页撑不满整个屏幕了。这个时候就需要上黑科技了

当我们的网页被缩放到某个大小后,我们只需要将对应的宽或者高放大回原来的x倍,就可以还原整个网页的大小。也就是达到了填充满屏幕的效果

例如我们此时的缩放比是0.8,那么相对应的需要把宽或者高放大1.8

      if (
    document.documentElement.clientWidth
    / document.documentElement.clientHeight
    < designDraftWidth / designDraftHeight
) {
    scale = document.documentElement.clientWidth / designDraftWidth
    document.querySelector('#screen').style.height = `${
        document.documentElement.clientHeight / scale
    }px`
    document.querySelector('#screen').style.width = `${designDraftWidth}px`
} else {
    scale = document.documentElement.clientHeight / designDraftHeight
    document.querySelector('#screen').style.width = `${
        document.documentElement.clientWidth / scale
    }px`
    document.querySelector(
        '#screen',
    ).style.height = `${designDraftHeight}px`
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

如果采用的是宽度比,则把高度放大,宽度采用设计稿的宽度。相反则把宽度放大,高度采用设计稿的高度。

# demo

  mounted() {
    window.onresize = () => this.handleScreenAuto()
  },
methods:{
    handleScreenAuto() {
        const designDraftWidth = 1920 // 设计稿的宽度
        const designDraftHeight = 1080 // 设计稿的高度
        // 根据屏幕的变化适配的比例
        let scale = 0
        // 缩小之后将宽高等比放大填满屏幕,比如整体缩小0.8倍,那宽高放大十分之八就可以还原原来的大小。
        if (
            document.documentElement.clientWidth
            / document.documentElement.clientHeight
            < designDraftWidth / designDraftHeight
        ) {
            scale = document.documentElement.clientWidth / designDraftWidth
            document.querySelector('#screen').style.height = `${
                document.documentElement.clientHeight / scale
            }px`
            document.querySelector('#screen').style.width = `${designDraftWidth}px`
        } else {
            scale = document.documentElement.clientHeight / designDraftHeight
            document.querySelector('#screen').style.width = `${
                document.documentElement.clientWidth / scale
            }px`
            document.querySelector(
                '#screen',
            ).style.height = `${designDraftHeight}px`
        }
        // 缩放比例
        // document.querySelector('#screen').style.transform = `scale(${scale})`
        document.querySelector('#screen').style.zoom = `${scale}`
    },
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
.content {
  width: 100%;
  height: 100%;
  overflow: hidden;
}
.screen-wrapper {
  height: 100vh;
  width: 100vw;
  background: linear-gradient(180deg, #ffe1e9 0%, #ecf1ff 112.41%), #ffffff;
  .screen {
    display: inline-block;
    transform-origin: 0 0;
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 总结

这种方式适配大屏最省事,但是也很简陋。会出现网页模糊的问题,并且如果网页中有canvas的话还会出现点击事件和hover事件有偏差的问题,网上可以搜一下解决方案。如果能接受的话可以采用这种方案,如果接受不了的还是换rem方案吧,rem适配也很简单。

编辑 (opens new window)
上次更新: 2023/06/28, 17:24:39
保留文字输入的空格和换行
一次性加载n多张图片的性能优化方案

← 保留文字输入的空格和换行 一次性加载n多张图片的性能优化方案→

最近更新
01
前端检测更新,自动刷新网页
06-09
02
swiper渲染大量数据的优化方案
06-06
03
仿抖音短视频组件实现方案
02-28
更多文章>
Theme by Vdoing | Copyright © 2023-2025 UzumakiItachi | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式