当前位置:   article > 正文

【Vue】屏幕适配(rem响应式布局)_vue 响应式自适应布局

vue 响应式自适应布局

目录

一、所有页面适配,页面布局一致(不使用媒体查询)

第一步:使用插件修改单位 

使用postcss-px2rem----修改单位(包括第三方组件)

使用postcss-px2rem-exclude---修改单位(不包括第三方组件)

使用postcss-plugin-px2rem-----指定某一文件下所以css文件不进行单位转换(推荐)

第二步:屏幕自适应

使用flexible.js+vscode的插件cssrem----屏幕自适应大小

二、根据对应尺寸进行对应适配(媒体查询)


响应式布局有两种方法,看自己想要哪种。

方法一:百分比

用百分比去写元素的宽度,然后让子元素撑起父元素的高度

  1. .parent {
  2. width: 50%;
  3. }
  4. .child {
  5. width:100%;
  6. height:100px;
  7. }

方法二:vh、vw

vw、vh是基于视口的布局方案,所以这个meta元素的视口必须声明。(解决宽高自动适配)

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
  1. .box{
  2. width:50vw;
  3. height: 20vh;
  4. line-height: 20vh;
  5. font-size: 1.5rem;
  6. background-color: yellow;
  7. }

50vw的意思是占视口宽度的一半,20vh占视口高度的20%,随着视口的变化自适应。

在所需页面中选择合适的方法,然后开始进行下面的配置

一、所有页面适配,页面布局一致(不使用媒体查询

postcss-px2rem和postcss-px2rem-exclude二选一看自己需求

第一步:使用插件修改单位 

使用postcss-px2rem----修改单位(包括第三方组件)

第一步,npm下载插件————帮我们自动将px单位转换成rem单位(主要是转换不是我们自己写的页面尺寸,比如elementUI中的尺寸就会改变,除了行内)

npm install postcss-px2rem --save

第二步,在根目录src中新建util目录下新建rem.js等比适配文件

  1. // rem等比适配配置文件
  2. // 基准大小
  3. const baseSize = 14
  4. // 设置 rem 函数
  5. function setRem () {
  6. // 当前页面宽度相对于 1920宽的缩放比例,可根据自己需要修改。
  7. const scale = document.documentElement.clientWidth / 1920
  8. // 设置页面根节点字体大小(“Math.min(scale, 2)” 指最高放大比例为2,可根据实际业务需求调整)
  9. document.documentElement.style.fontSize = baseSize * Math.min(scale, 2) + 'px'
  10. }
  11. // 初始化
  12. setRem()
  13. // 改变窗口大小时重新设置 rem
  14. window.onresize = function () {
  15. setRem()
  16. }

第三步,”在main.js中引入适配文件

import './util/rem'

第四步,到vue.config.js中配置插件

  1. // 引入等比适配插件
  2. const px2rem = require('postcss-px2rem')
  3. // 配置基本大小
  4. const postcss = px2rem({
  5. // 基准大小 baseSize,需要和rem.js中相同
  6. // remUnit: 14 代表 1rem = 14px; 所以当你一个14px值时,它会自动转成 (14px/14)rem
  7. remUnit: 14
  8. })
  9. // 使用等比适配插件
  10. module.exports = {
  11. lintOnSave: true,
  12. css: {
  13. loaderOptions: {
  14. less: {
  15. javascriptEnabled: true,
  16. },
  17. postcss: {
  18. plugins: [
  19. postcss,
  20. ],
  21. },
  22. },
  23. },
  24. }

注意:UI框架部分组件使用JavaScript将css作为内联样式直接写在html标签内,打包适配时不会读取相关css,所以要配置相关样式,在style中需要" !important "进行样式覆盖。

使用postcss-px2rem-exclude---修改单位(不包括第三方组件)

第一步:npm下载插件————帮我们自动将px单位转换成rem单位(此插件的功能是为了排除 node_modules 中的所有第三方插件,所以第三方组件库的样式就不会被受到影响。比如elementUI就不会转换单位了)

npm  install postcss-px2rem-exclude --save

第二步:在postcss.config.js 文件下修改配置

  1. module.exports = {
  2. plugins: {
  3. autoprefixer: {},
  4. "postcss-px2rem-exclude": {
  5. remUnit: 75,
  6. exclude: /node_modules|folder_name/i
  7. }
  8. }
  9. }

使用postcss-plugin-px2rem-----指定某一文件下所以css文件不进行单位转换(推荐)

第一步:npm下载插件————帮我们自动将px单位转换成rem单位(配置 是否对 某个文件夹下的所有css文件不进行从px到rem的转换)

npm i postcss-plugin-px2rem

第二步:配置vue.config.js

  1. module.exports = {
  2. css: {
  3. loaderOptions: {
  4. postcss: {
  5. plugins: [
  6. require('postcss-plugin-px2rem')({
  7. rootValue: 16, //换算基数, 默认100 ,这样的话把根标签的字体规定为1rem为50px,这样就可以从设计稿上量出多少个px直接在代码中写多上px了。
  8. // unitPrecision: 5, //允许REM单位增长到的十进制数字。
  9. //propWhiteList: [], //默认值是一个空数组,这意味着禁用白名单并启用所有属性。
  10. // propBlackList: [], //黑名单
  11. exclude: /(node_module)/, //默认false,可以(reg)利用正则表达式排除某些文件夹的方法,例如/(node_module)/ 。如果想把前端UI框架内的px也转换成rem,请把此属性设为默认值
  12. // selectorBlackList: [], //要忽略并保留为px的选择器
  13. // ignoreIdentifier: false, //(boolean/string)忽略单个属性的方法,启用ignoreidentifier后,replace将自动设置为true。
  14. // replace: true, // (布尔值)替换包含REM的规则,而不是添加回退。
  15. mediaQuery: false, //(布尔值)允许在媒体查询中转换px。
  16. minPixelValue: 3 //设置要替换的最小像素值(3px会被转rem)。 默认 0
  17. }),
  18. ]
  19. }
  20. }
  21. },
  22. }

第二步:屏幕自适应

使用flexible.js+vscode的插件cssrem----屏幕自适应大小

第一步,在src中新建util目录下新建flexible.js(原版是分成10等分,这里我分成了24等分)

  1. (function flexible(window, document) {
  2. var docEl = document.documentElement
  3. var dpr = window.devicePixelRatio || 1
  4. // adjust body font size
  5. function setBodyFontSize() {
  6. if (document.body) {
  7. document.body.style.fontSize = (12 * dpr) + 'px'
  8. }
  9. else {
  10. document.addEventListener('DOMContentLoaded', setBodyFontSize)
  11. }
  12. }
  13. setBodyFontSize();
  14. // set 1rem = viewWidth / 10 原版是10等分,这里把屏幕平均划分为24等分 1920
  15. function setRemUnit() {
  16. var rem = docEl.clientWidth / 24
  17. docEl.style.fontSize = rem + 'px'
  18. }
  19. setRemUnit()
  20. // reset rem unit on page resize
  21. window.addEventListener('resize', setRemUnit)
  22. window.addEventListener('pageshow', function (e) {
  23. if (e.persisted) {
  24. setRemUnit()
  25. }
  26. })
  27. // detect 0.5px supports
  28. if (dpr >= 2) {
  29. var fakeBody = document.createElement('body')
  30. var testElement = document.createElement('div')
  31. testElement.style.border = '.5px solid transparent'
  32. fakeBody.appendChild(testElement)
  33. docEl.appendChild(fakeBody)
  34. if (testElement.offsetHeight === 1) {
  35. docEl.classList.add('hairlines')
  36. }
  37. docEl.removeChild(fakeBody)
  38. }
  39. }(window, document))

第二步,在main.js中引入文件

第三步,再配合cssrem插件使用进行伸缩适配

因为是按照1920设计稿写的,而且我把flexible修改了24等分,所以1920/24=80,这里的基准改为80。你们可以按照自己的要求来写。

然后在项目中使用rem单位后就可以实现伸缩适配啦。

原先是

改变后,无论是小屏还是大屏,就和设计稿上的是一致的

二、根据对应尺寸进行对应适配(媒体查询)

在styles/index.js中添加所需适配的尺寸

  1. @media screen and(max-width: 1024px) {
  2. body,
  3. html {
  4. font-size: 14px
  5. }
  6. }
  7. @media screen and(min-width: 1100px) {
  8. body,
  9. html {
  10. font-size: 16px
  11. }
  12. }
  13. @media screen and(min-width: 1280px) {
  14. body,
  15. html {
  16. font-size: 16px;
  17. }
  18. }
  19. @media screen and(min-width: 1366px) {
  20. body,
  21. html {
  22. font-size: 16px;
  23. }
  24. }
  25. @media screen and(min-width: 1440px) {
  26. body,
  27. html {
  28. font-size: 16px;
  29. }
  30. }
  31. @media screen and(min-width: 1680px) {
  32. body,
  33. html {
  34. font-size: 18px;
  35. }
  36. }
  37. @media screen and(min-width: 1920px) {
  38. body,
  39. html {
  40. font-size: 33px;
  41. }
  42. }

然后再main.js中引入样式

import '@/styles/index.scss' // global css

需要修改单位就下载对应插件修行,具体过程看上面

注意:媒体查询不能和flexible.js一起使用,若是一起使用媒体查询无效,这个我倒后期会改。

到这里就结束啦,这篇文章看完如果您觉得有所收获,认为还行的话,就点个赞收藏一下呗

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/190948
推荐阅读
相关标签
  

闽ICP备14008679号