电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Vue3 實現雙盒子定位Overlay的示例

瀏覽:61日期:2022-10-17 09:57:20

在 Vue 3 中,使用 <Teleport> 可以很優雅的把某個組件渲染到根節點之外的節點,同時使其渲染的內容不喪失響應式和對應的生命周期函數調用。那么基于此,用 <Teleport> 實現相對于某一元素的 Overlay 。 實際上,這篇文章跟 Vue3 的關系不大,只是通過 Vue3 講解一類 Overlay 的設計方法。

原理

要實現相對于某一元素的 Overlay 需要依靠兩個元素,Origin 和 Panel,Origin 表示相對于的元素,而 Panel 表示 Overlay 本身,實現方法主要有兩種。

文本流定位法,基于 position 的 absolute 和 relative 特性,將 Panel 形成相對于 Origin 的位置來定位的方式。Overlay 基于 Origin 做固定偏移的雙盒子定位法,也就是本文需要講解的方法。實現 首先,通過<Teleport>,能夠建立頂層 Overlay,也就是在根節點創建一個新的節點。

setup(_, ctx) { const originRef = ref<HTMLElement>(); const panelRef = ref<HTMLElement>(); const panelStyle = ref<CSSProperties>({ position: ’absolute’ }); // ... return () => ( <> <div ref={originRef}>origin</div> <Teleport to='#cdk-overlay-anchor'> <div style={{ position: ’fixed’, top: 0, left: 0, right: 0, bottom: 0, height: ’100vh’, width: ’100vw’ pointerEvents: ’none’}}> <div ref={panelRef} style={panelStyle.value}> <div style={{height: ’100px’, width: ’100px’ border: ’1px solid black’}} /> </div> </div> </Teleport> </> );}

拿到這兩者的 dom ref 后,需要通過實時計算 Origin 的盒子的大小和位置,來獲得 Panel 的相對偏移。在 Vue 中,元素只有在 mounted 后才能獲取得到,所以可以通過 composition-api 的 onMouted 來獲取具體元素。然后再在 生命周期中 進行計算。

計算兩個盒子的相對位置

如何計算 Origin 的大小和位置,以及獲取其變化后的監聽。Origin 的大小和位置,通過 getBoundingClientRect 這一 API 來獲取,這一就可以開始計算 Overlay 的相對位置。假設我們要把 Overlay 放在 Origin 的正下方,計算函數應該是這樣的。

const panelStyle = ref<CSSProperties>({ position: ’absolute’ });onMounted(() => { const origin = originRef.value; const panel = panelRef.value; if (!origin || !panel) { return ; } const calculate = () => { const rect = origin.getBoundingClientRect(); // 原點為 origin 元素的底邊中央正下方 const originX = rect.left + (rect.width / 2); const originY = rect.bottom; // panel的坐標為到原點的偏移 const panelRect = panel.getBoundingClientRect(); const panelX = originX - panelRect.width / 2; const panelY = originY; // 設置 panel 數據,觸發節點變更 panelStyle.value.left = `${panelX}px`; panelStyle.value.top = `${panelY}px`; };});

當然,你還可以計算各個不同方向的 Panel 坐標(比如,正左、正上、正下等),排列組合一下,一共有種27不同的情況(每個點依賴于兩個變量 X 和 Y;每個變量有三種不同的情況,左、中、右,或者,上、中、下)。

監聽盒子的變化

在這里,我們將使用瀏覽器自帶的API 來對他們進行監聽。通過 MutationObserver 和 ResizeObserver,可以很輕松的監聽 Origin 和 Panel 的大小和位置變化。

首先是監聽 Origin 的大小和位置變化,這里采用的是 MutationObserver,因為導致位置變化的原因只能是 style,所以只需要監聽 style 的變化即可。

const origin$ = new MutationObserver(calculate);origin$.observe(origin, { // 只需要拿到 attribute 的 style 的變化即可 attributeFilter: [’style’],});

Panel 只需要監聽其大小的變化,大小變化有一個更加完美的API, ResizeObserver。

const panel$ = new ResizeObserver(calculate);panel$.observe(panel);

然后,需要在dom銷毀前取消監聽。

// dom銷毀前取消監聽onBeforeUnmount(() => { origin$.disconnect(); panel$.disconnect();});監聽窗口事件

為了能夠正確的獲取變化,我們需要監聽兩個事件:resize 和 scroll.

// 為了能夠在滾動事件捕獲前進行計算,帶有滾動條的子元素也會因此觸發計算window.addEventListener(’scroll’, calculate, true);window.addEventListener(’resize’, calculate);最后,仍然要在銷毀前取消事件。// dom銷毀前取消監聽onBeforeUnmount(() => { window.removeEventListener(’scroll’, calculate, true); window.removeEventListener(’resize’, calculate);});

至此,已經完成基本的雙盒子定位法的 Overlay 的設計。

小結

通過雙盒子定位來構建的 Overlay 能夠有效規避 CSS 帶來的問題 zindex 等一系列相關的問題,只用通過計算盒子之間的相對偏移,就能讓 Panel 附著于 Origin 上,這樣,實現類似下拉或者 Tooltip 等功能的時候,就會非常有用。同時,附上一個簡單例子,希望能帶來一些啟發。

以上就是Vue3 實現雙盒子定位Overlay的示例的詳細內容,更多關于vue3 實現Overlay的資料請關注好吧啦網其它相關文章!

標簽: Vue
相關文章:
主站蜘蛛池模板: 考勤系统_考勤管理系统_网络考勤软件_政企|集团|工厂复杂考勤工时统计排班管理系统_天时考勤 | 土壤检测仪器_行星式球磨仪_土壤团粒分析仪厂家_山东莱恩德智能科技有限公司 | 专业广州网站建设,微信小程序开发,一物一码和NFC应用开发、物联网、外贸商城、定制系统和APP开发【致茂网络】 | 江苏全风,高压风机,全风环保风机,全风环形高压风机,防爆高压风机厂家-江苏全风环保科技有限公司(官网) | 升降机-高空作业车租赁-蜘蛛车-曲臂式伸缩臂剪叉式液压升降平台-脚手架-【普雷斯特公司厂家】 | 综合管廊模具_生态,阶梯护坡模具_检查井模具制造-致宏模具厂家 | 钢制暖气片散热器_天津钢制暖气片_卡麦罗散热器厂家 | 媒介云-全网整合营销_成都新闻媒体发稿_软文发布平台 | 柔性输送线|柔性链板|齿形链-上海赫勒输送设备有限公司首页[输送机] | 铝箔袋,铝箔袋厂家,东莞铝箔袋,防静电铝箔袋,防静电屏蔽袋,防静电真空袋,真空袋-东莞铭晋让您的产品与众不同 | 宜兴紫砂壶知识分享 - 宜兴壶人 医用空气消毒机-医用管路消毒机-工作服消毒柜-成都三康王 | 12cr1mov无缝钢管切割-15crmog无缝钢管切割-40cr无缝钢管切割-42crmo无缝钢管切割-Q345B无缝钢管切割-45#无缝钢管切割 - 聊城宽达钢管有限公司 | 深圳高新投三江工业消防解决方案提供厂家_服务商_园区智慧消防_储能消防解决方案服务商_高新投三江 | 北京森语科技有限公司-模型制作专家-展览展示-沙盘模型设计制作-多媒体模型软硬件开发-三维地理信息交互沙盘 | 宁夏活性炭_防护活性炭_催化剂载体炭-宁夏恒辉活性炭有限公司 | 北京亦庄厂房出租_经开区产业园招商信息平台| 小型气象站_便携式自动气象站_校园气象站-竞道气象设备网 | 蜘蛛车-登高车-高空作业平台-高空作业车-曲臂剪叉式升降机租赁-重庆海克斯公司 | 洛阳装修公司-洛阳整装一站式品牌-福尚云宅装饰 | 100_150_200_250_300_350_400公斤压力空气压缩机-舰艇航天配套厂家 | 罗氏牛血清白蛋白,罗氏己糖激酶-上海嵘崴达实业有限公司 | 专注提供国外机电设备及配件-工业控制领域一站式服务商-深圳市华联欧国际贸易有限公司 | 不干胶标签-不干胶贴纸-不干胶标签定制-不干胶标签印刷厂-弗雷曼纸业(苏州)有限公司 | 广州活动策划公司-15+年专业大型公关活动策划执行管理经验-睿阳广告 | 365文案网_全网创意文案句子素材站| 活性氧化铝球|氧化铝干燥剂|分子筛干燥剂|氢氧化铝粉-淄博同心材料有限公司 | 抓斗式清污机|螺杆式|卷扬式启闭机|底轴驱动钢坝|污水处理闸门-方源水利机械 | 焊接烟尘净化器__焊烟除尘设备_打磨工作台_喷漆废气治理设备 -催化燃烧设备 _天津路博蓝天环保科技有限公司 | 土壤检测仪器_行星式球磨仪_土壤团粒分析仪厂家_山东莱恩德智能科技有限公司 | 数控走心机-走心机价格-双主轴走心机-宝宇百科 | 螺杆泵_中成泵业| 螺旋压榨机-刮泥机-潜水搅拌机-电动泥斗-潜水推流器-南京格林兰环保设备有限公司 | 北京森语科技有限公司-模型制作专家-展览展示-沙盘模型设计制作-多媒体模型软硬件开发-三维地理信息交互沙盘 | 电机修理_二手电机专家-河北豫通机电设备有限公司(原石家庄冀华高压电机维修中心) | 避光流动池-带盖荧光比色皿-生化流动比色皿-宜兴市晶科光学仪器 东莞爱加真空科技有限公司-进口真空镀膜机|真空镀膜设备|Polycold维修厂家 | 喷砂机厂家_自动喷砂机生产_新瑞自动化喷砂除锈设备 | 全自动包装秤_全自动上袋机_全自动套袋机_高位码垛机_全自动包装码垛系统生产线-三维汉界机器(山东)股份有限公司 | 冷油器,取样冷却器,热力除氧器-连云港振辉机械设备有限公司 | 电动卫生级调节阀,电动防爆球阀,电动软密封蝶阀,气动高压球阀,气动对夹蝶阀,气动V型调节球阀-上海川沪阀门有限公司 | 氧化铁红厂家-淄博宗昂化工| 余姚生活网_余姚论坛_余姚市综合门户网站 |