基于vue实现滑块动画效果

news2024/11/18 14:47:28

主要实现:通过鼠标移移动、触摸元素、鼠标释放、离开元素事件来进行触发
创建了一个滑动盒子,其中包含一个滑块图片。通过鼠标按下或触摸开始事件,开始跟踪滑块的位置和鼠标/触摸位置之间的偏移量。然后,通过计算偏移量和起始时的位移值,设置滑动盒子的 transform 属性来实现滑动效果。使用 transition 属性,还可以为滑块添加滑动动画。
效果:
在这里插入图片描述

<template>
  <div id="app">
    <div class="slider-container img">
      <div class="slider-track">
        <img class="slider-handle" src="./assets/dot.svg" alt="滑块">
      </div>
    </div>
  </div>
</template>

<script>

export default {
  name: 'App',
  components: {
  },
  data(){
    return {
      sliderContainer:'',
      sliderTrack:'',
      sliderHandle:'',
      isDragging:false,
      startPosY:0,
      startTranslateY:0,
      minTranslateY:0,
      maxTranslateY:0,
    }
  },
  created() {

  },
  mounted() {
    this.sliderContainer = document.querySelector('.slider-container');
    this.sliderTrack = document.querySelector('.slider-track');
    this.sliderHandle = document.querySelector('.slider-handle');

    this.isDragging = false;
    this.startPosY = 0;
    this.startTranslateY = 0;
    this.minTranslateY = 0; // 顶部限制为30px,css样式修改后默认为0
    this.maxTranslateY = this.sliderContainer.clientHeight - this.sliderHandle.offsetHeight - 20; // 底部限制为20px

    this.sliderHandle.addEventListener('mousedown', this.startDrag);
    this.sliderHandle.addEventListener('touchstart', this.startDrag);
  },
  methods: {
    startDrag(event) {
      event.preventDefault();

      if (event.type === 'mousedown') {
        this.startPosY = event.clientY;
      } else if (event.type === 'touchstart') {
        this.startPosY = event.touches[0].clientY;
      }

      this.startTranslateY = this.getTranslateY();
      this.isDragging = true;

      document.addEventListener('mousemove', this.drag);
      document.addEventListener('touchmove', this.drag);
      document.addEventListener('mouseup', this.stopDrag);
      document.addEventListener('touchend', this.stopDrag);
    },
    drag(event) {
      if (!this.isDragging) return;

      var currentPosY = 0;

      if (event.type === 'mousemove') {
        currentPosY = event.clientY;
      } else if (event.type === 'touchmove') {
        currentPosY = event.touches[0].clientY;
      }

      var offsetY = currentPosY - this.startPosY;
      var translateY = this.startTranslateY + offsetY;

      // 边缘限制
      if (translateY < this.minTranslateY) {
        translateY = this.minTranslateY;
      } else if (translateY > this.maxTranslateY) {
        translateY = this.maxTranslateY;
      }

      this.setTranslateY(translateY);
    },
    stopDrag() {
      this.isDragging = false;

      document.removeEventListener('mousemove', this.drag);
      document.removeEventListener('touchmove', this.drag);
      document.removeEventListener('mouseup', this.stopDrag);
      document.removeEventListener('touchend', this.stopDrag);
    },

    getTranslateY() {
      var style = window.getComputedStyle(this.sliderTrack);
      var transform = style.transform || style.webkitTransform;
      var matrix = transform.match(/^matrix\((.+)\)$/);

      if (matrix) {
        return parseFloat(matrix[1].split(', ')[5]); // 获取Y轴位移值
      } else {
        return 0;
      }
    },
    setTranslateY(translateY) {
      let y = translateY
      if (y > 30 && y < 60) {
        console.log("午间");
        y = 60
      } else if (y > 60 && y < 90 ) {
        console.log("午间");
        y = 60
      } else if (y > 90 && y <= 130) {
        console.log("晚间");
        y = 120
      } else if (y < 30) {
        console.log("早间");
        y = 0
      }
      this.sliderTrack.style.transform = 'translate3d(0, ' + y + 'px, 0)'; // 设置Y轴位移值
    }

  }
}
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  color: #2c3e50;
}

.img {
  width: 100px;
  height: 200px;
  background-color: antiquewhite;
  background: url("./assets/TimeOfDay.svg") no-repeat;
  background-size: contain;
  position: relative;
  transition: all 0.5s;
}

.hk_img {
  position: absolute;
  top: 30px;
}

.slider-container {
  width: 100px;
  height: 200px;
  overflow: hidden;
  position: relative;
  background-color: #f0f0f0;
}

.slider-track {
  width: 100%;
  height: 100%;
  position: absolute;
  top: 0;
  left: 0;
  transition: transform 0.3s ease-out;
  touch-action: none;
  /* 禁用默认的滑动行为 */
}

.slider-handle {
  width: 50px;
  height: 50px;
  position: absolute;
  top: 15px;
  /* 距离顶部30px */
  left: 50%;
  transform: translateX(-50%);
}

.slider-handle:hover {
  cursor: pointer;
}</style>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年10月工作经验及问题整理总结

目录 1.window自带的base64加密解密 2.ElementUI修改鼠标移动到表格的背景色 3.vscode保存时几万个eslint错误 4.Git 拉取Gitee仓库报错&#xff1a;“fatal: unable to access ": Failed to connect to 127.0.0.1 port 1080: Connection r... 4.1本地查看Git是否使用…

Python爬虫-雪球网

前言 本文是该专栏的第8篇,后面会持续分享python爬虫案例干货,记得关注。 地址:aHR0cHM6Ly94dWVxaXUuY29tLw== 需求:根据目标搜索词,获取搜索结果数据 废话不多说,跟着笔者直接往下看详细内容。(附带完整代码) 正文 1. 请求方式和参数分析 使用浏览器打开链接之后,…

【深度学习实验】循环神经网络(四):基于 LSTM 的语言模型训练

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. RNN与梯度裁剪 2. LSTM模型 3. 训练函数 a. train_epoch b. train 4. 文本预测 5. GPU判断函数 6. 训练与测试 7. 代码整合 经验是智慧之父&#xff0c;记忆…

详解 ElasticSearch 集群搭建

&#x1f339; 以上分享 ElasticSearch 安装部署&#xff0c;如有问题请指教写。&#x1f339;&#x1f339; 如你对技术也感兴趣&#xff0c;欢迎交流。&#x1f339;&#x1f339;&#x1f339; 如有需要&#xff0c;请&#x1f44d;点赞&#x1f496;收藏&#x1f431;‍&a…

【微信小程序】6天精准入门(第2天:小程序的视图层、逻辑层、事件系统及页面生命周期)

一、视图层 View 1、什么是视图层 框架的视图层由 WXML 与 WXSS 编写&#xff0c;由组件来进行展示。将逻辑层的数据反映成视图&#xff0c;同时将视图层的事件发送给逻辑层。WXML(WeiXin Markup language) 用于描述页面的结构。WXS(WeiXin Script) 是小程序的一套脚本语言&am…

【每日一题】倍数求和

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;一次遍历 其他语言cpython3 写在最后 Tag 【一次遍历】【数组】【2023-10-17】 题目来源 2652. 倍数求和 题目解读 找出 [1. n] 范围内可以被 3、5、7 整除的所有整数之和。 解题思路 方法一&#xff1a;一次遍历 …

字符串排序程序

字符串排序程序&#xff0c;对一个字符串中的数值进行从小到大的排序 例如排序前给定的字符串为" 20 78 9 -7 88 36 29" 排序后&#xff1a; -7 9 20 29 36 78 88 要求使用包装类对数值类型的字符串转换成整型进行排序。 public class StringSort {public static vo…

【MySQL】MySQL的安装

MySQL安装路径&#xff1a;MySQL 安装MySQL 1、都是选择红框 2、选择社区版 3、 4、 5、确保安装路径中没有中文字符&#xff0c;否则可能会出现问题 &#xff1b; 以上操作之后就会生成这个&#xff0c;再双击它&#xff1b; 6、点击next&#xff0c;也许每个人进入的界面不…

ICMP协议(二)

一 ping工作原理 ① 为什么ping不通 "ping不通分为两类" 1) 请求没有到目标服务器2) 请求到了目标服务器,但是没有回包 "常见原因" 1、对方关机/ip不存在备注&#xff1a; ping同网段不存在的ip地址2、网段不同,通过路由也无法找到3、防火墙 [安全组…

Springboot结合Mockito写单元测试实践和原理

文章目录 前言一、使用最佳实践使用场景SpyBean失效场景解决Mock失效的问题避免FactoryBean的实现方式使用MockBean&#xff0c;但是要指定name 个人推荐 二、原理1. MockBean2.SpyBean方法调用 总结 前言 相信看我博客的都是javaer&#xff0c;工作中一般都是使用Springboot框…

分类算法-逻辑回归与二分类

1、逻辑回归的应用场景 广告点击率是否为垃圾邮件是否患病金融诈骗虚假账号 看到上面的例子&#xff0c;我们可以发现其中的特点&#xff0c;那就是都属于两个类别之间的判断。逻辑回归就是解决二分类问题的利器。 2、 逻辑回归的原理 2.1 输入 逻辑回归的输入就是一个线性…

Flutter 知识集锦 | 监听与通知 ChangeNotifier

theme: cyanosis 1. 数据的提供者与消费者 今天想要和大家好好聊聊 ChangeNotifier 这个东西&#xff0c;从名字上来看它由 change(改变) 和 Notifier(通知器) 构成。打个比方&#xff1a; 有三个铁粉跟我说: "你发新文章的时候跟我说一声"。 之后我发布文章后&…

基于nodejs+vue网课学习平台

各功能简要描述如下: 1个人信息管理:包括对学生用户、老师和管理员的信息进行录入、修改&#xff0c;以及老师信息的审核等 2在库课程查询:用于学生用户查询相关课程的功能 3在库老师查询:用于学生用户查询相关老师教学的所有课程的功能。 4在库学校查询:用于学生用户查询相关学…

怎么把flac音频变为mp3?

怎么把flac音频变为mp3&#xff1f;FLAC音频格式在许多平台和应用程序中都得到支持和应用。FLAC音频格式被广泛支持和应用。许多平台、设备和应用程序都支持FLAC格式&#xff0c;如Windows、macOS和Linux操作系统、各种音乐播放器软件、智能手机和平板电脑、在线音乐平台和流媒…

Kaggle - LLM Science Exam(三):Wikipedia RAG

文章目录 一、赛事概述1.1 OpenBookQA Dataset1.2 比赛背景1.3 评估方法和代码要求1.4 比赛数据集1.5 优秀notebook 二、 [EDA, Data gathering] LLM-SE ~ Wiki STEM | 1k DS2.1 Data overview2.2 Data gathering 三、如何高效收集数据3.1 概述3.2 与训练数据关联的维基百科类别…

Q-learning如何与ABC等一些元启发式算法能够结合在一起?

1、出现的问题 Q-learning能和元启发式算法&#xff08;如ABC、PSO、GA、SSA等&#xff09;结合在一起&#xff0c;实现工作流调度问题&#xff1f; Q-learning和ABC (Artificial Bee Colony) 等元启发式算法可以结合在一起以解决特定类型的问题。Q-learning是一种强化学习算法…

http代理有什么好处,怎么通过http代理服务安全上网呢?

通过http代理上网是一种常见的网络代理方式。http代理是指通过代理服务器进行网络连接&#xff0c;以实现隐藏自己的真实IP地址、保护个人隐私等目的。下面我们将介绍通过http代理上网的好处以及如何使用http代理服务来安全上网。 一、通过http代理上网的好处 1. 保护个人隐私 …

LabVIEW建立生产者消费者

LabVIEW建立生产者消费者 生产者/消费者设计模式由并行循环组成&#xff0c;这些循环分为两类&#xff1a;生产者循环和消费者循环。生产者循环和消费者循环间的通信可以使用队列或通道连线来实现。 队列 LabVIEW内置的队列操作VI可在函数选板>>数据通信>>队列操…

Stable Diffusion绘画

正向提示词&#xff1a; 1girl, brown hair, multicolored hair, green eyes, maid, maid headdress, maid apron, cherry blossoms, sunbeam, wallpaper, 一个女孩&#xff0c;棕色头发&#xff0c;五彩头发&#xff0c;绿色眼睛&#xff0c;女仆&#xff0c;女仆头饰&#xf…

一个字符串模式匹配开源库

1 简介 theFuzz 是一个用于模糊字符串匹配和相似度计算的强大工具。它可以帮助我们在处理文本数据时进行模糊匹配和字符串比较&#xff0c;例如拼写纠正、字符串相似度计算和模糊搜索等。 2 基本原理 theFuzz 库的基本原理是使用不同的算法来计算字符串之间的相似度。其中最常用…