前端各种分辨率问题总结

简介: 前端各种分辨率问题总结

1.分类


第一种是纯使用px单位,没有做适配的项目

如果你是这个类型,那么这篇文章看对了,待会我会说以下这种类型的项目做适配的额完美方法。

第二种是做大屏适配的,即无滚动条但要跟随屏幕大小自适应的

这种类型的项目在这篇文章种也可获得较为完美的解决方式

第三种是使用rem适配的,但是项目有问题的

使用此方法带来的问题是,当在低分辨率的情况下,字体会变大一些,或者项目整体看起来好像有些微变化,反正看着和设计图不太像。

2.对于使用px单位未做适配的项目改造方案


以1920*1080设计图为例:

核心是根据页面的宽度除以1920,然后设置body的zoom属性

 mounted () {
    this.bodyScale()
  },
//method中
bodyScale () {
       //获取当前分辨率下的可是区域宽度
      var devicewidth = document.documentElement.clientWidth
      var scale = devicewidth / 1920 // 分母——设计稿的尺寸
      document.body.style.zoom = scale//放大缩小相应倍数
      alert(scale)
    }

3.对于大屏可视化适配方案


主要是横向和纵向不要有滚动条,使用的技术主要是scale缩放技术,其次是rem,这里以主流的scale方案

第一步, src目录下utils文件下新建drawMixin.js文件,将以下代码粘贴进去


// 屏幕适配 mixin 函数
// * 默认缩放值
const scale = {
  width: '1',
  height: '1',
}
// * 设计稿尺寸(px)
const baseWidth = 1920
const baseHeight = 1080
// * 需保持的比例(默认1.77778)
const baseProportion = parseFloat((baseWidth / baseHeight).toFixed(5))
export default {
  data() {
    return {
      // * 定时函数
      drawTiming: null
    }
  },
  mounted () {
    this.calcRate()
    window.addEventListener('resize', this.resize)
  },
  beforeDestroy () {
    window.removeEventListener('resize', this.resize)
  },
  methods: {
    calcRate () {
      const appRef = this.$refs["appRef"]
      if (!appRef) return 
      // 当前宽高比
      const currentRate = parseFloat((window.innerWidth / window.innerHeight).toFixed(5))
      if (appRef) {
        if (currentRate > baseProportion) {
          // 表示更宽
          scale.width = ((window.innerHeight * baseProportion) / baseWidth).toFixed(5)
          scale.height = (window.innerHeight / baseHeight).toFixed(5)
          appRef.style.transform = `scale(${scale.width}, ${scale.height}) translate(-50%, -50%)`
        } else {
          // 表示更高
          scale.height = ((window.innerWidth / baseProportion) / baseHeight).toFixed(5)
          scale.width = (window.innerWidth / baseWidth).toFixed(5)
          appRef.style.transform = `scale(${scale.width}, ${scale.height}) translate(-50%, -50%)`
        }
      }
    },
    resize () {
      clearTimeout(this.drawTiming)
      this.drawTiming = setTimeout(() => {
        this.calcRate()
      }, 200)
    }
  },
}

第二步,在根组件如app.vue或index.vue文件(页面最外层的标签)写入以下代码


我用的是mixin混入,如果不想这么搞,可以按部就班的把drawMixin.js里面的数据放在该放的位置上即可

<div id="index" ref="appRef"> //加一个ref
import drawMixin from "../utils/drawMixin"
export default {
  mixins: [drawMixin],
  data () {
    return {
    }
  }}

第三步,设置根标签的样式


这一步很重要,具体标签名根据自己项目来,就是页面居中,脱离文档流,加一个溢出隐藏,就不会出现滚动条了。

#app {
  width: 1920px;
  height: 1080px;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  transform-origin: left top;
  overflow: hidden;
    }

小结:


这个方案非常适合大屏项目,我在想能不能用于其他类型的项目呢,尝试了一番后发现都不太理想,主要问题在于滚动条的处理上,如果你有好的方法,不妨评论区交流一番。

4.使用rem的


第一个问题是在低分辨率下字体有些大的问题

是因为浏览器最小字体大小是12px,可以使用缩放transform:scale()。如:-webkit-transform: scale(0.5)

还有一个问题,就是使用rem设置如elementUI这种第三方Ui框架,这种底层样式都是用px单位写的,所以我们需要将px转化为rem单位

转换的方法如下有两个:


先说最简便的,如果你使用vscode且安装了pxtorem插件,只需要全局搜索px,然后ALT+Z全局替换并转换rem单位即可。

其次可以封装一个方法用于转换:

在vue项目的/node_modules/element-ui/lib/theme-chalk/index.css 路径下找到index.css文件,它就是elementUl的css样式文件,它里面都是用px做单位的,然后使用下面的函数将其转化

px和rem单位互转,参数介绍:

content: 样式表的内容 (style里到css内容),

unit: 需要替换的单位名称 (例 px),

updateUnit: 替换后的单位名称 (例 rem),

rule: 单位换算规则,多少rem = px || px = rem ,

例如:当rule为100时即表示 1rem = 100px

  function pxAndRemInterturn({content,unit,rule,updateUnit}){
    rule = rule || 100
    if(!rule)return content;
    const reg = {
      px : /[\:]*[\s]*[-]*[\s]*[0-9]*[\.]*[0-9]*\p\x/g,
      rem: /[\:]*[\s]*[-]*[\s]*[0-9]*[\.]*[0-9]*rem/g,
      number: /[0-9]*[\.]*[0-9]*/g
    }
    // 获取到所有匹配的内容
    const res = content.match(reg[unit])
    // 传进来的是正则匹配的结构内容
    function getRightData(arr){
      const result = []
      for(let  i = 0; i <arr.length;i++){
        result.push(Number(arr[i].replace(new RegExp(' ', "gm"), '').replace(':','').replace(unit,'')))
      }
      return result
    }
    const rightData = getRightData(res)
    // 单位换算
    function unitConversion({num,unit,updateUnit,rule}){
      let res = ''
      if(unit === 'px' && updateUnit === 'rem'){
        res = num / rule
      }else if(unit === 'rem' && updateUnit === 'px'){
        res = num * rule
      }
      return  ' ' + res + updateUnit
    }
    for(let i=0;i < rightData.length;i++){
      let txt = unitConversion({
        num:rightData[i],
        unit,
        updateUnit,
        rule
      })
      if(res[i].indexOf(':') >= 0){
        txt = ': '+ txt
      }
      content = content.replace(res[i],txt)
    }
    return content
  }
相关文章
|
2月前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
185 2
|
2月前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
49 0
|
2月前
|
人工智能 自然语言处理 运维
前端大模型应用笔记(一):两个指令反过来说大模型就理解不了啦?或许该让第三者插足啦 -通过引入中间LLM预处理用户输入以提高多任务处理能力
本文探讨了在多任务处理场景下,自然语言指令解析的困境及解决方案。通过增加一个LLM解析层,将复杂的指令拆解为多个明确的步骤,明确操作类型与对象识别,处理任务依赖关系,并将自然语言转化为具体的工具命令,从而提高指令解析的准确性和执行效率。
|
2月前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
|
2月前
|
机器学习/深度学习 弹性计算 自然语言处理
前端大模型应用笔记(二):最新llama3.2小参数版本1B的古董机测试 - 支持128K上下文,表现优异,和移动端更配
llama3.1支持128K上下文,6万字+输入,适用于多种场景。模型能力超出预期,但处理中文时需加中英翻译。测试显示,其英文支持较好,中文则需改进。llama3.2 1B参数量小,适合移动端和资源受限环境,可在阿里云2vCPU和4G ECS上运行。
127 1
|
2月前
|
前端开发 算法 测试技术
前端大模型应用笔记(五):大模型基础能力大比拼-计数篇-通义千文 vs 文心一言 vs 智谱 vs 讯飞vsGPT
本文对比测试了通义千文、文心一言、智谱和讯飞等多个国产大模型在处理基础计数问题上的表现,特别是通过链式推理(COT)提示的效果。结果显示,GPTo1-mini、文心一言3.5和讯飞4.0Ultra在首轮测试中表现优秀,而其他模型在COT提示后也能显著提升正确率,唯有讯飞4.0-Lite表现不佳。测试强调了COT在提升模型逻辑推理能力中的重要性,并指出免费版本中智谱GLM较为可靠。
前端大模型应用笔记(五):大模型基础能力大比拼-计数篇-通义千文 vs 文心一言 vs 智谱 vs 讯飞vsGPT
|
3月前
|
SpringCloudAlibaba JavaScript 前端开发
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
分布式组件、nacos注册配置中心、openfegin远程调用、网关gateway、ES6脚本语言规范、vue、elementUI
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
|
4月前
|
存储 前端开发 JavaScript
前端语言串讲 | 青训营笔记
前端语言串讲 | 青训营笔记
51 0
|
6月前
|
JSON 前端开发 JavaScript
前端Ajax、Axios和Fetch的用法和区别笔记
前端Ajax、Axios和Fetch的用法和区别笔记
121 2
|
6月前
|
前端开发 JavaScript 数据库
如何实现前后端分离-----前端笔记
如何实现前后端分离-----前端笔记