UNPKG

press-pix

Version:
211 lines (156 loc) 5.6 kB
# direction-base.less 使用指南 ## 📖 概述 `direction-base.less` 提供了 LTR/RTL 双向布局支持的混合宏集合。由于已从 webpack 全局注入中移除,现在需要在每个使用 RTL 混合宏的组件样式文件中**手动导入**。 --- ## 🎯 使用方法 ### 1️⃣ 在组件样式文件中导入 ```less // 在组件的 .less 文件顶部导入 @import '../../../styles/direction-base.less'; // 然后使用混合宏 .container { .margin-inline-start(10px); .padding-inline-end(20px); .text-align-start(); } ``` ### 2️⃣ 根据文件位置调整导入路径 ```less // 如果组件在 pages/home/css/home.less @import '../../../styles/direction-base.less'; // 如果组件在 components/Button/css/Button.less @import '../../../../styles/direction-base.less'; // 如果组件在 pages/watch-list/component/WatchCard/css/WatchCard.less @import '../../../../../styles/direction-base.less'; ``` --- ## 📦 可用的混合宏 ### 文本对齐 - `.text-align-start()` - 文本起始对齐(LTR: left, RTL: right) - `.text-align-end()` - 文本结束对齐(LTR: right, RTL: left) ### Flex 布局 - `.flex-direction-row()` - Flex 行方向(LTR: row, RTL: row-reverse) - `.flex-direction-row-reverse()` - Flex 行反向 - `.justify-content-start()` - 主轴起始对齐 - `.justify-content-end()` - 主轴结束对齐 - `.align-content-start()` - 换行起始对齐 - `.align-content-end()` - 换行结束对齐 ### 外边距(Margin) - `.margin-inline-start(@value)` - 行内起始外边距(LTR: margin-left, RTL: margin-right) - `.margin-inline-end(@value)` - 行内结束外边距(LTR: margin-right, RTL: margin-left) ### 内边距(Padding) - `.padding-inline-start(@value)` - 行内起始内边距(LTR: padding-left, RTL: padding-right) - `.padding-inline-end(@value)` - 行内结束内边距(LTR: padding-right, RTL: padding-left) ### 边框(Border) - `.border-inline-start(@value)` - 行内起始边框(LTR: border-left, RTL: border-right) - `.border-inline-end(@value)` - 行内结束边框(LTR: border-right, RTL: border-left) - `.border-inline-start-width(@value)` - 行内起始边框宽度 - `.border-inline-end-width(@value)` - 行内结束边框宽度 - `.border-inline-start-style(@value)` - 行内起始边框样式 - `.border-inline-end-style(@value)` - 行内结束边框样式 - `.border-inline-start-color(@value)` - 行内起始边框颜色 - `.border-inline-end-color(@value)` - 行内结束边框颜色 ### 定位(Position) - `.inset-inline-start(@value)` - 行内起始定位(LTR: left, RTL: right) - `.inset-inline-end(@value)` - 行内结束定位(LTR: right, RTL: left) --- ## 🔄 RTL 模式切换 JavaScript 中根据语言动态添加类名: ```javascript // 判断是否为 RTL 语言 const isRTLLanguage = ['ar', 'he', 'fa', 'ur'].includes(currentLanguage); // 切换 RTL 模式 document.documentElement.classList.toggle('rtl-map', isRTLLanguage); ``` --- ## ✅ 完整示例 ```less // components/Card/css/Card.less @import '../../../styles/direction-base.less'; .card { display: flex; .flex-direction-row(); .padding-inline-start(20px); .padding-inline-end(10px); .card-icon { .margin-inline-end(12px); } .card-title { .text-align-start(); } .card-action { position: absolute; .inset-inline-end(10px); } } ``` 编译后的 CSS: ```css /* LTR 默认样式 */ .card { display: flex; flex-direction: row; padding-left: 20px; padding-right: 10px; } .card .card-icon { margin-right: 12px; } .card .card-title { text-align: left; } .card .card-action { position: absolute; right: 10px; } /* RTL 覆盖样式 */ .rtl-map .card { flex-direction: row-reverse; padding-left: 10px; padding-right: 20px; } .rtl-map .card .card-icon { margin-right: 0; margin-left: 12px; } .rtl-map .card .card-title { text-align: right; } .rtl-map .card .card-action { right: auto; left: 10px; } ``` --- ## ⚠️ 注意事项 1. **必须手动导入**:每个使用 RTL 混合宏的样式文件都需要导入 `direction-base.less` 2. **路径正确性**:根据文件位置调整相对路径 3. **避免物理属性**:不要直接使用 `left`/`right`/`margin-left` 等物理属性,统一使用混合宏 4. **CSS Modules 兼容**:混合宏完全兼容 CSS Modules,作用域处理正确 --- ## 🆚 对比:全局注入 vs 手动导入 | 对比项 | 全局注入(之前) | 手动导入(现在) | |--------|-----------------|-----------------| | **导入方式** | webpack 自动注入 | 每个文件手动导入 | | **代码冗余** | 零冗余 | 每个文件都要导入 | | **路径管理** | 无需关心 | 需要计算相对路径 | | **依赖透明** | 隐式依赖 | 显式依赖 | | **维护成本** | 极低 | 较高 | | **性能** | 更优 | ⚠️ 略差 | --- ## 💡 最佳实践 1. **统一导入位置**:在样式文件顶部导入 2. **使用绝对路径别名**(如果配置了):`@import '~@/styles/direction-base.less'` 3. **按需使用**:只在需要 RTL 支持的组件中导入 4. **代码审查**:确保所有使用混合宏的文件都已导入 --- ## 🔧 如果需要恢复全局注入 编辑 `.pixiderc/webpack.js`: ```javascript const GLOBAL_LESS_FILES = [ '../src/local-component/ui/styles/direction-base.less', // 取消注释 ].map(relativePath => path.resolve(__dirname, relativePath).replace(/\\/g, '/') ); ``` 然后删除所有组件中的手动导入语句。