scss使用自定义函数实现单位像素随屏幕比例动态缩放

vue中通过变量和scss函数来动态实现动态缩放像素

简单来说就是比例缩小时,像素单位变大,从而字体大小相对不变,以下仅处理比例缩小的状况

自定义一个属性--size,初始值为1px

template

html 复制代码
<template>
  <div class="home" style="--size:1px">
    hello world!
  </div>
</template>

map为:{100: 1, 90: 1.1, 80: 1.2, 75: 1.3, 67: 1.5, 50: 2, 33: 3, 25: 4 }

  • 屏幕100%时,size=1 => mpx(1) => 1px
  • 屏幕90%时,size=1.1 => mpx(1) => 1.1px
  • ......

js

javascript 复制代码
export default {
  name: "Index",
  data() {
    return {
      // 屏幕缩放比例对应的zoom值
      map = {100: 1, 90: 1.1, 80: 1.2, 75: 1.3, 67: 1.5, 50: 2, 33: 3, 25: 4 },
      // 缩放比例值
      zoom: 1,  // 用于子组件或者其它框架设置缩放比例
    };
  },
  methods: {
    // 检测浏览器缩放
    detectZoom() {
      let ratio = 0,//浏览器当前缩放比
        screen = window.screen,//获取屏幕
        ua = navigator.userAgent.toLowerCase();//判断登陆端是pc还是手机

      if (window.devicePixelRatio !== undefined) {
        ratio = window.devicePixelRatio;
      }
      else if (~ua.indexOf('msie')) {
        if (screen.deviceXDPI && screen.logicalXDPI) {
          ratio = screen.deviceXDPI / screen.logicalXDPI;
        }
      }
      else if (window.outerWidth !== undefined && window.innerWidth !== undefined) {
        ratio = window.outerWidth / window.innerWidth;
      }

      if (ratio) {
        ratio = Math.round(ratio * 100);
      }
      return ratio
    },

    // 屏幕变化,计算css的size变量
    calcSize() {
      let map = { 100: 1, 90: 1.1, 80: 1.2, 75: 1.3, 67: 1.5, 50: 2, 33: 3, 25: 4 }
      let ratio = this.detectZoom();
      let size = map[ratio] || 1;
      this.zoom = size;
      // 重设--size属性的值
      document.querySelector('.home').style.cssText = `--size: ${size}px`
      // document.getElementsByClassName('home')[0].style.setProperty("--size", size + "px");
    }
  },
  mounted() {
    this.calcSize();
    window.addEventListener('resize', () => {
      // 首页才响应
      if (this.$route.name == 'Index') {
        this.calcSize();
      }
    });
  }
}

calcSize()中重设了--size的值后,触发函数,在函数在使用calc()计算最新的值,从而实现缩放控制。

scss

css 复制代码
<style scoped lang="scss">
// 在scss中使用函数
@function mpx($size: 1) {
  @return calc(#{$size} * var(--size))	// 入参$size=10, 当属性--size=1.1px时 return 11px
}

.home{
  font-size: mpx(10); // --size=1时,font-size=10; --size=1.1时,font-size=11	单位根据--size来变换
}
</style>

css中最关键的是使用var()来定义一个属性,然后在js中修改这个属性的值

https://blog.csdn.net/weixin_45977607/article/details/122473489

https://juejin.cn/post/7070762204286435359

相关推荐
IT_陈寒3 小时前
Java中equals方法比了个寂寞?原来这才是正确的重写姿势
前端·人工智能·后端
默_笙3 小时前
🚓 分诊台与拆题术:让 RAG 学会判断和规划
前端·javascript
CopyCode3 小时前
用 AI 迁项目有多爽?我把 Webpack 迁 Vite 的全过程记下来了
前端·架构
去伪存真3 小时前
Electron 自动化发布指南:GitHub Actions 跨平台打包全纪录
前端·electron
计算机魔术师3 小时前
OpenAI智能体失控闯进美国政府网站,53张用户图片外泄背后
前端
颜进强3 小时前
14 · NestJS ExecutionContext 执行上下文:守卫、拦截器、过滤器拿到的"同一个 context",为什么能力不一样?
前端·后端·ai编程
程序员Flycan3 小时前
🚀 跨域终结者:前端代理服务器(Proxy)原理解析与配置总结
前端
怕浪猫3 小时前
顶级模型一句话,AI 写出了能玩的 QQ飞车
前端·面试·github
huakoh3 小时前
MCP 报错分不清?先看响应里是 result 还是 error
前端
呃呃呃呃ex3 小时前
10. 现代前端工程化:ES6 React 项目实战与原理解析
前端·javascript