原生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 中的 text-overflow 属性。 1.基本用法 text-overflow 属性中的 ellipsis 值可以实现省略号效果,但是必须要同时设置 white-space 和 overflow 属性,才能让省略号生效。其中,white-space 的值必须是 nowrap 或 pre-wrap,…

    css 2023年6月10日
    00
  • 5分钟教你学会 CSS Grid 布局

    下面是详细的“5分钟教你学会 CSS Grid 布局”的攻略。 什么是 CSS Grid 布局? CSS Grid 布局是一种二维网格布局系统,可以用于快速创建复杂的布局,同时具有灵活性和可响应性。 如何使用 CSS Grid 布局? 1. 创建网格容器 要使用 CSS Grid 布局,首先需要为网格容器设置 display 属性为 grid。 .conta…

    css 2023年6月10日
    00
  • css3实现六边形边框的实例代码

    下面是css3实现六边形边框的攻略,分成以下几个部分: 1.初步准备 首先,我们需要定义一个六边形的容器(div): <div class="hexagon"></div> 然后,给这个容器定义一些基本样式: .hexagon { width: 120px; height: 100px; background-co…

    css 2023年6月10日
    00
  • 前端必会的Webpack优化技巧

    前端工程化是现代 web 开发不可或缺的一部分。而其中用来打包资源的Webpack更是一个必会的技能。然而在使用Webpack的过程中,为了达到最佳性能,我们还需要通过一些优化技巧来优化Webpack的打包过程。本文将介绍前端必会的Webpack优化技巧全攻略。 一、基础优化 1.1 设置webpack.config.js webpack.config.js…

    css 2023年6月10日
    00
  • css实现的漂亮的分页效果代码(橘黄色与蓝色)

    下面是CSS实现漂亮的分页效果的代码攻略。 准备工作 在开始之前,需要准备以下素材: 分页的HTML结构代码如下: <div class="paging"> <ul class="page-list"> <li class="page-item"><a hr…

    css 2023年6月9日
    00
  • vue-quill-editor富文本编辑器超详细入门使用步骤

    vue-quill-editor富文本编辑器超详细入门使用步骤 介绍 vue-quill-editor是一个基于Vue框架的富文本编辑器,相比其他富文本编辑器,它有更好的用户体验和更完善的文档说明,使用起来也更加方便。 安装 在使用vue-quill-editor之前,需要先安装它。 使用npm进行安装: npm i vue-quill-editor 如果需…

    css 2023年6月9日
    00
  • JavaScript实现通过滑块改变网页颜色

    如果想要通过滑块改变网页颜色,可以使用JavaScript实现。这个功能的实现步骤大概分为以下几个部分: 在HTML中添加滑块控件,并设置ID,用于JavaScript调用。 <input type="range" min="0" max="255" step="1" id…

    css 2023年6月9日
    00
  • Web字体格式介绍以及浏览器兼容性一览

    Web字体是浏览器用于渲染文本的特殊字体。它们使用特殊的Web字体格式,以确保在任何操作系统上都可以正确加载和显示字体。在本篇攻略中,我们将学习Web字体格式及其在不同浏览器中的兼容性情况。 Web字体格式介绍 Web字体格式有三种:TrueType (TTF),OpenType (OTF) 和 Web Open Font Format (WOFF)。以下是…

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