floating panel - 带有锚点功能和可拖拽顶栏的浮动面板

在现代的前端应用中,浮动面板是一个非常常见的UI组件,它能够为用户提供额外的信息和操作空间,同时又不会占据页面的主要内容区域。本文将详细记录如何实现一个带有锚点功能和可拖拽顶栏的浮动面板。

设计思路

这个浮动面板将由三个主要部分组成:父元素(floating-panel)、标头(floating-panel-header)和内容(floating-panel-content)。我们将通过设置父元素的偏移值来实现浮动效果,并通过监听touchmove事件来实现拖拽功能。

1. 父元素设计

父元素floating-panel将作为整个浮动面板的容器。常态下,我们将为它设置一个初始的偏移值,使其位于页面的底部。

2. 标头设计

标头floating-panel-header将作为用户交互的主要区域。它将包含一个可拖拽的顶栏,用户可以通过拖动这个顶栏来改变浮动面板的高度。我们将为这个顶栏添加touchmove事件监听器,以便在用户拖动时动态改变父元素的偏移值。

根据设计,我们的锚点可以大概设计为三个:底部、页面一半高度、页面顶部,分别对应不同的父元素偏移值

为了实现锚点功能,可以利用touchmovetouchend事件,根据 touchmoveclientY属性判断父元素最终的偏移值;

 touchmovetouchend都需要动态改变父元素的偏移,最终通过touchend来固定,以满足拖动的动画效果。

3. 内容设计

内容floating-panel-content将展示实际的信息和操作界面。它将根据父元素的偏移值动态调整自身的高度和显示内容。

实现步骤

1. HTML结构

首先,我们需要构建浮动面板的基本HTML结构。以下是一个简单的示例:

<div className="floating-panel" id="floating-panel" style={{ transform: `translateY(${window.innerHeight - 160}px)` }}><div className="floating-panel-header" id="floating-panel-header"><div className="floating-panel-header-bar"></div></div><div className="floating-panel-content" id="floating-panel-content"><div className="content" id="content"><Content..... /></div></div>
</div>

2. CSS样式

接下来,我们需要为浮动面板添加一些基本的CSS样式。以下是一个示例:

.floating-panel {background-color: rgba(30, 30, 30, 1);border-radius: 10px;height: 100%;&-header {display: flex;justify-content: center;align-items: center;cursor: grab;height: 20px;&-bar {height: 4px;width: 30px;border-radius: 10px;background-color: rgba(79, 79, 79, 1);}}&-content {padding: 10px;overflow-y: auto;max-height: 400px; /* 根据需要调整 */}}

3. JavaScript逻辑

最后,我们需要添加一些JavaScript逻辑来实现拖拽功能和锚点功能。

const initTouch = () => {const ele = document.getElementById('floating-panel-header');const panel = document.getElementById('floating-panel');const contentEle = document.getElementById('content'); // 内容元素let transformY = window.innerHeight - 160,contentHeight = window.innerHeight - 225;ele?.addEventListener('touchmove', (e) => {e.preventDefault();const { clientY } = e.touches[0];if (clientY < 180) {transformY = 0;contentHeight = window.innerHeight - 225;} else if (clientY >= 180 && clientY < window.innerHeight / 2 + 150) {transformY = window.innerHeight / 2 - 100;contentHeight = window.innerHeight - 545;} else {transformY = window.innerHeight - 160;contentHeight = window.innerHeight - 225;}panel.style.transform = `translateY(${clientY - 50}px)`;});ele?.addEventListener('touchend', () => {panel.style.transform = `translateY(${transformY}px)`;contentEle.style.height = `${contentHeight}px`;});};

注意事项

  • 在实现拖拽功能时,我们禁用了父元素的过渡效果,以确保拖拽过程中的高度变化是即时的。在拖拽结束后,我们恢复了过渡效果,以便父元素能够平滑地回到其最终位置。
  • 请注意,这个示例中的拖拽功能仅适用于移动端操作。如果你需要支持web设备,可以考虑使用mousedownmousemovemouseup事件来实现类似的逻辑。

通过以上步骤,我们成功实现了一个带有锚点功能和可拖拽顶栏的浮动面板。这个浮动面板可以根据用户的操作动态调整其高度,并且能够快速定位到指定的锚点位置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/864510.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20241413《计算机基础与程序设计》课程总结

每周作业链接汇总 1.第一周作业 简要内容:学习“基于VirtualBox虚拟机安装Ubuntu图文教程”在自己笔记本上安装Linux操作系统、学习掌握二进制,十进制和十六进制之间的转换、快速浏览《计算机和学概论》,并对每章提出了自己的疑问3.第三周作业 简要内容:数字分类与计数法 位…

Python学习(五)——配套《PyTorch深度学习实战》

1. Python的流程控制tips:我使用的Python3.9版本,if、else是要加:的 Python的流程控制主要通过条件语句和循环语句来实现,它们允许程序根据特定的条件执行不同的代码块。以下是Python中常用的流程控制结构:条件语句(if-elif-else) 条件语句允许程序根据条件的真假来选择执…

MOSFET 场效应管:IRF4905(P沟道)、IRF3205(N沟道)

在 H 桥电路中,同时用到 IRF4905、IRF3205 。G - D - S Gate 栅极, Drain 漏极, Source 源极 IRF4905IRF3205P沟道N沟道 通过调控 栅极G 电压(相对 源S),形成电场,从而控制 漏D-源S 电流。 P沟道的源极S接输入,漏极D导通输出 触发:V GS th , -4.0 ~ -2.0 V 。举例:(详…

为了解决服务启动慢的问题,我为什么要给Apollo和Spring提交PR?

最近在整理之前记录的工作笔记时,看到之前给团队内一组服务优化启动耗时记录的笔记,简单整理了一下分享出来。问题原因并不复杂,主要是如何精准测量和分析,优化后如何定量测量优化效果,说人话就是用实际数据证明优化效果。 背景 团队内有一组服务启动明显较其它服务要慢(…

【MATLAB】自学记录之读取DEM高程数据文件并渲染成三维地形图

1. 前言 近日在学习MATLAB编程以及地理高程数据处理等相关知识时,希望通过MATLAB的绘图等相关函数,读取高程数据文件,最后以可视化的方式展示全球陆地范围内的三维高程数据图。 2. 运行环境及数据序号 配置项 说明1 CPU Intel i5-12490F2 内存 16G*2, 3600MHz3 磁盘 256G,S…

Redpanda Console - 流数据管理控制台

Redpanda Console - 流数据管理控制台 简介 Redpanda是一个与Kafka兼容的流媒体数据平台,该平台具有高性能、操作友好和云就绪性。这家总部位于旧金山的公司成立于2019年,专注于Kafka公司关键任务系统的替代产品。 Redpanda使用C++重写Kafka,与Kafka API完全兼容,可以与所有…

Prometheus+Grafana监控flink任务指标

Prometheus+Grafana监控flink任务指标 前期准备 Prometheus 是一款基于时序数据库的开源监控告警系统,由go语言开发,Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态,任意组件只要提供对应的HTTP接口就可以接入监控。 Grafana 是一款采用Go语言编写的开源应用…

Visual Studio中的C#项目连接本地mysql数据库

一、给项目搭载Mysql连接所需的NuGet包 1.点击visual studio上方导航栏的"工具"选项 2.在下拉框中选中"NuGet包管理器" 3.在展开的侧边栏中选择"管理解决方案的 NuGet 程序包" 4.在新打开的窗口中选择"浏览" 5.搜索框中输入"mysq…

P6822 [PA 2012 Finals] Tax

一个小Trick。很牛的题目!! 直接做可能比较困难,你要考虑一些东西重构一下原图。 这一个题目因为是与边相关的,考虑拆边,拆成两条有向边,那么对于一个点的贡献,我们暴力枚举他的边,两条边的贡献就是取 max。 但这个显然过不了,我们有一种差分建边的方式,按照边权排序…

20241421 《计算机基础与程序设计》课程总结

第一周作业 1.学习了有关专业的技能培养方向 2.对《计算机基础与程序设计》进行了大致的浏览,大概了解了计算机的相关理论知识 3.学习了有关2进制、8进制、10进制、16进制之间的转换第二周作业 1.《计算机科学概论》:第一章向我们介绍了计算机科学这门学科的内容以及其基本概…

[.NET] 单位转换实践:深入解析 Units.NET

在现代软件开发中,准确处理不同单位的转换是一个常见而复杂的需求。无论是处理温度、长度、重量还是其他物理量,都需要可靠的单位转换机制。本文将深入介绍 Units.NET 库,展示如何在 .NET 应用中优雅地处理单位转换。单位转换实践:深入解析 Units.NET 摘要 在现代软件开发中…

卡诺图化简

卡诺图化简 卡诺图(Karnaugh Map,简称K图)是一种用于简化布尔代数表达式的工具。它通过将真值表的值图形化,帮助我们更直观地找到最小项和最大项,从而简化逻辑表达式。 卡诺图的基本概念单元格:每个单元格代表一个布尔变量的可能取值组合。 邻接:两个单元格如果只有一个…