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


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

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

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

    template

    <template>
      <div class="home" style="--size:1px">
        hello world!
      div>
    template>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    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

    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();
          }
        });
      }
    }
    
    • 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
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

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

    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

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

    https://blog.csdn.net/weixin_45977607/article/details/122473489
    https://juejin.cn/post/7070762204286435359

  • 相关阅读:
    nginx负载均衡
    一道线段树相关算法题
    子连接中的参数传递
    字符串哈希
    【Android 屏幕适配】屏幕适配通用解决方案 ⑦ ( PercentRelativeLayout 百分比布局方案 | 该布局已废弃本方案仅做参考 )
    想学设计模式、想搞架构设计,先学学 UML 系统建模吧
    Java集成云打印机(芯烨云)——文档篇
    【Spring专题】「技术原理」从源码角度去深入分析关于Spring的异常处理ExceptionHandler的实现原理
    【OpenCV DNN】Flask 视频监控目标检测教程 08
    轻量封装WebGPU渲染系统示例<20>- 美化一下元胞自动机之生命游戏(源码)
  • 原文地址:https://blog.csdn.net/weixin_45286211/article/details/132018489