原生js+css调节音量滑块

下面是具体的攻略流程:

1. 原生JS实现音量滑块

1.1 HTML模板

首先,我们需要创建需要的HTML模板结构,包括音量滑块的整体容器,以及音量条、拖动块、静音按钮等子元素。

<div class="volume-wrap">
  <div class="volume-bar"></div>
  <div class="volume-handle"></div>
  <button class="volume-mute"></button>
</div>

1.2 CSS样式

接下来,我们需要将这些子元素进行样式的设置,制作出一个完整的音量滑块。可以通过CSS伪元素来模拟拖动块的样式,并实现滑动过程中拖动块样式的改变。

.volume-wrap {
  position: relative;
  width: 100px;
  height: 10px;
  background-color: #ddd;
  border-radius: 5px;
  overflow: hidden;
}

.volume-bar {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: #666;
  transition: width 0.3s ease;
}

.volume-handle {
  position: absolute;
  top: 50%;
  left: 0;
  transform: translate(0, -50%);
  width: 0;
  height: 0;
  border-top: 5px solid transparent;
  border-left: 10px solid #666;
  border-bottom: 5px solid transparent;
}

.volume-handle::before {
  position: absolute;
  content: "";
  width: 20px;
  height: 20px;
  border-radius: 50%;
  background-color: #666;
  transform: translate(-50%, -50%);
  top: 50%;
  left: 0;
  transition: background-color 0.3s ease;
}

.volume-mute {
  position: absolute;
  top: 50%;
  right: 0;
  transform: translateY(-50%);
  width: 20px;
  height: 20px;
  background-color: #666;
  border: none;
  border-radius: 50%;
  outline: none;
  cursor: pointer;
}

.volume-mute::before {
  position: absolute;
  content: "";
  width: 8px;
  height: 8px;
  background-color: #fff;
  border-radius: 50%;
  transform: translate(-50%, -50%);
  top: 50%;
  left: 50%;
}

1.3 JS实现

最后,我们需要通过JS来实现音量滑块的交互逻辑。主要分为以下几个步骤:

  1. 获取音量滑块的各个子元素。
  2. 给拖动块添加mousedown和touchstart事件,并记录当前拖动块的位置。
  3. 给document添加mousemove和touchmove事件,并根据移动距离计算出拖动块的新位置,同时修改音量条的宽度和静音按钮的背景颜色。
  4. 给document添加mouseup和touchend事件,结束拖动操作。

下面是示例代码:

const volumeWrap = document.querySelector(".volume-wrap");
const volumeBar = volumeWrap.querySelector(".volume-bar");
const volumeHandle = volumeWrap.querySelector(".volume-handle");
const volumeMute = volumeWrap.querySelector(".volume-mute");

let dragging = false;  // 是否正在拖动
let startClientX;   // 开始拖动时的鼠标/触摸位置
let startHandleLeft;  // 开始拖动时的拖动块的位置

volumeHandle.addEventListener("mousedown", startDrag);
volumeHandle.addEventListener("touchstart", startDrag);

function startDrag(e) {
  dragging = true;
  startClientX = getClientX(e);
  startHandleLeft = parseFloat(volumeHandle.style.left) || 0;

  document.addEventListener("mousemove", onDrag);
  document.addEventListener("touchmove", onDrag);
  document.addEventListener("mouseup", stopDrag);
  document.addEventListener("touchend", stopDrag);
}

function onDrag(e) {
  if (!dragging) return;

  const clientX = getClientX(e);
  const diffX = clientX - startClientX;
  const handleLeft = startHandleLeft + diffX;
  const newWidth = handleLeft + volumeHandle.offsetWidth / 2;

  // 限制拖动范围不超过音量滑块
  if (handleLeft < 0) {
    handleLeft = 0;
  } else if (handleLeft > volumeWrap.offsetWidth - volumeHandle.offsetWidth) {
    handleLeft = volumeWrap.offsetWidth - volumeHandle.offsetWidth;
  }

  volumeHandle.style.left = handleLeft + "px";  // 移动拖动块

  // 根据拖动的位置修改音量条宽度
  volumeBar.style.width = newWidth + "px";

  // 修改静音按钮背景颜色
  if (newWidth === 0) {
    volumeMute.style.backgroundColor = "#f00";
  } else {
    volumeMute.style.backgroundColor = "#666";
  }
}

function stopDrag() {
  dragging = false;
  document.removeEventListener("mousemove", onDrag);
  document.removeEventListener("touchmove", onDrag);
  document.removeEventListener("mouseup", stopDrag);
  document.removeEventListener("touchend", stopDrag);
}

// 获取当前鼠标/触摸位置
function getClientX(e) {
  if (e.type === "touchstart" || e.type === "touchmove") {
    return e.touches[0].clientX;
  }
  return e.clientX;
}

2. 原生JS+CSS调节音量滑块示例

接下来,我们结合示例来展示如何调节音量滑块的样式和交互逻辑。

2.1 实现调节音量滑块的样式

首先,我们可以按照上面的步骤,通过HTML+CSS的方式实现一个基本的音量滑块:

<div class="volume-wrap">
  <div class="volume-bar"></div>
  <div class="volume-handle"></div>
  <button class="volume-mute"></button>
</div>
.volume-wrap {
  position: relative;
  width: 100px;
  height: 10px;
  background-color: #ddd;
  border-radius: 5px;
  overflow: hidden;
}

.volume-bar {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: #666;
  transition: width 0.3s ease;
}

.volume-handle {
  position: absolute;
  top: 50%;
  left: 0;
  transform: translate(0, -50%);
  width: 0;
  height: 0;
  border-top: 5px solid transparent;
  border-left: 10px solid #666;
  border-bottom: 5px solid transparent;
}

.volume-handle::before {
  position: absolute;
  content: "";
  width: 20px;
  height: 20px;
  border-radius: 50%;
  background-color: #666;
  transform: translate(-50%, -50%);
  top: 50%;
  left: 0;
  transition: background-color 0.3s ease;
}

.volume-mute {
  position: absolute;
  top: 50%;
  right: 0;
  transform: translateY(-50%);
  width: 20px;
  height: 20px;
  background-color: #666;
  border: none;
  border-radius: 50%;
  outline: none;
  cursor: pointer;
}

.volume-mute::before {
  position: absolute;
  content: "";
  width: 8px;
  height: 8px;
  background-color: #fff;
  border-radius: 50%;
  transform: translate(-50%, -50%);
  top: 50%;
  left: 50%;
}

这样,我们就可以得到一个简单的音量滑块,但是它无法响应鼠标或者触摸事件,无法实现交互操作。

2.2 实现调节音量滑块的交互逻辑

接下来,我们可以按照上面的步骤,使用JS来实现一个可以响应鼠标或者触摸事件,可以实现调节音量的交互音量滑块。可以按照以下方式来实现:

const volumeWrap = document.querySelector(".volume-wrap");
const volumeBar = volumeWrap.querySelector(".volume-bar");
const volumeHandle = volumeWrap.querySelector(".volume-handle");
const volumeMute = volumeWrap.querySelector(".volume-mute");

let dragging = false;  // 是否正在拖动
let startClientX;   // 开始拖动时的鼠标/触摸位置
let startHandleLeft;  // 开始拖动时的拖动块的位置

volumeHandle.addEventListener("mousedown", startDrag);
volumeHandle.addEventListener("touchstart", startDrag);

function startDrag(e) {
  dragging = true;
  startClientX = getClientX(e);
  startHandleLeft = parseFloat(volumeHandle.style.left) || 0;

  document.addEventListener("mousemove", onDrag);
  document.addEventListener("touchmove", onDrag);
  document.addEventListener("mouseup", stopDrag);
  document.addEventListener("touchend", stopDrag);
}

function onDrag(e) {
  if (!dragging) return;

  const clientX = getClientX(e);
  const diffX = clientX - startClientX;
  const handleLeft = startHandleLeft + diffX;
  const newWidth = handleLeft + volumeHandle.offsetWidth / 2;

  // 限制拖动范围不超过音量滑块
  if (handleLeft < 0) {
    handleLeft = 0;
  } else if (handleLeft > volumeWrap.offsetWidth - volumeHandle.offsetWidth) {
    handleLeft = volumeWrap.offsetWidth - volumeHandle.offsetWidth;
  }

  volumeHandle.style.left = handleLeft + "px";  // 移动拖动块

  // 根据拖动的位置修改音量条宽度
  volumeBar.style.width = newWidth + "px";

  // 修改静音按钮背景颜色
  if (newWidth === 0) {
    volumeMute.style.backgroundColor = "#f00";
  } else {
    volumeMute.style.backgroundColor = "#666";
  }
}

function stopDrag() {
  dragging = false;
  document.removeEventListener("mousemove", onDrag);
  document.removeEventListener("touchmove", onDrag);
  document.removeEventListener("mouseup", stopDrag);
  document.removeEventListener("touchend", stopDrag);
}

// 获取当前鼠标/触摸位置
function getClientX(e) {
  if (e.type === "touchstart" || e.type === "touchmove") {
    return e.touches[0].clientX;
  }
  return e.clientX;
}

这样,我们就实现了一个可以响应交互事件,能够实现调节音量的音量滑块。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:原生js+css调节音量滑块 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • 新手学习css优先级

    下面是“新手学习 CSS 优先级”的完整攻略。 前言 在学习 CSS 的时候,我们需要了解优先级的概念。优先级可以简单地理解为 CSS 样式被应用的权重。当多个 CSS 规则应用到同一个元素上时,浏览器需要确定哪个规则的样式最终生效。了解优先级对于我们编写 CSS 样式、调试样式等都非常重要。接下来我们将详细讲解优先级的相关知识。 了解选择器优先级 选择器优…

    css 2023年6月10日
    00
  • uniapp获取底部安全距离以及状态栏高度等

    Uniapp 是一种开源跨平台应用程序框架,可以使用 Vue.js 开发多个平台(如 H5、APP、小程序等)的应用。在开发 Uniapp 应用时,需要获取底部安全距离以及状态栏高度等信息,以适配不同终端的显示效果。 在 Uniapp 中,获取底部安全距离可以使用以下代码: // 获取底部安全距离 let safeArea = uni.getSystemIn…

    css 2023年6月9日
    00
  • CSS中position属性之fixed实现div居中

    下面是详细讲解“CSS中position属性之fixed实现div居中”的完整攻略: 一、认识position属性 在介绍fixed定位居中之前,我们需要先了解一下position属性。position属性用来设置元素的定位方式,有以下几种值: static:默认排版方式,元素遵循正常文档流,不具有定位能力。一般不需要声明这个值。 relative:相对于元…

    css 2023年6月9日
    00
  • webpack4简单入门实例

    针对“webpack4简单入门实例”的完整攻略,我会分为以下几个部分进行详细讲解: 1.什么是webpack2.环境准备3.webpack配置入门4.样式加载及ES6转码入门5.多页应用Webpack处理6.插件及打包输出调整7.示例说明8.总结 一、什么是webpack Webpack是一个模块打包器,通过分析模块之间的依赖关系,将所有模块打包成一个或多个…

    css 2023年6月9日
    00
  • 前端jquery部分很精彩

    前端jquery部分很精彩,是因为它为前端开发带来了很多优秀的库和插件,可以快速地实现很多功能,节省了很多时间和精力。同时,jQuery还具有很好的兼容性,能够兼容各种浏览器。在实际项目中,正是由于jQuery的使用,实现了很多复杂的功能。 下面以两个具体的示例来说明: 1. 图片懒加载 图片懒加载是一种优化策略,可以显著提高网站性能。使用jQuery实现图…

    css 2023年6月9日
    00
  • 使用webpack5从0到1搭建一个react项目的实现步骤

    下面是使用webpack5从0到1搭建一个react项目的实现步骤: 步骤1:安装依赖 首先需要安装webpack和webpack-cli的最新版本,使用下面的代码: npm install webpack webpack-cli –save-dev 然后需要安装react和react-dom,输入下面的代码: npm install react reac…

    css 2023年6月9日
    00
  • 浅谈CSS中的 object-fit 与 object-position的使用

    浅谈CSS中的 object-fit 与 object-position 的使用 什么是 object-fit 和 object-position? object-fit 属性用于控制如何调整一个元素所显示的图片或视频的尺寸比例。默认情况下,一个图片或视频会按照原始的尺寸比例在容器中缩放以适应容器的大小,但在某些情况下,我们需要按照特定的方式裁剪、缩放图片或…

    css 2023年6月10日
    00
  • 纯CSS实现了下划线的交互动画效果

    当我们需要一些简单的动画效果来增强页面交互性时,可以考虑使用CSS实现。在下面的攻略中,我将详细讲解如何使用纯CSS实现下划线的交互动画效果。具体过程如下: 1. 创建html结构 在HTML文件中,我们需要先准备好要添加下划线交互动画的文本内容,并为其添加一个类名作为标识。例如,下面是一个简单的示例代码: <p class="underli…

    css 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部