• vue.js 3.2.20: 用rem实现移动端和pc的兼容


    一,用vue实现浏览器兼容的目标:

    1,      主要为了实现按照设计稿给出的宽度来设计页面,

           通常设计稿会给出750px或640px的宽度,

           我们在设置页面上元素宽度时要把象素转为rem,

           这样实现不管浏览器的宽度是多少,

           页面的表现要一致

           另外当pc端浏览时,把内容居中显示即可(这个视业务需求定,如pc页面显示和移动页面显示不一致有时会另开发一套前端)

    2,   demo的地址:

    https://gitee.com/liuhongdi/remdemo

    说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest

             对应的源码可以访问这里获取: https://github.com/liuhongdi/
             或: https://gitee.com/liuhongdi

    说明:作者:刘宏缔 邮箱: 371125307@qq.com

    二,编写代码:

    1,main.js

    import { createApp } from 'vue'
    import App from './App.vue'
    
    //判断是否移动端的函数
    const isMobileFunc = () => {
        let flag = navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i);
        if (flag === null) {
            return 0;
        } else {
            return 1;
        }
    };
    
    //设置html的字号大小,作为rem的计算依据
    const setHtmlFontSize = () => {
        let designWidth = 750;
        const htmlDom = document.getElementsByTagName('html')[0];
        let htmlWidth = document.documentElement.clientWidth || document.body.clientWidth;
        if (isMobileFunc() === 1) {
            //移动端
            htmlDom.style.fontSize = `${htmlWidth / designWidth}px`;
        } else {
            //非移动端:
            //console.log('htmlWidth:'+htmlWidth);
            let dest = htmlWidth * 0.36;
            if (dest < 360) {
                dest = 360;
            }
            htmlDom.style.fontSize = `${dest / designWidth}px`;
        }
    };
    
    window.onresize = setHtmlFontSize;
    setHtmlFontSize();
    
    createApp(App).mount('#app')

    2,App.vue

    <template>
    
      <!--非移动端时显示-->
      <div v-if="ismobile == 0" style="100%;height:100vh;display: flex;justify-content: center;">
        <div style="36%;min-360px;height:100%;overflow: hidden;background: #ffff00;">
          <Home />
        </div>
      </div>
      <!--移动端时显示-->
      <Home v-if="ismobile == 1" />
    </template>
    
    <script>
    import {ref} from "vue";
    //import HelloWorld from './components/HelloWorld.vue'
    import Home from './components/Home.vue'
    export default {
      name: 'App',
      components: {
        Home
      },
      setup() {
        //是否移动端
        const ismobile = ref(0);
        //判断是否移动端的函数
        const isMobileFunc = () => {
          let flag = navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i);
          if (flag === null) {
            return 0;
          } else {
            return 1;
          }
        };
        if (isMobileFunc() === 1) {
          ismobile.value = 1;
        } else {
          ismobile.value = 0;
        }
        return {
          ismobile,
          isMobileFunc,
        };
      },
    }
    </script>
    
    <style>
    #app {
      font-family: Avenir, Helvetica, Arial, sans-serif;
      -webkit-font-smoothing: antialiased;
      -moz-osx-font-smoothing: grayscale;
      /*text-align: center;*/
      color: #2c3e50;
      /*margin-top: 60px;*/
    }
    body {
      display: block;
      margin: 0px;
    }
    </style>

    3,Home.vue

    <template>
    <div style="100%;height:100%;">
      <div style="margin-top: 30rem;margin-left: 225rem;300rem;height:400rem;background: #ff0000;">
        <span style="font-size: 60rem;">首页</span><br/>
        <span style="font-size: 50rem;">首页</span><br/>
        <span style="font-size: 40rem;">首页</span><br/>
        <span style="font-size: 30rem;">首页</span><br/>
        <span style="font-size: 20rem;">首页</span><br/>
        <span style="font-size: 10rem;">首页</span>
      </div>
      <div style="margin-top: 30rem;750rem;height:486rem;background: #ff00ff;">
        <img src="@/assets/img/godzilla.jpg" style="700rem;margin-left:25rem;">
      </div>
    </div>
    </template>
    
    <script>
    export default {
      name: "Home"
    }
    </script>
    
    <style scoped>
    
    </style>

    三,测试效果:

    pc浏览器:

    iphonex

    ipad:

    四,查看vue的版本:

    liuhongdi@lhdpc:/data/vue/remdemo$ npm list vue
    remdemo@0.1.0 /data/vue/remdemo
    ├─┬ @vue/cli-plugin-babel@4.5.13
    │ └─┬ @vue/babel-preset-app@4.5.13
    │   └── vue@3.2.20 deduped
    └─┬ vue@3.2.20
      └─┬ @vue/server-renderer@3.2.20
        └── vue@3.2.20 deduped
  • 相关阅读:
    记一次跳转
    html2canvas在生成图片过程中遇到的坑vue
    数组对象push新的元素,导致其他新复制的数据也发生改变,不是一一对应改变(深拷贝和浅拷贝)
    js生成的新结构点击事件不生效
    箭头函数和普通函数的区别
    vue (vue-cli主要写构建工具的使用)
    favicon.ico可能会遇到的的坑
    video不能在个别浏览器不能播放
    a标签的拨打电话、发邮件、QQ发消息,另外控件分享转发
    git使用的简单命令
  • 原文地址:https://www.cnblogs.com/architectforest/p/15392877.html
Copyright © 2020-2023  润新知