vue中使用flexiblejs和rem布局、媒体查询

flexiblejs+rem

一、下载flexiblejs插件或者自己直接引入

下载插件

 npm i lib-flexible -D

或者自己创建flexible.js

//整个函数是一个立即执行函数
//(function abx(){})();
(function flexible(window, document) {
    // 获取html
    var docEl = document.documentElement
        //获取设备像素比 pc端是1 移动端是2  这里用了逻辑中断 如果浏览器不是1 表示unfinded 那么dpr=1
        //window是浏览器窗口  window.devicePixelRatio如果没有定义 就给给他1
    var dpr = window.devicePixelRatio || 1

    // adjust body font size   修改body的文字大小
    function setBodyFontSize() {
        if (document.body) {
            document.body.style.fontSize = (12 * dpr) + 'px'
        } else {
            //DOMContentLoaded  dom加载完毕之后(无需等待图片、样式表)
            //这里用了一个递归 如果document.body没有加载完成 那么监听document 重新去给body的font设置大小
            document.addEventListener('DOMContentLoaded', setBodyFontSize)
        }
    }
    setBodyFontSize();

    // set 1rem = viewWidth / 10
    // 设置成24等份,设计稿时1920px的,这样1rem就是80px
    function setRemUnit() {
        // docEl是HTMLElement(HTMLElement 接口表示所有的 HTML 元素) 首先将clientWidth,即可视窗口分成10等分 
        //clientWidth = 宽度+padding  offsetWidth =宽度+padding+border
        var rem = docEl.clientWidth / 24
            //改成像素
        docEl.style.fontSize = rem + 'px'
    }

    setRemUnit()

    // reset rem unit on page resize
    //监听窗口的尺寸大小的变化 如何发生变化 重新去获取rem
    window.addEventListener('resize', setRemUnit)
        //pageshow会在以下几种情况下触发:①a标签超链接 ②F5或者刷新按钮 ③前进或者后退
        //解决兼容性问题-火狐浏览器 其中,有一个‘往返缓存’,这里面不仅存放着页面,还有dom js,实际上就是将他们存放到内存中
        //我们点击后退按钮时,不会进行刷新,这时候可以通过触发pageshow来实现
        //pageshow会在页面显示时,触发,无论页面是否来自缓存,在重新加载页面中,pageshow会在load事件出发之后进行触发,根据事件对象persisted
        //来判断pageshow的触发是否来自缓存 e.persisted为true表示页面来自缓存,这时候就需要 重新计算rem
    window.addEventListener('pageshow', function(e) {
        if (e.persisted) {
            setRemUnit()
        }
    })

    // detect 0.5px supports 让代码支持0.5px
    if (dpr >= 2) {
        var fakeBody = document.createElement('body')
        var testElement = document.createElement('div')
        testElement.style.border = '.5px solid transparent'
        fakeBody.appendChild(testElement)
        docEl.appendChild(fakeBody)
        if (testElement.offsetHeight === 1) {
            docEl.classList.add('hairlines')
        }
        docEl.removeChild(fakeBody)
    }
}(window, document))

二、在vue全局文件main.js中引入flexiblejs

import 'lib-flexible/flexible.js'

三、vscode中使用相关插件方便进行px与rem之间的转换

在这里插入图片描述
我自己使用的电脑宽度是1920px,开发就按照这个基准进行调试,将1920px分成24份,1920px/24 = 80px ,那么1rem = 80px
在这里插入图片描述
参考

媒体查询

这样当页面宽度发生变化的时候,改变html中的字体大小,这样后面我们使用rem给定其他字体或者盒子大小的时候,就可以跟随着浏览器窗口大小进行变化,注意,这里一定是html中的font-size

@media screen and (min-width: 640px) {

  html {
    font-size:16px; //页面宽度大于640px时,字体变为16像素的1.2倍
  }
}

@media screen and (min-width: 960px) {
  html {
    font-size: 18px; //页面宽度大于960px时,字体变为16像素的1.5倍
  }
}

@media screen and (min-width: 1100px) {
  html {
    font-size: 25px; //页面宽度大于1100px时,字体变为16像素的2倍
  }
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值