UNPKG

bry-auto-adapt

Version:

智能屏幕适配插件,自动将CSS中的px单位转换为vw/vh

178 lines (135 loc) 7.91 kB
# bry-auto-adapt:响应式屏幕适配解决方案 ## 简介 bry-auto-adapt 是一个用于前端项目的屏幕适配工具,通过 PostCSS 插件和运行时脚本结合的方式,实现基于设计稿尺寸的响应式布局适配。该工具支持多种适配模式,可根据不同设备屏幕尺寸自动调整元素大小,保持设计稿的比例和布局效果。 ## 功能特点 - **灵活的适配模式**:支持居中等比模式和平铺模式,满足不同场景的适配需求。 - **基于设计稿的尺寸转换**:自动将 px 单位转换为 vw/vh 单位,并结合运行时缩放变量。 - **智能属性处理**:根据属性类型(宽度、高度、内外边距等)自动选择合适的基准尺寸。 - **丰富的配置选项**:可自定义设计稿尺寸、转换单位、精度等参数。 - **自动 HTML/Body 配置**:生成基础布局样式,简化初始化工作。 - **媒体查询支持**:可自动转换媒体查询中的像素值为视口单位。 ## 安装与使用 ### 安装 ```bash npm install bry-auto-adapt postcss --save-dev # 或使用 yarn yarn add bry-auto-adapt postcss -D ``` ### Vite 项目配置 在 Vite 项目中使用该插件,需在 `vite.config.js` 中进行配置: ```javascript import { defineConfig } from 'vite'; import bryScreenAdapter from 'bry-auto-adapt'; export default defineConfig({ plugins: [ bryScreenAdapter({ designWidth: 1920, // 设计稿宽度,默认 1920 designHeight: 1080, // 设计稿高度,默认 1080 defaultMode: 'center', // 默认适配模式,'center''tile' unit: 'vw', // 转换后的单位,默认 'vw' precision: 6, // 转换精度,默认 6 exclude: null, // 排除文件路径 include: null, // 包含文件路径 selectorBlackList: [], // 选择器黑名单 propertiesBlackList: [], // 属性黑名单 mediaQuery: false, // 是否转换媒体查询,默认 false minPixelValue: 0, // 最小像素值,小于该值不转换 useRuntimeScaling: true, // 是否使用运行时缩放,默认 true htmlBackgroundColor: '#0078fd', // HTML 背景色,默认 '#0078fd' autoSetBodySize: true, // 自动设置 Body 尺寸,默认 true enableHtmlFlex: true // 启用 HTML Flex 布局,默认 true }) ] }); ``` ### 手动使用 PostCSS 插件 如果不使用 Vite,也可以在 PostCSS 配置中直接使用该插件: ```javascript // postcss.config.js module.exports = { plugins: [ require('bry-auto-adapt').postcss({ // 配置选项与 Vite 插件相同 designWidth: 1920, designHeight: 1080 }) ] }; ``` ## 适配模式说明 ### 居中等比模式(center) - 保持设计稿的宽高比例,根据视口尺寸等比缩放。 - 当视口宽高比与设计稿不一致时,会在宽度或高度方向留有空白。 - 适用于需要严格保持设计比例的场景,如展示类页面。 ### 平铺模式(tile) - 不进行缩放,元素尺寸完全基于视口单位计算。 - 可能会导致元素变形,但能填满整个视口。 - 适用于对比例要求不高,需要完全填充屏幕的场景,如某些游戏界面。 ## 运行时 API 插件会在窗口对象上暴露 `bryScreenAdapter` 对象,提供以下方法: ```javascript // 设置适配模式 window.bryScreenAdapter.setMode('center'); // 返回布尔值,表示设置是否成功 // 获取当前适配模式 const currentMode = window.bryScreenAdapter.getMode(); // 获取当前缩放比例 const scale = window.bryScreenAdapter.getScale(); /* 返回对象: { width: 缩放比例(宽度方向), height: 缩放比例(高度方向) } */ ``` ## 配置选项详解 | 选项名称 | 类型 | 默认值 | 说明 | |---------------------|----------------------|-------------|--------------------------------------------------------------| | designWidth | number | 1920 | 设计稿宽度 | | designHeight | number | 1080 | 设计稿高度 | | unit | string | 'vw' | 转换后的目标单位,支持 'vw''vh' 等视口单位 | | precision | number | 6 | 转换精度,保留的小数位数 | | exclude | string/array/regex | null | 排除转换的文件路径 | | include | string/array/regex | null | 仅转换包含的文件路径 | | selectorBlackList | array | [] | 选择器黑名单,包含这些选择器的规则不会被转换 | | propertiesBlackList | array | [] | 属性黑名单,这些属性不会被转换 | | mediaQuery | boolean | false | 是否转换媒体查询中的像素值 | | minPixelValue | number | 0 | 小于该值的像素不会被转换 | | useRuntimeScaling | boolean | true | 是否使用运行时缩放变量 | | htmlBackgroundColor | string | '#0078fd' | HTML 元素的背景色 | | autoSetBodySize | boolean | true | 是否自动设置 Body 尺寸 | | enableHtmlFlex | boolean | true | 是否启用 HTML 的 Flex 布局 | | defaultMode | string | 'center' | 默认适配模式,'center''tile' | ## 原理说明 该工具的实现原理主要分为两部分: ### PostCSS 插件部分 在构建阶段,PostCSS 插件会遍历 CSS 规则,将像素值转换为视口单位(如 vw/vh),并根据属性类型(宽度、高度、边距等)选择不同的基准尺寸(设计稿宽度或高度)。转换后的单位可以结合运行时缩放变量,实现动态调整。 ### 运行时脚本部分 运行时脚本会根据设计稿的宽高比和视口尺寸计算缩放比例,存储在 CSS 变量中。当窗口大小或方向改变时,会重新计算缩放比例并更新变量,从而实现响应式适配。 ## 示例 假设设计稿宽度为 1920px,高度为 1080px,以下 CSS 代码: ```css .container { width: 1200px; height: 600px; margin: 20px; padding: 10px 20px; } ``` 经过插件转换后,会变成: ```css .container { width: calc(62.5vw * var(--bry-width-scale)); height: calc(55.555556vh * var(--bry-height-scale)); margin: calc(1.851852vh * var(--bry-height-scale)); padding: calc(0.925926vh * var(--bry-height-scale)) calc(1.041667vw * var(--bry-width-scale)); } ``` 当视口尺寸变化时,运行时脚本会更新 `--bry-width-scale` 和 `--bry-height-scale` 变量,从而实现元素尺寸的动态调整。 ## 注意事项 - 该插件适用于前端项目的开发阶段,生产环境中可以根据需要决定是否保留运行时脚本。 - 对于使用动态生成的样式(如 JavaScript 中设置的样式),需要手动调用 `bryScreenAdapter.getScale()` 获取缩放比例并应用。 - 若遇到某些元素不需要适配的情况,可以将其选择器添加到 `selectorBlackList` 中。 - 对于不希望转换的属性,可添加到 `propertiesBlackList` 中。 - 媒体查询转换功能可能会影响部分响应式设计,使用时需谨慎测试。 ## 许可证 MIT