ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Flowbite Drawer(Off-canvas)组件完全指南:数据属性、四向定位与 Drawer API 实战

Flowbite Drawer(Off-canvas)组件完全指南:数据属性、四向定位与 Drawer API 实战 UI组件前端【免费下载链接】flowbiteOpen-source UI component library and front-end development framework based on Tailwind CSS项目地址https://gitcode.com/gh_mirrors/fl/flowbite点击查看免费下载Flowbite 的 Drawer 组件又称 off-canvas是一类固定在文档页面某侧、可展开与收起的面板元素常用于侧边导航、联系表单、信息展示及其他用户操作场景。本指南将基于 content/components/drawer.md 与 src/components/drawer/index.ts 的源码实现系统讲解 Drawer 的初始化方式、全部数据属性、四种方向定位、body 滚动与 backdrop 控制、滑动边缘swipeable edge功能以及通过 Drawer API 进行程序化控制的完整方法读完即可在项目中直接复刻官方示例并扩展出自定义抽屉面板。使用前提引入 Flowbite JavaScriptDrawer 的交互依赖data-*属性解析与 Drawer API因此需要先引入 Flowbite 的 JavaScript 文件。按照 getting-started/quickstart 的说明可通过本地文件或 CDN 引入!-- 本地构建产物 -- script src../path/to/flowbite/dist/flowbite.min.js/script !-- 或使用 CDN -- script srchttps://cdn.jsdelivr.net/npm/flowbite版本号/dist/flowbite.min.js/script从源码角度看引入的flowbite.min.js会注册window.Drawer与window.initDrawers见 src/config/global.ts并在initFlowbite()时统一调用所有组件的初始化函数见 src/components/index.ts。页面加载后凡带有data-drawer-*属性的元素都会被自动解析并创建 Drawer 实例。默认 Drawer初始化与显示控制核心数据属性要初始化一个 Drawer首先需要在触发元素例如一个按钮上设置data-drawer-target{id}其值必须等于 Drawer 组件自身的id。随后可以用以下属性控制 Drawer 的显示、隐藏与切换值同样为 Drawer 的 id属性作用data-drawer-show{id}显示 Drawer 组件data-drawer-hide{id}隐藏 Drawer 组件data-drawer-toggle{id}切换 Drawer 组件的可见性可访问性Accessibility为兼顾无障碍访问官方建议在触发 Drawer 的元素上添加aria-controls{id}在 Drawer 组件上添加aria-labelledby{id}其值为 Drawer 标题元素的 id。源码在初始化与显隐过程中还会自动维护状态属性init()时为 Drawer 设置aria-hiddentruesrc/components/drawer/index.ts 第 58 行show()时移除aria-hidden并添加aria-modaltrue与roledialoghide()时则恢复aria-hiddentrue并移除这两个属性。也就是说除了手动声明Drawer 的模态语义也会随显隐自动同步。防止闪烁默认隐藏 Drawer为避免页面初次渲染时 Drawer 闪现应给 Drawer 元素应用以下类使其处于画布之外off-canvastransition-transform left-0 top-0 -translate-x-full其中-translate-x-full将左侧 Drawer 沿 X 轴平移出视口transition-transform保证展开/收起时有平滑过渡。默认 Drawer 完整示例!-- drawer init and toggle -- div classtext-center button classinline-flex items-center justify-center text-white bg-brand box-border border border-transparent hover:bg-brand-strong focus:ring-4 focus:ring-brand-medium shadow-xs font-medium leading-5 rounded-base text-sm px-4 py-2.5 focus:outline-none typebutton />Drawer 导航栏把侧边导航放进抽屉Drawer 最常见的用途之一就是承载导航菜单。官方示例在data-drawer-navigation中放入品牌 Logo、可折叠的子菜单借助data-collapse-toggle与 Collapse 组件以及带徽标/计数器的导航项结构如下!-- drawer component -- div iddrawer-navigation classfixed top-0 left-0 z-40 h-screen p-4 overflow-y-auto transition-transform -translate-x-full bg-neutral-primary-soft w-80 border-e border-default tabindex-1 aria-labelledbydrawer-navigation-label !-- 头部Logo 关闭按钮 -- div classborder-b border-default pb-4 flex items-center a hrefhttps://flowbite.com/ classflex items-center space-x-2 rtl:space-x-reverse img srchttps://flowbite.com/docs/images/logo.svg classh-6 w-6 altFlowbite Logo / span classself-center text-lg font-semibold whitespace-nowrap text-headingFlowbite/span /a button typebutton>div iddrawer-contact classfixed top-0 left-0 z-40 h-screen p-4 overflow-y-auto transition-transform -translate-x-full bg-neutral-primary-soft w-80 border-e border-default tabindex-1 aria-labelledbydrawer-contact-label !-- 头部标题 关闭按钮 -- div classborder-b border-default pb-4 mb-5 flex items-center h5 iddrawer-label-contact classinline-flex items-center text-lg font-medium text-body Contact Us /h5 button typebutton>div iddrawer-form classfixed top-0 left-0 z-40 h-screen p-4 overflow-y-auto transition-transform -translate-x-full bg-neutral-primary-soft w-80 border-e border-default tabindex-1 aria-labelledbydrawer-form-label div classborder-b border-default pb-4 mb-5 flex items-center h5 iddrawer-label-event classtext-lg font-medium text-bodyNew event/h5 button typebutton>button typebutton>button typebutton>button typebutton>button typebutton>!-- 禁用 body 滚动默认 -- button typebutton>!-- 启用遮罩默认 -- button typebutton>button typebutton>// 设置 Drawer 菜单元素 const $targetEl document.getElementById(drawer-js-example); // 带默认值的选项 const options { placement: right, backdrop: true, bodyScrolling: false, edge: false, edgeOffset: , backdropClasses: bg-dark/50 fixed inset-0 z-30, onHide: () { console.log(drawer is hidden); }, onShow: () { console.log(drawer is shown); }, onToggle: () { console.log(drawer has been toggled); }, }; // 实例选项对象 const instanceOptions { id: drawer-js-example, override: true };初始化 Drawer 实例import { Drawer } from flowbite; /* * $targetEl (required) * options (optional) * instanceOptions (optional) */ const drawer new Drawer($targetEl, options, instanceOptions);使用show和hide方法直接控制显示与隐藏// 显示 drawer drawer.show(); // 隐藏 drawer drawer.hide();使用toggle切换可见性、isVisible检查状态// 切换 drawer drawer.toggle(); // 返回 true 或 false drawer.isVisible();对应的 HTML 结构供上述 JS 使用!-- drawer component -- div iddrawer-js-example classfixed top-0 left-0 z-40 h-screen p-4 overflow-y-auto transition-transform -translate-x-full bg-neutral-primary-soft border-e border-default w-80 tabindex-1 aria-labelledbydrawer-js-example !-- 头部与导航内容可参考 Drawer navigation 示例 -- div classpy-5 overflow-y-auto ul classspace-y-2 font-medium lia href# classflex items-center px-2 py-1.5 ...Dashboard/a/li !-- 更多导航项 -- /ul /div /divTypeScript 用法如果使用 Flowbite 的 TypeScript 配置可以导入 Drawer 的类、参数与选项类型import { Drawer } from flowbite; import type { DrawerOptions, DrawerInterface } from flowbite; import type { InstanceOptions } from flowbite; // 设置 Drawer 菜单元素 const $targetEl: HTMLElement document.getElementById(drawer-js-example); // 带默认值的选项 const options: DrawerOptions { placement: right, backdrop: true, bodyScrolling: false, edge: false, edgeOffset: , backdropClasses: bg-gray-900/50 dark:bg-gray-900/80 fixed inset-0 z-30, onHide: () { console.log(drawer is hidden); }, onShow: () { console.log(drawer is shown); }, onToggle: () { console.log(drawer has been toggled); }, }; // 实例选项对象 const instanceOptions: InstanceOptions { id: drawer-js-example, override: true }; /* * $targetEl (required) * options (optional) * instanceOptions (optional) */ const drawer: DrawerInterface new Drawer($targetEl, options, instanceOptions); // 显示 drawer drawer.show();数据属性与 Drawer API 的底层联动理解底层机制有助于排查问题。initDrawers()src/components/drawer/index.ts 第 316-454 行在初始化时做了四件事扫描所有[data-drawer-target]元素读取data-drawer-placement、data-drawer-body-scrolling、data-drawer-backdrop、data-drawer-edge、data-drawer-edge-offset属性并创建Drawer实例若目标 id 不存在会在控制台输出错误提示。为所有[data-drawer-toggle]元素绑定click事件调用实例的toggle()。为所有[data-drawer-dismiss]、[data-drawer-hide]元素绑定click事件调用hide()。为所有[data-drawer-show]元素绑定click事件调用show()。所有实例都会注册到 Flowbite 的 Instance Managerinstances.addInstance(Drawer, ...)这也是instanceOptions.id与override参数的用途所在——可参考 getting-started/javascript 中对 Instance Manager 与实例选项的说明。除此之外Drawer 在init()时会向document注册keydown监听器当用户按下Escape键且 Drawer 可见时自动隐藏src/components/drawer/index.ts 第 66-77 行这是 Drawer 默认可通过 Esc 关闭行为的实现来源destroy()时该监听器会被移除。小结Flowbite Drawer 组件兼具“零 JS 配置”的数据属性方案与完整的 JavaScript/TypeScript API通过data-drawer-target/show/hide/toggle四组属性即可完成初始化与显隐控制通过data-drawer-placement实现四向定位通过data-drawer-body-scrolling、data-drawer-backdrop、data-drawer-edge/data-drawer-edge-offset精细调控滚动、遮罩与边缘露出行为当需要更复杂的程序化控制时new Drawer(targetEl, options, instanceOptions)配合show()/hide()/toggle()/isVisible()等方法与回调函数足以支撑侧边导航、联系表单、事件创建面板等各类实战场景。更完整的组件变体可参考原文档 content/components/drawer.md 以及源码 src/components/drawer/index.ts 中的实现。赞分享UI组件前端【免费下载链接】flowbiteOpen-source UI component library and front-end development framework based on Tailwind CSS项目地址https://gitcode.com/gh_mirrors/fl/flowbite点击查看免费下载相关推荐Element UI Drawer 抽屉组件完整实战指南API、四向展开、嵌套与关闭流程源码解析Element UI Drawer 抽屉组件完整实战指南API、四向展开、嵌套与关闭流程源码解析 Element UIVue.js 2.0 UI Toolk前端UI组件设计系统Naive UI Drawer 抽屉组件完全指南定位、缩放、多层抽屉与 API 全解析Naive UI Drawer 抽屉组件完全指南定位、缩放、多层抽屉与 API 全解析 Naive UIA Vue 3 Component Library前端UI组件Element Plus Drawer 抽屉组件完全指南API、插槽与可拖拽缩放实战Element Plus Drawer 抽屉组件完全指南API、插槽与可拖拽缩放实战 导读 Drawer 抽屉是 Element Plus 中与 Dial前端UI组件上一篇Android TV交互设计终极指南D-Pad导航与焦点管理下一篇VVVV.js将可视化编程带入Web世界创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表