<template>
<div class="slider"
@mouseup="mouseup($event)"
@mousemove="mousemove($event)"
@mousedown="mousedown($event)"
:style="{width: width + 'px', height: height + 'px'}"
>
<ul
draggable="false"
:style="{left: left + 'px', width: (data.length * width) + 'px'}"
>
<li
v-for="(item, index) in data"
:key="index"
:style="{width: width + 'px', height: height + 'px'}"
>
{{item.name}}
</li>
</ul>
<div class="slider-status">
<span v-for="(item, index) in data" :key="index" @click="statusClick(index)" :class="statusIndex == index ? 'active' : ''">{{index + 1}}</span>
</div>
</div>
</template>
<script>
export default {
data () {
return {
statusIndex: 0,
isMouseUp: false,
num: 0, // 偏移的数量
width: 600, // 容器的宽度
height: 300, // 容器的高度
left: 0, // 相对容器的偏移
startX: 0, // 鼠标按下的位置
originX: 0,
endX: 0, // 鼠标松开的位置
data: [ // 容器数据
{
id: 1,
name: 'content1'
},
{
id: 2,
name: 'content2'
},
{
id: 3,
name: 'content3'
},
{
id: 4,
name: 'content4'
}
]
};
},
computed: {
moveLeft: function () {
return this.num * this.width;
}
},
methods: {
// 鼠标点击圆点
statusClick (index) {
this.left = -index * this.width;
this.statusIndex = index;
},
// 鼠标弹开的时候触发
mouseup (event) {
this.isMouseUp = false;
this.endX = event.clientX;
let cpLeft = Math.abs(this.left);
console.log((cpLeft % 300));
console.log(Math.floor(cpLeft / 300));
// 当滑动到第一个的时候
if (Math.floor(cpLeft / this.width) == 0) {
// 鼠标向左滑动
if ((this.endX - this.startX) > 0) {
this.left = 0;
this.statusIndex = 0;
} else {
if (Math.floor(cpLeft / this.width) < (this.data.length - 1)) {
if ((cpLeft % this.width) > (this.width / 2)) {
let num = (Math.floor(cpLeft / this.width) + 1);
this.left = -(this.width * num);
this.statusIndex = num;
} else {
this.left = -(this.width * Math.floor(cpLeft / this.width));
this.statusIndex = Math.floor(cpLeft / this.width);
}
} else {
this.left = -(this.width * Math.floor(cpLeft / this.width));
this.statusIndex = Math.floor(cpLeft / this.width);
}
}
} else {
if (Math.floor(cpLeft / this.width) < (this.data.length - 1)) {
// 滑动距离大于banner的一半
if ((cpLeft % this.width) > (this.width / 2)) {
let num = (Math.floor(cpLeft / this.width) + 1); // 滑动到下一张
console.log(num + '===');
this.left = -(this.width * num);
this.statusIndex = num;
} else {
this.left = -(this.width * Math.floor(cpLeft / this.width)); // 返回到上一张
this.statusIndex = Math.floor(cpLeft / this.width);
}
} else {
this.left = -(this.width * Math.floor(cpLeft / this.width));
this.statusIndex = Math.floor(cpLeft / this.width);
}
}
},
// 鼠标按下后移动的触发
mousemove (event) {
if (this.isMouseUp) {
let moveX = event.clientX;
if (this.startX > moveX) {
this.left = this.originX - (this.startX - moveX);
} else {
this.left = this.originX + (moveX - this.startX);
}
}
},
// 鼠标按下后触发
mousedown (event) {
this.isMouseUp = true;
this.startX = event.clientX;
this.originX = this.left;
}
}
};
</script>
<style lang="less">
.slider{
position: relative;
height: 200px;
width: 300px;
margin:0 auto;
overflow: hidden;
user-select: none;
.slider-status {
width:100%;
position:absolute;
bottom:0;
height:30px;
text-align:center;
span {
display:inline-block;
height: 20px;
width:20px;
margin:0 5px;
line-height:20px;
text-align:center;
background:#ccc;
border-radius: 10px;
&.active{
background: yellow;
}
}
}
ul {
position: absolute;
width: 1200px;
transition: all .2s;
li {
float: left;
height: 200px;
width: 300px;
font-size: 40px;
color:#fff;
line-height: 200px;
text-align: center;
}
li:nth-child(1) {
background:red;
}
li:nth-child(2) {
background:pink;
}
li:nth-child(3) {
background:green;
}
li:nth-child(4) {
background:blue;
}
}
}
</style>
相关推荐
封装vue3-slider-check组件 滑块验证组件 移动端手势控制
封装vue3-slider-check组件 滑块验证组件 移动端手势控制
Vue3滑动输入条(Slider)
数字滑动输入条组件,支持:单滑块;双滑块;禁用;自定义数值范围;自定义步长;自定义刻度标记;垂直模式;格式化 tooltip;隐藏 tooltip;始终显示 tooltip;自定义样式;鼠标拖动滑块输入;鼠标点击输入;键盘上/下/左/右按键输入;总之,功能丰富,简单易用😁😁
保姆级教程:手把手教你用Vue 3 + TypeScript封装一个媲美Element UI的Slider滑块组件
本文提供了一份详尽的Vue 3 + TypeScript教程,指导开发者如何从零开始封装一个功能强大、类型安全的Slider滑块组件。内容涵盖工程化架构设计、Composition API逻辑封装、样式系统实现以及单元测试策略,帮助开发者构建媲美Element UI的企业级UI控件。
vue3组件篇 Slider
slider组件已成为前端开发中广泛使用的UI组件之一。Slider组件可以让用户在一个可选范围内选择一个值,如音量、进度条等。Slider组件的设计和功能可以有很多种变化,但通常包含一个滑块和一个轨道。用户可以通过拖动滑块来选择一个值,滑块的位置在轨道上表示该值。在前端开发中,Slider组件可以使用HTML、CSS和JavaScript实现。
基于better-scroll封装slider组件
前言 轮播图可以说是在开发中必不可少的组件。接下来这篇文章就基于better-scroll封装一个简单的slider。 better-scroll简介 better-scroll可以说是在Vue开发移动端中最好用的滚动视图的组件,基本上可以解决移动端各种滚动场景需求,核心是借鉴了iscroll的实现,而且API设计基本兼容iscroll.如果您想详细的了解,可以点击查看better-scro
13、vue2.0利用better-scroll实现轮播图可以自动轮播可以无限循环轮播
1.安装better-scroll 在根目录中package.json的dependencies中添加: "better-scroll": "^0.2.4", 然后npm install 安装 2.封装代码slider template> div class="slide_box"> div class="slide" ref="sli
移动端vue slider滑块组件、单滑块和双滑块,及其二次封装
1.介绍与演示 滑块组件,支持滑动,点击 演示: 2.安装 npm install z-slider-vue -S 3.引入 import Slider from 'z-slider-vue' import '../node_modules/z-slider-vue/dist/z-slider-vue.css' Vue.use(Slider) 4.使用 <double-slider :leftx="0" //左边滑块起始位置 :rightx="1" //右边滑
Vue3之 vue-cli2
1、如何搭建一个简易版(毛坯房)的后台管理? App.vue <template> <div> <router-view></router-view> </div> </template> Layout.vue <template> <pug-header></pug-header> <article class="pug-ui-article"> &l
使用vue3+ts封装一个Slider滑块组件
语法,它允许我们在单文件组件中使用 Composition API,而不需要额外的。方法来处理滑块的输入事件,并在值改变时更新。,它会在滑块的值改变时被触发,并传递新的值。可以将这个组件导入到其他 Vue 组件中。在这个组件中,使用了 Vue 3 的。来定义组件的 props,使用。来定义组件可以触发的事件。元素来创建滑块,并使用。在模板中,使用了一个。
Vue2时间轴组件(TimeLine/分页、自动顺序播放、暂停、换肤功能、时间选择,鼠标快速滑动)
项目背景是 一天的时间轴 10分钟为一间隔 一天被划分成144个节点 一页面12个节点light天亮模式dark黑夜模式。
vueslider一个轻量的vue滑动组件
vue-slider,一个简单的滑动组件,配置简单,支持自适应/全屏 按钮 分页,同时兼容移动端和PC端
基于el_slider封装时间进度条组件
【代码】基于el_slider封装时间进度条组件。
slide-ruler二次封装后的组件
slide-ruler二次封装后的组件
终极Bootstrap-Slider多框架集成指南:React、Angular、Vue.js完整示例
Bootstrap-Slider是一款功能强大的滑块控件,专为Bootstrap 3和4设计,能够帮助开发者轻松实现直观的数值选择交互。本文将详细介绍如何在React、Angular和Vue.js三大主流前端框架中集成和使用Bootstrap-Slider,让你快速掌握跨框架滑块控件的实现方法。 ## 📦 准备工作:安装Bootstrap-Slider 在开始框架集成之前,首先需要安装Boo
vue组件开发之slider组件使用详解
主要为大家详细介绍了vue组件开发之slider组件的使用方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
python实现语音信号的分帧、加窗、预处理
语音信号实现分帧、加窗、预处理音频文件读取预加重分帧加窗 音频文件读取 librosa是非常强大的python语音信号处理库。 读取音频: 使用语句librosa.load(path, sr=22050, mono=True, offset=0.0, duration=None)读取音频文件,默认的采样率是22050,若要保留音频的原始采样率,使用sr=None。 其中: path:表示音频文件的路径 sr:表示采样率 mono:bool,是布尔类型,表示是否将信号转换为单声道 offset:float,后
Vue3时间轴组件(时间信息收集组件)
摘要:时间信息收集组件的封装,包括技术栈使用、组件效果、代码展示和封装中所遇问题的分享。
【系统移植】 移植主线U-Boot(v2024.01-rc3)到RK3399
[系统移植] 移植主线U-Boot(v2024.01-rc3)到RK3399
Vue 封装一个带渐变音柱条的音频控制组件
效果图 实现 左侧渐变条通过 CSS 实现,利用 background 属性进行背景定位结合 linear-gradient 线性渐变函数实现 右侧滑块引入 ElementUI 的 el-slider 组件,自定义样式,其中 marks 展开标记通过定位修改其默认位置达到刻度值的效果 封装成组件 VolumeBar.vue 这时候产品经理又说了,每个音频组件需要动态地控制显示和隐藏,如何在动刀最小的前提下满足它呢,总不至于通过 js 给一个个组件单独绑定事件去控制吧。这里用到了伪元素结合 :hover 伪
YOLOv11 改进 - 特征融合 | RepGFPN重参数化特征金字塔网络 ,实现高效多尺度特征交互与融合
本文介绍了DAMO - YOLO目标检测方法及其相关技术在YOLOv11中的结合。DAMO - YOLO扩展了多项新技术,如MAE - NAS搜索检测主干网络、Efficient - RepGFPN构建检测neck等。在neck设计上,针对原始GFPN存在的问题,提出Efficient - RepGFPN,包括对不同尺度特征使用不同通道数、删除Queen - Fusion中额外上采样操作、改进特征融合方式等。我们将相关模块集成进YOLOv11,替换部分模块。
华为OD机试真题 新系统【小学英语老师批改作文】
华为OD机试 新系统真题【小学英语老师批改作文】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【小学英语老师批改作文】
从零实现Vue的组件库(二)- Slider 实现
实现一个Slider组件,方便用户通过拖动滑块在一个固定区间内进行选择,增强交互细节。 概述: 在用户手动一些限定数字时,如果采用输入框的形式,会需要提示信息和错误信息来引导用户,这就存在一些冗余操作。所以衍生出Slider组件,方便用户拖动来选定一个值。 该组件的痛点在于: 兼容不同游览器的样式; Slider组件的value、min、max之间的关系,以及对样式的影响。 1. 实...
在Keil uv5里面添加STC元器件库,不影响其他元件
先到网上下载stc.CBD(宏晶网站的地址实效了)还有STC新系列单片机的头文件,宏晶的网站就有1、在Keil/C51/INC下新建目录"STC"文件夹, 把所有STC新系列单片机的头文件拷贝到"STC"目录下。2、下载的用于keil下的STC器件数据库更名为STC.CDB并拷贝到Keil/UV4目录下。3、打开Keil文件夹下的TOOLS.ini文件。4、在[UV2]下键入CDB0="UV2\S
1394



被折叠的 条评论
为什么被折叠?



