移动端适配 rem、postcss-pxtorem、postcss-px-to-viewport、vw vh

这篇具有很好参考价值的文章主要介绍了移动端适配 rem、postcss-pxtorem、postcss-px-to-viewport、vw vh。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

移动端设计稿一般是750px,如果没有用taro或者uniapp这类的框架,就需要自己来进行css的适配。

方案

一、Rem

rem是相对于根元素html字体大小的一个css单位,默认情况下html的font-size=16px,所以1rem = 16px。可以动态设置html的字体大小,比如设置html的font-size=100px,那么1rem=100px。重点就是动态设置html字体大小。

第一步

先在html的head标签中加一个meat标签

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">

意思是让当前视口的宽度等于设备的宽度,同时不允许用户手动缩放。

第二步

如果只是简单的一两个页面,html直接梭了,甚至都不需要用react、vue,那么可以继续在head中引入这段js

<script>
    function setSize() {
        var baseWidth = 750 // 设计稿尺寸
        var clientWidth = document.documentElement.clientWidth
        if (clientWidth >= 750) {
            clientWidth = 750
        }
        var fontSize = (clientWidth / baseWidth) * 100  // 乘以100是为了方便计算 
        window.document.documentElement.style.fontSize = fontSize + 'px'
    }
    setSize()
    window.addEventListener('resize', setSize)
</script>

写样式的时候,100px*100px的宽高可以写成width:1rem;height:1rem,50px*50px的宽高可以写成width:0.5rem;height:0.5rem,其实就是设计稿里的尺寸/100

如果是正常开发一个项目,这么去换算肯定麻烦,肯定是需要自动换算,插件postcss-pxtorem 可以满足这个需求,这时候需要加入另一段js。用上面一段也没什么大问题,核心就是设计稿尺寸下的字体大小,上面的js在iPhone6下fontSize是50px,那么插件rootValue值要设置成50,下面这段js在iPhone6下fontSize是16px,那么插件rootValue值要设置成16

<script>
  function setSize() {
    var baseFontSize = 16; // 这个值要和下面插件的rootValue值一样
    var baseWidth = 375; // 设计稿尺寸
    var clientWidth = document.documentElement.clientWidth;
    if (clientWidth > 750) {
      clientWidth = 750;
    }
    document.documentElement.style.fontSize =
      baseFontSize * (clientWidth / baseWidth) + "px";
  }
  setSize();
  window.addEventListener("resize", setSize);
</script>

1、安装
使用postcss-pxtorem前提是需要安装 postcss postcss-loader

npm i postcss postcss-loader postcss-pxtorem -D

2、webpack配置
或者新建一个 postcss.config.js 文件也行(.json,.yaml格式的文件都行,看个人习惯)

// 引入插件
const Pxtorem = require('postcss-pxtorem');

module.export = {

	module:{
		rules:[
			{
			 test: /\.css$/i,
			 use: [
			    "style-loader",
			   "css-loader",
			   {
			     loader: "postcss-loader",
			     options: {
			       postcssOptions: {
			         plugins: [
			           Pxtorem({
			             rootValue: 16,
			             unitPrecision: 5,
			             propList: ['*'],
			             selectorBlackList: [],
			             replace: true,
			             mediaQuery: false,
			             minPixelValue: 0,
			             // exclude: /node_modules/i
			           })
			         ],
			       },
			     },
			   },
			 ],
			},
		]
	}


}

postcss-pxtorem的默认配置如下


{
    rootValue: 16,
    unitPrecision: 5,
    propList: ['font', 'font-size', 'line-height', 'letter-spacing'],
    selectorBlackList: [],
    replace: true,
    mediaQuery: false,
    minPixelValue: 0,
    exclude: /node_modules/i
}
  • rootValue:根结点的字体大小,默认16,可以设置一个具体的数值,或者可以是一个函数,返回一个数值。如果用到了UI库,可能UI库是按照375,设计稿是750,就可以通过函数来设置rootValue。该函数有一个参数,是一个对象,可以通过file字段来判断是自己写的样式还是UI库的样式,file是当前文件的路径。function ({file}) { return file.indexOf('exclude') !== -1; }
  • unitPrecision:保留几位小数
  • propList:一个数组。表示哪些属性能转化成rem
    • 属性必须完成匹配。比如heightwidth
    • 使用通配符 * 启用所有属性。[‘*’]
    • 在单词的开头或结尾使用 *来匹配。比如[“*positons*”,“*height”]会匹配到background-position-ymin-heightmax-height
    • 使用!不匹配属性。比如 [“!height”] 就不会转换height
    • 可以将!和* 结合使用。比如 [“!font*”] font-size将不会转换
  • selectorBlackList:一个数组,要忽略的选择器,保留为px。
    • 如果是一个字符串,那么会检查选择器是否包含该字符串,比如[‘body’] 会匹配到.body-main
    • 如果是一个正则,会检查该选择器和正则是否匹配,比如[/^body$/] 会匹配 body 但是不会匹配 .body
  • replace:Boolean,是否替换包含rem的规则,而不是添加回退
  • mediaQuery:Boolean,是否允许在媒体查询中转换px
  • minPixelValue:数值,设置要替换的最小像素值
  • exclude:(String, Regexp, Function) 要忽略并保留为px的文件路径
    • 如果是string,则检查文件路径是否包含该字符串
    • 如果是regexp,则检查文件路径是否与regexp匹配
    • 如果是function,则可以使用函数返回true,文件将被忽略,回调函数将文件路径作为参数传递 function (file) { return file.indexOf('exclude') !== -1; }

如果只是单个属性需要忽略,最简单的是大写PX

// `px` 会转成 `rem`
.convert {
    font-size: 16px; // 会被转成rem
}

// `Px` or `PX` 会被忽略,但是在浏览器里面仍然可以用
.ignore {
    border: 1Px solid; // ignored
    border-width: 2PX; // ignored
}
二、vw vh

vw和vh是浏览器视口(viewport)的单位,简单理解就是1vw是屏幕宽度的1%,1vh是屏幕高度的1%,此外还有vmin:vw和vh中较小的那个,vmain:vw和vh中较大的那个。

vw也不用自己手动去换算,现在浏览器都支持vw、vh,可以用postcss-px-to-viewport插件进行转换,和rem的插件用法类似(本身也是受postcss-pxtorem启发)

1、安装

npm i postcss postcss-loader postcss-px-to-viewport -D

2、webpack配置

// 引入插件
const postcssPxToViewport = require("postcss-px-to-viewport");

module.export = {

	module:{
		rules:[
			{
			  test: /\.css$/i,
			  use: [
			   	"style-loader",
			    "css-loader",
			    {
			      loader: "postcss-loader",
			      options: {
			        postcssOptions: {
			          plugins: [
			            postcssPxToViewport({
			              viewportWidth: 320, // 设计稿宽度
			              unitPrecision: 5, // px转换后的小数保留位数
			              minPixelValue: 1, // 小于多少像素不转换
			              selectorBlackList: ["ignore-"], // 有ignore-* 的类名不会被转换
			            }),
			          ],
			        },
			      },
			    },
			  ],
			},
		]
	}
}

postcss-px-to-viewport的默认配置如下

{
  unitToConvert: 'px',
  viewportWidth: 320,
  unitPrecision: 5,
  propList: ['*'],
  viewportUnit: 'vw',
  fontViewportUnit: 'vw',
  selectorBlackList: [],
  minPixelValue: 1,
  mediaQuery: false,
  replace: true,
  exclude: undefined,
  include: undefined,
  landscape: false,
  landscapeUnit: 'vw',
  landscapeWidth: 568
}

  • unitToConvert (String) 需要转换的单位,默认为"px"
  • viewportWidth (Number) 设计稿的视口宽度
  • unitPrecision (Number) 单位转换后保留的精度
  • propList (Array) 能转化为vw的属性列表
    • 传入特定的CSS属性;
    • 可以传入通配符""去匹配所有属性,例如:[‘’];
    • 在属性的前或后添加"*",可以匹配特定的属性. (例如[‘position’] 会匹配 background-position-y)
    • 在特定属性前加 “!”,将不转换该属性的单位 . 例如: [‘*’, ‘!letter-spacing’],将不转换letter-spacing
    • “!” 和 ""可以组合使用, 例如: [‘’, ‘!font*’],将不转换font-size以及font-weight等属性
  • viewportUnit (String) 希望使用的视口单位
  • fontViewportUnit (String) 字体使用的视口单位
  • selectorBlackList (Array) 需要忽略的CSS选择器,不会转为视口单位,使用原有的px等单位。
    • 如果传入的值为字符串的话,只要选择器中含有传入值就会被匹配,例如 selectorBlackList 为 [‘body’] 的话, 那么.body-class 就会被忽略
    • 如果传入的值为正则表达式的话,那么就会依据CSS选择器是否匹配该正则 ,例如 selectorBlackList 为 [/^body$/] , 那么 body 会被忽略,而 .body 不会.
  • minPixelValue (Number) 设置最小的转换数值,如果为1的话,只有大于1的值会被转换
  • mediaQuery (Boolean) 媒体查询里的单位是否需要转换单位
  • replace (Boolean) 是否直接更换属性值,而不添加备用属性
  • exclude (Array or Regexp) 忽略某些文件夹下的文件或特定文件,例如 ‘node_modules’ 下的文件
    • 如果值是一个正则表达式,那么匹配这个正则的文件会被忽略
    • 如果传入的值是一个数组,那么数组里的值必须为正则
  • include (Array or Regexp) 如果设置了include,那将只有匹配到的文件才会被转换,例如只转换 ‘src/mobile’ 下的文件 (include: /\/src\/mobile\//)
    • 如果值是一个正则表达式,将包含匹配的文件,否则将排除该文件
    • 如果传入的值是一个数组,那么数组里的值必须为正则
  • landscape (Boolean) 是否添加根据 landscapeWidth 生成的媒体查询条件 @media (orientation: landscape)
  • landscapeUnit (String) 横屏时使用的单位
  • landscapeWidth (Number) 横屏时使用的视口宽度

exclude和include是可以一起设置的,将取两者规则的交集。

最后

个人感觉移动端适配这两种方案都行,rem算是大家用的比较久的,vw是后发展的方案文章来源地址https://www.toymoban.com/news/detail-761989.html

到了这里,关于移动端适配 rem、postcss-pxtorem、postcss-px-to-viewport、vw vh的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端页面适配之postcss-px-to-viewport

    一:简介 postcss-px-to-viewport  是一个 PostCSS 插件,用于将 CSS 中的 px 单位转换为 vw 或 vh 单位。它可以帮助我们实现在不同屏幕尺寸下的自适应布局,以提高页面的响应性和可用性。 二:postcss-px-to-viewport原理 遍历 CSS 文件中的所有样式规则,找到其中所有的 px 单位值。 将每

    2024年02月05日
    浏览(31)
  • vite项目 postcss-px-to-viewport适配vant

    关于vite项目postcss-px-to-viewport适配vant的问题,网上很多文章都已经过时或者都是基于webpack的配置,很少vite相关的配置教程,故做一下笔记希望帮到正在踩坑的同学。 postcss-px-to-viewport插件已经抛弃使用请使用postcss-px-to-viewport-8-plugin (项目运行时会提示已弃用) 已经安装po

    2024年02月13日
    浏览(36)
  • 【前端可视化】postcss-px-to-viewport 适配怎么限制最大宽度?使用 postcss-mobile-forever

    自己用 nuxt3 写官网发现用 postcss-px-to-viewport 这个插件虽然能够实现基于 vw 的响应式,但是无法做到限制宽度,比如设计稿 1920p,我只想让最大缩放比例为 1920p,不能超过,就无法实现了。 纯 css 的话,有两个办法,一种用 px 生成两套代码,一套移动端的 vw 视图,一套最大宽

    2024年01月24日
    浏览(40)
  • 使用rem + sass + 媒体查询 进行横竖屏适配移动端项目

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 常见的媒体查询,就是1280、1440、1600、1720、1920。规律也很简单,800 + 160*n。最小就是800px(最小的大部分是投影仪使用),不考虑特别设计的话屏幕的话,最大是2560px。下面使用不同分辨率变背景颜色的

    2024年02月10日
    浏览(36)
  • 移动端Vant-Ui库以及适配Rem插件

    Vant下载以及使用 看官方文档下载一定要看清楚你要下载的是那个版本的项目 下载完成之后接下就是怎么去使用它 官方文档分三种引入使用 (1).是按需引入需要那个组件引入那个可以减少项目的大小也方便开发 上面分别也有注释首先引入VUE因为我们需要在上面挂在我们所按需

    2024年02月03日
    浏览(51)
  • vue 移动端开发vw适配方案&rem适配方案 + vant框架 + unocss|tailwindcss

    写在前面的话:看了这篇文章,有些东西名词啥的不懂的,或者有疑问的推荐百度,因为写的太多真的显得很啰嗦! 目前移动端适配,在市面上主流适配方案无非就两种,rem方案和vw方案。这些方案,就可以自动适配不同移动端屏幕尺寸动态缩放。其实他的适配,你可以理解

    2024年02月12日
    浏览(40)
  • 1-07 React配置postcss-px-to-viewport

    移动端适配 安装依赖:在项目根目录下运行以下命令安装所需的依赖包: 配置代码 重新启动开发服务器:如果你的开发服务器正在运行,请重新启动它以应用新的配置。 之后当我们写px时会自动转换成vm单位

    2024年02月08日
    浏览(36)
  • postcss插件使用和适配方案

    使用 postcss-px-to-viewport 插件解决移动端的适配方案。 原理是将固定的像素单位(px)转换为根据视窗大小缩放的单位(vw|vh),该插件实现的就是这一单位间的转化。 参考网址: postcss-px-to-viewport 中文文档: https://github.com/evrone/postcss-px-to-viewport/blob/master/README_CN.md 该项目使用vue3+

    2024年02月09日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包