AdminLTE 如何启用 RTL(从右到左)布局:用 rtlcss 生成 .rtl.css 并在页面应用 dir="rtl"
【免费下载链接】AdminLTEAdminLTE - Free admin dashboard template based on Bootstrap 5项目地址: https://gitcode.com/GitHub_Trending/ad/AdminLTE
如果你的项目使用 AdminLTE 4(基于 Bootstrap 5 的后台模板),需要为阿拉伯语、希伯来语等从右到左的语言提供镜像版布局,那么要做两件事:用构建管线中的rtlcss插件把编译出的 CSS 转换一份.rtl.css,再在 HTML 页面的<html>标签上应用dir="rtl"并让该页面加载这份 RTL 样式表。本仓库已经内置了完整的这条链路,本文按照 package.json、postcss 配置 和 layout-rtl 示例页 中的真实配置,说明生成与应用的全部步骤,以及如何核对产物。
准备条件
按照 README.md 的 Quick start 一节,编译 dist 文件需要 Node.js/npm:
- 克隆或下载仓库后执行
npm install安装依赖; - 依赖中已包含 RTL 所需的全部工具,无需额外安装。在 package.json 的
devDependencies中可以核对到:
"postcss": "^8.4.43", "postcss-cli": "^11.0.0", "rtlcss": "^4.3.0", "cross-env": "^7.0.3"其中rtlcss负责 CSS 方向转换,cross-env用于在命令中设置环境变量,postcss-cli提供命令行入口。
注意副作用:npm run production的定义是npm-run-all clean lint compile,而clean是rimraf dist,即先删除整个dist目录再重新编译。如果只想增量生成 RTL 样式,使用后文的单步脚本即可。
生成 .rtl.css
生成由css-rtl脚本完成,它要求dist/css/下已经存在编译好的.css文件(即先跑过css-compile)。
完整链路用一条命令即可,定义于 package.json:
npm run css它的展开是npm-run-all css-compile css-prefix css-rtl css-minify,按顺序执行四步:
css-compile:用 sass 把src/scss/编译到dist/css/;css-prefix:对dist/css/*.css(排除*.rtl*.css和*.min.css)做 postcss 前缀处理;css-rtl:即下一条命令,生成.rtl.css;css-minify:并行压缩主样式(css-minify-main)和 RTL 样式(css-minify-rtl,单独对dist/css/*rtl.css压缩出.rtl.min.css)。
只跑 RTL 转换这一步的原始命令是:
npm run css-rtl展开为:
cross-env NODE_ENV=RTL postcss --config src/config/postcss.config.mjs --dir "dist/css" --ext ".rtl.css" "dist/css/*.css" "!dist/css/*.min.css" "!dist/css/*.rtl.css"逐段说明:
--dir "dist/css" --ext ".rtl.css":输入文件就地输出到dist/css/,扩展名追加为.rtl.css,即adminlte.css生成adminlte.rtl.css;- 输入参数
"dist/css/*.css" "!dist/css/*.min.css" "!dist/css/*.rtl.css":只处理普通 CSS,明确排除已压缩文件和已生成的 RTL 文件,避免二次转换; cross-env NODE_ENV=RTL:设置环境变量。这是 rtlcss 生效的开关——src/config/postcss.config.mjs 中 rtlcss 插件的启用条件正是:
plugins: { autoprefixer: { cascade: false }, rtlcss: ctx.env === 'RTL' ? {} : false }也就是说,同样的 postcss 配置在非 RTL 步骤(如css-prefix)中不会执行方向转换,rtlcss只在NODE_ENV=RTL时挂载。
开发模式下还有对应的 watch 脚本(package.json):watch-css-dist用 nodemon 监听dist/css/,且--ignore "dist/css/*.rtl.*"(忽略自己生成的 RTL 文件以防循环触发),每次源 CSS 变化后自动重跑npm run css-rtl。npm run dev会并行启动所有watch-*脚本和文档站点。
RTL 输出中源码注释的作用
rtlcss 通过 CSS 注释指令控制转换行为。本仓库源码中就使用了这种指令,例如 src/scss/_app-sidebar.scss 中:
transform: translateY(-50%) /*rtl:append:rotate(180deg)*/;以及/*rtl:ignore*/。编译产物dist/css/adminlte.css中还保留了大量来自 Bootstrap 的/* rtl:... */注释(如rtl:begin:ignore/rtl:end:ignore、rtl:url(...)),这些注释在生成adminlte.rtl.css时被 rtlcss 读取,决定对应声明是翻转、忽略还是替换。
在页面应用 dir="rtl"
参考仓库自带的示例页 src/html/pages/layout/layout-rtl.astro,启用 RTL 的页面写法分两点:
- 在
<html>标签上加dir="rtl",并在 frontmatter 中声明isRtl:
--- const title = "AdminLTE 4 | Layout RTL"; const path = "../../../dist"; const isRtl = true; --- <html lang="en" dir="rtl"> <head> <Head title={title} path={path} isRtl={isRtl} /> </head>- 头部组件根据
isRtl选择样式表文件名。src/html/components/_head.astro 中的逻辑是:
--- const { title, path, isRtl } = Astro.props; const cssPath = isRtl ? ".rtl" : ""; --- <link rel="stylesheet" href={path + "/css/adminlte" + cssPath + ".css"} />即 RTL 页面加载adminlte.rtl.css,其余页面加载adminlte.css。在自己的 HTML 页面中对应写法就是:给<html>加dir="rtl",并把 AdminLTE 样式表指向dist/css/adminlte.rtl.css(压缩版为adminlte.rtl.min.css)。
验证结果
编译完成后按以下产物核对(仓库当前dist中已包含这些文件,可直接对照):
- RTL 样式表已生成:
dist/css/下存在adminlte.rtl.css、adminlte.rtl.min.css及对应的.map文件,与主样式adminlte.css、adminlte.min.css并列。 - RTL 页面指向了 RTL 样式表:构建出的示例页 dist/pages/layout/layout-rtl.html 中可以看到:
<html lang="en" dir="rtl"> ... <link rel="stylesheet" href="../../../dist/css/adminlte.rtl.css" />即dir="rtl"与.rtl.css引用同时生效。 3.浏览器预览:执行npm run dev(README 中注明为开发模式,带浏览器自动刷新)后,打开 Layout 分组的 "Layout RTL" 演示页(构建产物路径为dist/pages/layout/layout-rtl.html),整版布局相对默认页呈镜像排布,即为 RTL 生效。
限制说明
rtlcss插件的启用完全依赖NODE_ENV=RTL,单独直接运行 postcss 而不设置该变量时插件为false,不会产生 RTL 文件;RTL 生成必须走css-rtl脚本或等价的带环境变量的调用。css-rtl的输入显式排除了*.min.css与*.rtl.css,压缩版 RTL 文件由css-minify-rtl从.rtl.css另行生成,不要手动对.rtl.css再跑一次css-rtl。- 修改
src/scss/后,watch 流程会先触发css-compile(重编译主 CSS),再由watch-css-dist自动重跑css-rtl;手动重跑时用npm run css一条命令即可保证四步顺序正确。
【免费下载链接】AdminLTEAdminLTE - Free admin dashboard template based on Bootstrap 5项目地址: https://gitcode.com/GitHub_Trending/ad/AdminLTE
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考