原生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日

相关文章

  • IE6/7下多种方法移除button、input 默认边框和去掉焦点线

    当我们使用 <button> 和 <input> 元素时,它们在 IE6/7 下默认会带有边框和焦点框,这会影响我们的网站设计和用户体验。下面是移除默认边框和焦点框的完整攻略。 1. 去掉边框 方法一 使用 CSS 的 border 属性将边框设置为 none,如下所示: button, input[type="button…

    css 2023年6月10日
    00
  • JQuery为元素添加样式的实现方法

    以下是详细讲解“JQuery为元素添加样式的实现方法”的完整攻略。 一、使用JQuery的css()方法 JQuery的css()方法可以为元素添加CSS样式,其语法如下: $(selector).css(property, value) 其中,selector表示要添加CSS样式的元素的选择器,property表示要添加的CSS属性,value表示对应CS…

    css 2023年6月10日
    00
  • css特效 一道闪光在图片上划过代码

    下面是该特效的完整攻略,并附带两条示例说明。 CSS特效:一道闪光在图片上划过 效果展示 HTML结构和CSS样式 首先,需要在HTML中创建一个具有背景图片的div元素,然后使用CSS样式来实现该特效。 HTML: <div class="container"></div> CSS: .container { b…

    css 2023年6月11日
    00
  • PHP-HTMLhtml重要知识点笔记(必看)

    PHP-HTML HTML 重要知识点笔记(必看) 在 Web 开发中,HTML 和 PHP 都是必不可少的技术,尤其是它们的结合,可以更好地实现动态网页和交互功能。本文主要介绍 PHP-HTML 中的一些重要知识点,对于初学者来说,尤其需要注意。 1. PHP-HTML 简介 PHP-HTML 是将 PHP 代码嵌入到 HTML 页面中,在服务器端执行 P…

    css 2023年6月9日
    00
  • 使用Html5、CSS实现文字阴影效果

    那么首先我们需要了解一下什么是文字阴影效果。文字阴影是给字体添加一个阴影,使其在页面中看起来更具有层次感,更加突出。使用 HTML5 和 CSS 实现文字阴影效果的方法有多种,下面我将为你提供其中两种使用示例。 方法一 在 HTML 中,使用 h1 标签创建一个标题。 <h1>这是一个标题</h1> 在 CSS 中,使用 text-s…

    css 2023年6月9日
    00
  • 通过CSS禁用页面内容选中和复制操作

    为了禁用页面内容选中和复制操作,我们可以采取以下两种方法: 1. 通过CSS的user-select属性来禁用选中操作 CSS的user-select属性可以控制用户是否可以选中页面中的文本,通过将其属性值设置为none可以禁用选中操作,代码如下: * { -webkit-user-select: none; /*webkit浏览器*/ -moz-user-…

    css 2023年6月10日
    00
  • js实现用滚动条来放大缩小图片的代码

    下面我来详细讲解一下“js实现用滚动条来放大缩小图片的代码”的实现过程。 1. 编写html结构 首先,我们需要准备一张图片和一个滚动条,并将它们放到一个包含样式的html结构中。 <style> #scrollbar { width: 100%; height: 10px; background-color: #ccc; } #slider {…

    css 2023年6月10日
    00
  • JS、CSS以及img对DOMContentLoaded事件的影响

    DOMContentLoaded是DOM树构建完成之后触发的事件,在页面所有DOM元素都被解析构建完成后才会触发。在此事件触发后,页面上的所有静态资源都已加载完成,可以执行一些需要依赖DOM元素的逻辑。 JS对DOMContentLoaded事件的影响 Javascript是一种可以操作DOM元素的脚本语言,很多页面操作的逻辑都是在DOM树构建完成后通过JS…

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