前端适配方案之 flexible.js 到 postcss-px-to-viewport-8-plugin插件演进

响应式布局从页面表现来说,就是根据浏览器的大小变化而变化。

以前经常使用 amfe-flexible.js 这个库,再通过IDE的cssrem插件转换视觉稿单位 px => rem。

amfe-flexible官方也提示大家使用,viewport来替代。

也许有同学使用postcss-px-to-viewport 这个插件,是的。他是postcss-px-to-viewport-8-plugin 插件的前身。

使用 postcss-px-to-viewport 控制台报以下代码

复制代码
postcss-px-to-viewport: postcss.plugin was deprecated. Migration guide: https://evilmartians.com/chronicles/postcss-8-plugin-migration

解决

postcss-px-to-viewport 替换 postcss-px-to-viewport-8-plugin 修复因为postcss版本导致的atRule is not a constructor 问题。

postcss-px-to-view-port-8-plugin 依赖其它三方库版本如下:

复制代码
 "postcss": "^8.3.8", // 8.0.0版本都不会转单位
 "postcss-loader": "^6.1.1",

笔者使用的架构是 vite+react

postcss.config.js 配置

复制代码
export default {
  plugins: {
    'postcss-px-to-viewport-8-plugin': {
      unitToConvert: 'px', // 需要转换的单位,默认为"px"
      viewportWidth: 1920, // 设计稿的视口宽度
      unitPrecision: 5, // 单位转换后保留的精度
      propList: ['*'], // 需要转换的 CSS 属性列表, 例如['*']代表全部,['html']表示仅对html有效
      viewportUnit: 'vw', // 转换后的视口单位
      fontViewportUnit: 'vw', // 转换后的字体单位
      selectorBlackList: ['.ignore', '.hairlines'], // 不进行转换的 CSS 类名
      minPixelValue: 1, // 设置转换的最小像素值(3px会被转换为1vw)
      mediaQuery: false, // 媒体查询里的单位是否需要转换单位
    },
    autoprefixer: {},
  },
}

注意:viewportWidth -- 设计稿的视口宽度,这个是设计稿的大小。

更多配置请参考:https://github.com/krmao/postcss-px-to-viewport-8-plugin

代码

复制代码
// jsx

function App() {
  return (
    <>
      <div className="header-box">
        <div className="header-title">【1303室】</div>
        <div className="header-rcn">
          <div className="c1">安全第一责任人:李帅彬</div>
          <div className="c2">
            <div className="time">20:20</div>
            <div className="date">2025-04-29</div>
            <div className="week">星期一</div>
          </div>
        </div>
      </div>
    </>
  );
}

export default App;


// css代码
.header-box {
  height: 188px;
  background-color: #2003b0;
  padding: 0 70px;
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: space-between;
}

.header-title {
  font-size: 92px;
  font-weight: 500;
}

.header-rcn {
  display: inline-flex;
  align-items: flex-end;
}

.header-rcn .c1 {
  color: #d4f802;
  font-size: 38px;
  padding: 0 0 20px 0;
}

.header-rcn .c2 {
  margin-left: 40px;
  text-align: center;
}

.header-rcn .c2 .time {
  font-size: 40px;
}

.header-rcn .c2 .date {
  font-size: 30px;
}

.header-rcn .c2 .week {
  font-size: 30px;
}

预览

更多实践

相关推荐
无敌最俊朗@7 分钟前
C++后端总览
开发语言
多喝开水少熬夜13 分钟前
堆相关算法题基础-java实现
java·开发语言·算法
7澄120 分钟前
Java 集合框架:List 体系与实现类深度解析
java·开发语言·vector·intellij-idea·集合·arraylist·linkedlist
文心快码BaiduComate24 分钟前
双十一将至,用Rules玩转电商场景提效
前端·人工智能·后端
用户187294225083925 分钟前
告别函数的“两面派”人生:深度剖析箭头函数如何一劳永逸地解决 ‘this’ 的二义性
javascript
拉不动的猪26 分钟前
关于scoped样式隔离原理和失效情况&&常见样式隔离方案
前端·javascript·面试
摇滚侠27 分钟前
Vue 项目实战《尚医通》,医院详情菜单与子路由,笔记17
前端·vue.js·笔记
有来技术29 分钟前
vite-plugin-vue-mcp:在 Vue 3 + Vite 中启用 MCP,让 AI 理解并调试你的应用
前端·vue.js·人工智能
fruge33 分钟前
前端本地存储进阶:IndexedDB 封装与离线应用开发
前端
忍者扔飞镖40 分钟前
欧服加载太慢了,咋整
前端·性能优化