• 前端开发:创建可拖动的固定位置 `<div>` 和自动隐藏悬浮按钮


    前端开发中,实现一个可拖动的固定位置

    ,并且根据拖动的状态控制其显示和隐藏,同时在特定条件下显示悬浮按钮,涉及以下技术和原理:

    技术细节和实现步骤:

    1. HTML 结构:

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    6. <title>Draggable Fixed Div with Auto Hide and Floating Buttontitle>
    7. <style>
    8. /* CSS 样式,定义拖拽元素和悬浮按钮的样式 */
    9. style>
    10. head>
    11. <body>
    12. <div id="draggable">
    13. <p>Drag me!p>
    14. <button>Click mebutton>
    15. div>
    16. <div id="dragButton">Showdiv>
    17. <script>
    18. // JavaScript 代码部分
    19. script>
    20. body>
    21. html>

    2. CSS 样式:

    1. #draggable {
    2. width: 200px;
    3. height: 200px;
    4. background-color: #ccc;
    5. position: fixed;
    6. top: 50px;
    7. left: 50px;
    8. touch-action: none; /* 禁止浏览器默认行为,如滚动 */
    9. transition: transform 0.3s ease;
    10. }
    11. #draggable.hidden {
    12. transform: scale(0);
    13. visibility: hidden;
    14. }
    15. #dragButton {
    16. position: fixed;
    17. bottom: 20px;
    18. right: 20px;
    19. background-color: #007bff;
    20. color: white;
    21. padding: 10px 20px;
    22. cursor: pointer;
    23. }

            • #draggable 样式:定义拖拽元素的基本样式,包括固定位置、尺寸、背景色等。

            • .hidden 类样式:用于控制拖拽元素隐藏时的动画效果

            • #dragButton 样式:定义悬浮按钮的基本样式,包括位置、背景色、文字颜色等。

    3. JavaScript 交互:

    1. const draggable = document.getElementById('draggable');
    2. const dragButton = document.getElementById('dragButton');
    3. let offsetX, offsetY;
    4. let isDragging = false;
    5. let autoHideTimeout;
    6. let lastVisiblePosition = { top: 50, left: 50 }; // 初始位置
    7. // 触摸事件处理
    8. draggable.addEventListener('touchstart', touchStart);
    9. draggable.addEventListener('touchmove', touchMove);
    10. draggable.addEventListener('touchend', touchEnd);
    11. // 鼠标事件处理
    12. draggable.addEventListener('mousedown', mouseDown);
    13. document.addEventListener('mousemove', mouseMove);
    14. document.addEventListener('mouseup', mouseUp);
    15. // 初始隐藏拖拽元素
    16. draggable.classList.add('hidden');
    17. function touchStart(e) {
    18. const touch = e.touches[0];
    19. offsetX = touch.clientX - draggable.getBoundingClientRect().left;
    20. offsetY = touch.clientY - draggable.getBoundingClientRect().top;
    21. isDragging = true;
    22. }
    23. function touchMove(e) {
    24. if (!isDragging) return;
    25. e.preventDefault(); // 阻止默认的滚动行为
    26. const touch = e.touches[0];
    27. let newX = touch.clientX - offsetX;
    28. let newY = touch.clientY - offsetY;
    29. // 限制拖动范围在可视区域内
    30. const maxX = document.documentElement.clientWidth - draggable.offsetWidth;
    31. const maxY = document.documentElement.clientHeight - draggable.offsetHeight;
    32. newX = Math.max(0, Math.min(newX, maxX));
    33. newY = Math.max(0, Math.min(newY, maxY));
    34. draggable.style.left = `${newX}px`;
    35. draggable.style.top = `${newY}px`;
    36. // 判断靠近边缘并自动贴边
    37. if (newX < 10) {
    38. draggable.style.left = '0';
    39. } else if (newX > maxX - 10) {
    40. draggable.style.left = `${maxX}px`;
    41. }
    42. if (newY < 10) {
    43. draggable.style.top = '0';
    44. } else if (newY > maxY - 10) {
    45. draggable.style.top = `${maxY}px`;
    46. }
    47. // 更新最后显示位置
    48. lastVisiblePosition = { top: parseInt(draggable.style.top), left: parseInt(draggable.style.left) };
    49. // 自动隐藏计时器重置
    50. clearTimeout(autoHideTimeout);
    51. draggable.classList.remove('hidden');
    52. dragButton.style.display = 'none';
    53. }
    54. function touchEnd() {
    55. isDragging = false;
    56. // 设置自动隐藏
    57. autoHideTimeout = setTimeout(() => {
    58. draggable.classList.add('hidden');
    59. // 固定悬浮按钮位置
    60. dragButton.style.top = '20px';
    61. dragButton.style.right = '20px';
    62. dragButton.style.display = 'block';
    63. }, 5000); // 5秒后自动隐藏
    64. }
    65. function mouseDown(e) {
    66. offsetX = e.clientX - draggable.getBoundingClientRect().left;
    67. offsetY = e.clientY - draggable.getBoundingClientRect().top;
    68. isDragging = true;
    69. }
    70. function mouseMove(e) {
    71. if (!isDragging) return;
    72. e.preventDefault(); // 阻止默认的拖动行为
    73. let newX = e.clientX - offsetX;
    74. let newY = e.clientY - offsetY;
    75. // 限制拖动范围在可视区域内
    76. const maxX = document.documentElement.clientWidth - draggable.offsetWidth;
    77. const maxY = document.documentElement.clientHeight - draggable.offsetHeight;
    78. newX = Math.max(0, Math.min(newX, maxX));
    79. newY = Math.max(0, Math.min(newY, maxY));
    80. draggable.style.left = `${newX}px`;
    81. draggable.style.top = `${newY}px`;
    82. // 判断靠近边缘并自动贴边
    83. if (newX < 10) {
    84. draggable.style.left = '0';
    85. } else if (newX > maxX - 10) {
    86. draggable.style.left = `${maxX}px`;
    87. }
    88. if (newY < 10) {
    89. draggable.style.top = '0';
    90. } else if (newY > maxY - 10) {
    91. draggable.style.top = `${maxY}px`;
    92. }
    93. // 更新最后显示位置
    94. lastVisiblePosition = { top: parseInt(draggable.style.top), left: parseInt(draggable.style.left) };
    95. // 自动隐藏计时器重置
    96. clearTimeout(autoHideTimeout);
    97. draggable.classList.remove('hidden');
    98. dragButton.style.display = 'none';
    99. }
    100. function mouseUp() {
    101. isDragging = false;
    102. // 设置自动隐藏
    103. autoHideTimeout = setTimeout(() => {
    104. draggable.classList.add('hidden');
    105. // 固定悬浮按钮位置
    106. dragButton.style.top = '20px';
    107. dragButton.style.right = '20px';
    108. dragButton.style.display = 'block';
    109. }, 5000); // 5秒后自动隐藏
    110. }
    111. dragButton.addEventListener('click', () => {
    112. draggable.classList.remove('hidden');
    113. dragButton.style.display = 'none';
    114. });

    技术和原理分析:

    • HTML 结构:使用

    元素创建拖拽的固定位置容器和悬浮按钮,配合 CSS 控制其样式。

    • CSS 样式:定义了拖拽元素和悬浮按钮的基本样式,包括位置、背景色等,利用 transition 属性实现元素显示隐藏的动画效果。

    • JavaScript 交互:

    • 拖拽实现:通过 touchstart, touchmove, touchend, mousedown, mousemove, mouseup 等事件监听器,实现移动设备和桌面设备上的拖拽功能。在拖动过程中,更新拖拽元素的位置,并根据距离屏幕边缘的距离自动贴边。

    • 自动隐藏和按钮显示逻辑:利用 setTimeout 实现拖拽元素在一定时间内无操作后自动隐藏,并显示固定位置的悬浮按钮。点击悬浮按钮则重新显示拖拽元素。可以根据需要选择显示固定位置或者根据最后显示位置动态调整的悬浮按钮。

    最后完整代码:

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    6. <title>Draggable Fixed Div with Auto Hide and Floating Buttontitle>
    7. <style>
    8. #draggable {
    9. width: 200px;
    10. height: 200px;
    11. background-color: #ccc;
    12. position: fixed;
    13. top: 50px;
    14. left: 50px;
    15. touch-action: none; /* 禁止浏览器默认行为,如滚动 */
    16. transition: transform 0.3s ease;
    17. }
    18. #draggable.hidden {
    19. transform: scale(0);
    20. visibility: hidden;
    21. }
    22. /* 默认固定悬浮按钮 */
    23. #dragButton {
    24. position: fixed;
    25. bottom: 20px;
    26. right: 20px;
    27. background-color: #007bff;
    28. color: white;
    29. padding: 10px 20px;
    30. cursor: pointer;
    31. }
    32. /* 根据最后显示位置调整的悬浮按钮 */
    33. /*
    34. #dragButton.dynamic {
    35. position: fixed;
    36. background-color: #007bff;
    37. color: white;
    38. padding: 10px 20px;
    39. cursor: pointer;
    40. display: none;
    41. }
    42. */
    43. style>
    44. head>
    45. <body>
    46. <div id="draggable">
    47. <p>Drag me!p>
    48. <button>Click mebutton>
    49. div>
    50. <div id="dragButton" class="fixed">Showdiv>
    51. <script>
    52. const draggable = document.getElementById('draggable');
    53. const dragButton = document.getElementById('dragButton');
    54. let offsetX, offsetY;
    55. let isDragging = false;
    56. let autoHideTimeout;
    57. let lastVisiblePosition = { top: 50, left: 50 }; // 初始位置
    58. // 触摸事件处理
    59. draggable.addEventListener('touchstart', touchStart);
    60. draggable.addEventListener('touchmove', touchMove);
    61. draggable.addEventListener('touchend', touchEnd);
    62. // 鼠标事件处理
    63. draggable.addEventListener('mousedown', mouseDown);
    64. document.addEventListener('mousemove', mouseMove);
    65. document.addEventListener('mouseup', mouseUp);
    66. draggable.classList.add('hidden');
    67. function touchStart(e) {
    68. const touch = e.touches[0];
    69. offsetX = touch.clientX - draggable.getBoundingClientRect().left;
    70. offsetY = touch.clientY - draggable.getBoundingClientRect().top;
    71. isDragging = true;
    72. }
    73. function touchMove(e) {
    74. if (!isDragging) return;
    75. e.preventDefault(); // 阻止默认的滚动行为
    76. const touch = e.touches[0];
    77. let newX = touch.clientX - offsetX;
    78. let newY = touch.clientY - offsetY;
    79. // 限制拖动范围在可视区域内
    80. const maxX = document.documentElement.clientWidth - draggable.offsetWidth;
    81. const maxY = document.documentElement.clientHeight - draggable.offsetHeight;
    82. newX = Math.max(0, Math.min(newX, maxX));
    83. newY = Math.max(0, Math.min(newY, maxY));
    84. draggable.style.left = `${newX}px`;
    85. draggable.style.top = `${newY}px`;
    86. // 判断靠近边缘并自动贴边
    87. if (newX < 10) {
    88. draggable.style.left = '0';
    89. } else if (newX > maxX - 10) {
    90. draggable.style.left = `${maxX}px`;
    91. }
    92. if (newY < 10) {
    93. draggable.style.top = '0';
    94. } else if (newY > maxY - 10) {
    95. draggable.style.top = `${maxY}px`;
    96. }
    97. // 更新最后显示位置
    98. lastVisiblePosition = { top: parseInt(draggable.style.top), left: parseInt(draggable.style.left) };
    99. // 自动隐藏计时器重置
    100. clearTimeout(autoHideTimeout);
    101. draggable.classList.remove('hidden');
    102. dragButton.style.display = 'none';
    103. }
    104. function touchEnd() {
    105. isDragging = false;
    106. // 设置自动隐藏
    107. autoHideTimeout = setTimeout(() => {
    108. draggable.classList.add('hidden');
    109. // 固定悬浮按钮位置
    110. dragButton.style.top = '20px';
    111. dragButton.style.right = '20px';
    112. dragButton.style.display = 'block';
    113. // 动态悬浮按钮位置
    114. /*
    115. dragButton.classList.add('dynamic');
    116. dragButton.style.top = `${lastVisiblePosition.top}px`;
    117. dragButton.style.left = `${lastVisiblePosition.left}px`;
    118. */
    119. }, 5000); // 5秒后自动隐藏
    120. }
    121. function mouseDown(e) {
    122. offsetX = e.clientX - draggable.getBoundingClientRect().left;
    123. offsetY = e.clientY - draggable.getBoundingClientRect().top;
    124. isDragging = true;
    125. }
    126. function mouseMove(e) {
    127. if (!isDragging) return;
    128. e.preventDefault(); // 阻止默认的拖动行为
    129. let newX = e.clientX - offsetX;
    130. let newY = e.clientY - offsetY;
    131. // 限制拖动范围在可视区域内
    132. const maxX = document.documentElement.clientWidth - draggable.offsetWidth;
    133. const maxY = document.documentElement.clientHeight - draggable.offsetHeight;
    134. newX = Math.max(0, Math.min(newX, maxX));
    135. newY = Math.max(0, Math.min(newY, maxY));
    136. draggable.style.left = `${newX}px`;
    137. draggable.style.top = `${newY}px`;
    138. // 判断靠近边缘并自动贴边
    139. if (newX < 10) {
    140. draggable.style.left = '0';
    141. } else if (newX > maxX - 10) {
    142. draggable.style.left = `${maxX}px`;
    143. }
    144. if (newY < 10) {
    145. draggable.style.top = '0';
    146. } else if (newY > maxY - 10) {
    147. draggable.style.top = `${maxY}px`;
    148. }
    149. // 更新最后显示位置
    150. lastVisiblePosition = { top: parseInt(draggable.style.top), left: parseInt(draggable.style.left) };
    151. // 自动隐藏计时器重置
    152. clearTimeout(autoHideTimeout);
    153. draggable.classList.remove('hidden');
    154. dragButton.style.display = 'none';
    155. }
    156. function mouseUp() {
    157. isDragging = false;
    158. // 设置自动隐藏
    159. autoHideTimeout = setTimeout(() => {
    160. draggable.classList.add('hidden');
    161. // 固定悬浮按钮位置 dragButton.style.right = '20px';
    162. dragButton.style.display = 'block';
    163. // 动态悬浮按钮位置
    164. /*
    165. dragButton.classList.add('dynamic');
    166. dragButton.style.top = `${lastVisiblePosition.top}px`;
    167. dragButton.style.left = `${lastVisiblePosition.left}px`;
    168. */
    169. }, 5000); // 5秒后自动隐藏
    170. }
    171. dragButton.addEventListener('click', () => {
    172. draggable.classList.remove('hidden');
    173. dragButton.style.display = 'none';
    174. // 动态悬浮按钮位置的显示控制
    175. // dragButton.classList.remove('dynamic');
    176. });
    177. script>
    178. body>
    179. html>

    这篇博客文章介绍了如何利用 HTML、CSS 和 JavaScript 实现一个具有拖拽、自动隐藏和悬浮按钮的交互效果,适用于创建可定制的用户界面体验。

  • 相关阅读:
    【小程序】滚动到指定位置,支付宝小程序滚动位置不准确
    [Gcexcel]GrapeCity Documents Excel for Java 5.2.2
    MAC苹果电脑关闭系统完整性保护SIP
    航空机票预订系统项目结构化分析
    【JavaScript】JavaScript 运算符 ① ( 运算符分类 | 算术运算符 | 浮点数 的 算术运算 精度问题 )
    基础---nginx 启动不了,跟 Apache2 服务冲突
    尤雨溪:Vite的现状与未来展望
    ElasticSearch第三讲:ES详解 - Elastic Stack生态和场景方案
    如何将String转Date类型
    期货开户应该了解的行内知识
  • 原文地址:https://blog.csdn.net/waiter456/article/details/140943198