Quasar QLayout 完整实战指南:view 布局矩阵、容器化模式与可访问性
前端UI组件跨平台【免费下载链接】quasarQuasar Framework - Build high-performance VueJS user interfaces in record time项目地址https://gitcode.com/gh_mirrors/qu/quasar点击查看免费下载Quasar Framework 中的 QLayout 是一个负责管理整个应用窗口的布局组件它通过独特的 3×3 矩阵式view字符串语法让开发者可以只靠一行配置就组合出头部、底部、左右抽屉与页面内容的各种排列方式。本文以 QLayout 官方文档为核心结合本仓库中 QLayout 的源码实现ui/src/components/layout/QLayout.js与其 API 定义ui/src/components/layout/QLayout.json完整讲解view属性的每个字符含义、容器化布局的用法与限制、可复用的路由布局结构以及开箱即用的可访问性地标结构帮助你真正掌握 Quasar 应用的整体布局设计。QLayout 是什么为什么它是布局的核心QLayout 是一个用于管理整个窗口、并将页面内容包裹在导航栏、抽屉等元素之内的组件。它的关键优势在于多个页面可以共享同一个 QLayout——只要把页面的公共框架头部、抽屉、底部定义一次路由下的所有子页面都能复用这套结构代码天然可复用。需要明确的是QLayout 并不是强制使用的但它提供的开箱即用特性例如页头/页脚/抽屉的位置自动管理、页面min-height自动计算、滚动事件上报等能够大幅简化网站/应用布局设计。其默认插槽default slot建议放置 QHeader、QFooter、QDrawer、QPageContainer 这几个子组件见 QLayout.json 中 slots 的定义。使用 QLayout 前必须知道的规则禁止使用 margin只能使用 padding使用 margin 会破坏布局QLayout 依赖占据整个屏幕QPageContainer、QHeader、QFooter、QDrawer 的位置都由它通过view属性统一管理。因此在 QLayout 自身以及上述 QLayout 子组件上不能使用 CSS 的 marginmargin 会导致这些组件的定位计算失效但可以放心使用 CSS 的 padding。配合 Vue Router 子路由使用如果布局使用了 Vue Router 子路由官方推荐的做法那么应当在布局模板中放置 Vue 的router-view /组件它充当子路由被注入的占位符。更详细的做法请参考路由与布局、页面的配合。理解 view 属性Quasar 独有的 3×3 布局矩阵Quasar 引入了一个独特且优秀的布局概念仅通过修改一段简短的字符串记法就能让布局以特定方式组织起来。想象你的布局是一个 3×3 的容器矩阵第一行容器对应头部header最后一行对应底部footer第一列容器对应左left最后一列对应右right矩阵正中心、位于头部之下底部之上的区域就是页面 / 主内容容器page。这个QLayout View矩阵可以表示为一个传给 QLayoutview属性的字符串该字符串必须恰好包含 11 个字符3 个字符定义头部行header row然后一个空格3 个字符定义中间行middle row一个空格最后 3 个字符定义底部行footer row例如默认值是hhh lpr fff。官方文档配套的可视化演示组件ViewProp.vue 与 ViewPlay.vue直观展示了这个 3×3 矩阵与每个格子可用字符的对应关系。每个位置可用的字符从源码 QLayout.js 中的校验正则可以看到 view 字符串的合法形态const viewRE /^(h|l)h(h|r) lpr (f|l)f(f|r)$/结合官方文档与源码中rows的解析逻辑QLayout.js将 view 按空格拆成三行、再逐字符展开各行各列的合法字符含义如下行位置可选字符含义头部行左h/lheader 延伸到此格 / left drawer 占据此格头部行中h/H非固定 header /固定 headerH 表示 fixed见下文大小写说明头部行右h/rheader 延伸到此格 / right drawer 占据此格中间行左l/L非固定 left drawer /固定 left drawer中间行中p固定字符表示 page主内容区不可替换中间行右r/R非固定 right drawer /固定 right drawer底部行左f/lfooter 延伸到此格 / left drawer 占据此格底部行中f/F非固定 footer /固定 footer底部行右f/rfooter 延伸到此格 / right drawer 占据此格大小写敏感固定位置的开关这些字母区分大小写。例如只要使用至少一个大写的 L而不是小写 l你的布局左侧抽屉就会处于固定fixed位置。同样规则适用于 H头部、F底部以及 R右侧/抽屉。典型配置示例如果你希望布局的右侧/抽屉位于头部、页面和底部的右侧使用hhr lpr ffr如果还想让它固定只需把其中一个r改成大写例如hhr lpR ffr或hhR lpr ffr或hhr lpr ffR这些设置完全由你按需组合甚至可以写出lhh LpR ffr这样疯狂的配置——试试看两个重要警告必须指定 QLayout 的所有区域即使你不使用底部或右侧抽屉也仍然要在view属性中把它们全部写出来即保持 11 个字符的完整结构。overlay 模式强制固定当 QDrawer 设置为 overlay覆盖模式时它会强制抽屉进入固定位置无论 QLayout 的view属性配置的是 l/r 还是 L/R。此外如果在 iOS 平台且 QLayout 处于容器化状态同样会强制 QDrawer 固定位置——这是无法克服的平台限制。容器化 QLayoutContainerized默认情况下 QLayout 管理整个窗口但也可以把 QLayout 作为容器使用通过container属性给它指定宽高后将其隔离在页面中的某个位置。这在 QLayout.json 中也有说明该属性改变默认的占满整个窗口的行为特别适用于但不限于在 QDialog 中使用。警告容器化 QLayout必须显式设置 CSS 高度或 min-height否则无法正常工作。容器化示例中两侧各有一个抽屉左侧抽屉断点为 700px、右侧为 500px。注意这里的断点不是指窗口宽度而是指 QLayout 容器的实际宽度。从源码看容器化与标准布局的渲染结构完全不同QLayout.js标准模式直接渲染q-layout q-layout--standard的 div并设置minHeight: $q.screen.height px的样式容器模式额外包裹一层q-layout-container overflow-hidden内部通过absolute-fullscroll的结构实现容器内滚动并用QResizeObserver监听容器尺寸onContainerResize来计算滚动条宽度updateScrollbarWidth见 QLayout.js保证容器化布局内页面宽度计算的准确性。QLayout 的totalWidth计算QLayout.js也体现了这个差异标准布局宽度等于窗口宽度页面滚动条不会改变它而容器化布局宽度等于其页面宽度加自身滚动条宽度。容器化 QLayout 的典型落地场景包括将 QLayout 嵌入 QDialog 弹窗中让弹窗内部拥有独立的头部/抽屉/页面结构。QLayout 的子组件体系QLayout 本身不渲染任何地标语义它的职责是作为外壳协调下列子组件的位置位置由view属性决定并为其提供共享状态源码中通过provide(layoutKey, $layout)向子组件注入包含 header/right/footer/left 尺寸与偏移的响应式对象见 QLayout.jsQHeader / QFooter头部与底部栏通常用于导航栏等可配合 QToolbar、QBreadcrumbs、QTabs 使用还支持reveal滚动时隐藏/显示与 iOS 风格、桌面应用风格Electron 隐藏默认窗口边框等用法详见头部与底部文档QDrawer左右侧边栏拥有 desktop / mobile 两种行为、mini 迷你模式、overlay 覆盖模式、触摸手势滑动关闭/打开、persistent持久化等丰富特性详见抽屉文档QPageContainer / QPage页面内容区。QPage 必须被 QPageContainer 包裹且 QPageContainer 必须是 QLayout 的子级。默认情况下 QPage 会被设置min-height确保即使内容只有几行也能填满屏幕它还建立自己的块级格式化上下文display: flow-root防止子元素垂直 margin 塌陷穿透详见页面文档。QPage 的style-fn属性允许你调整甚至移除默认的min-heighttemplate q-page :style-fnmyTweak.../q-page /template script setup function myTweak(offset) { // offset 是一个数字像素表示根据 QLayout view 配置 // header footer 在屏幕上占据的总高度 // 下面就是 Quasar 默认 style-fn 实际做的事情 return { minHeight: offset ? calc(100vh - ${offset}px) : 100vh } } /script用路由复用布局Layout Pages 的标准模式推荐的工程实践是把布局做成路由的外壳组件。用 Quasar CLI 可以快速生成quasar new layout User quasar new page Profile Posts然后在/src/router/routes.js中把页面声明为布局路由的 children布局模板中通过router-view /注入子页面!-- /src/layouts/User.vue -- q-layout ... !-- 子页面在这里被注入 -- q-page-container router-view/router-view /q-page-container ... /q-layout// /src/router/routes.js export default [ { path: /user, component: () import(/layouts/user), children: [ { path: feed, component: () import(/pages/user-feed) }, { path: profile, component: () import(/pages/user-profile) } ] } ]这样/user/feed、/user/profile等路由都会共享同一个 QLayout 的头部与抽屉。Quasar 提供layouts指向/src/layouts与pages指向/src/pages等开箱即用的 Vite 别名且支持懒加载() import(...)与直接导入两种写法。完整细节见路由与布局、页面的配合。QLayout 的事件QLayout 通过内部挂载的 QScrollObserver 与 QResizeObserverQLayout.js监听滚动与尺寸变化对外暴露三个事件定义见 QLayout.json事件触发时机参数resize布局尺寸高、宽变化时{ height, width }新尺寸对象scroll用户在布局内滚动时{ position, direction: up/down, directionChanged, delta, inflectionPoint }滚动详情对象scroll-height布局的滚动尺寸变化时height新的滚动高度值得注意的源码细节在滚动被锁定时如移动端抽屉打开导致 body 滚动锁定时布局会缓存被抑制的滚动信息suppressedScroll并在锁释放且未恢复原位置时补发滚动事件QLayout.js保证滚动状态同步的准确性。可访问性Accessibilityv2.25一个包含常规子组件的 QLayout 会开箱即用地产生正确的 landmarks地标结构QHeader 渲染真实的header元素banner 地标QFooter 渲染真实的footer元素footer 地标每个 QDrawer 渲染一个aside元素complementary 地标QPage 渲染页面的main元素main 地标QLayout 自身与 QPageContainer 是无语义的普通容器不宣称任何地标。屏幕阅读器用户因此无需额外工作就能在 banner、footer、complementary 与 main 区域之间跳转。以下两点需要你负责不要添加自己的main元素QPage 已经是 main每个页面必须且只能有一个 main当使用多个抽屉时为每个抽屉设置aria-label这样辅助技术才能区分不同的 complementary 区域。各子组件的可访问性细节如 QHeader/QFooter 的 reveal 行为、QDrawer 的键盘 Escape 关闭、焦点处理等分别见头部与底部文档、抽屉文档与页面文档。小结QLayout 是 Quasar 应用布局的地基通过 11 字符的view字符串即可精确控制头部、底部、左右抽屉与页面内容的排布与固定方式通过container属性可以把整套布局结构装进任意容器甚至 QDialog配合 Vue Router 子路由与router-view /一套布局即可被多个页面复用而 v2.25 起默认的正确地标结构让可访问性几乎零成本。掌握这些机制后你便能在 Quasar 项目中快速搭建出结构清晰、可复用、无障碍友好的页面框架。赞分享前端UI组件跨平台【免费下载链接】quasarQuasar Framework - Build high-performance VueJS user interfaces in record time项目地址https://gitcode.com/gh_mirrors/qu/quasar点击查看免费下载相关推荐QMK 矩阵图完全解读CherryB.Studio CB87v2 的矩阵布局与多布局配置实战QMK 矩阵图完全解读CherryB.Studio CB87v2 的矩阵布局与多布局配置实战 本篇技术指南以 QMK Firmware 仓库中 keyboar嵌入式固件驱动开发硬件开发QMK 矩阵图实战解读CannonKeys Cerberus 可焊版 PCB 的 5×18 矩阵与多布局设计QMK 矩阵图实战解读CannonKeys Cerberus 可焊版 PCB 的 5×18 矩阵与多布局设计 本文以 QMK Firmware 仓库中 Cer嵌入式固件驱动开发硬件开发Karpenter 兼容性矩阵 CLI 工具 kompat 完全指南从 YAML 数据到可视化兼容矩阵Karpenter 兼容性矩阵 CLI 工具 kompat 完全指南从 YAML 数据到可视化兼容矩阵 导读 kompat 是 karpenter provi上一篇告别繁琐配置Hyper与WSLg无缝集成实现Linux GUI应用一键运行下一篇CANN/GE ACL模型描述获取API创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →