微信小程序 实现滑块是矩形的slider组件

news2024/9/29 7:17:36

我发现大多数前端UI库都是圆形的滑块,而且圆形的滑块都没有紧贴进度条,都是超出了首尾端,所以亲自写一个矩形的滑块,我使用了微信小程序的wxs的事件通信写法,官方说这样写好,也不知道好哪里了。样式如下图:

js

// components/slider/index.js
Component({
	// 启用插槽
	options: {
		multipleSlots: true
	},
	/**
	 * 组件的属性列表
	 */
	properties: {

		disabled: {
			type: Boolean,
			value: false,
		},
		max: {
			type: Number,
			value: 100,
		},
		min: {
			type: Number,
			value: 0,
		},
		step: {
			type: Number,
			value: 1,
		},
		value: {
			type: null,
			value: 0,
			observer(val, oldVal) {
				if (val !== this.value) {
					this.setData({
						['propValue.value']: val
					})
				}
			},
		}
	},

	/**
	 * 组件的初始数据
	 */
	data: {
		propValue: {
			disabled: null,
			max: null,
			min: null,
			step: null,
			value: null
		}
	},
	lifetimes: {
		attached() {
			this.data.propValue.disabled = this.data.disabled;
			this.data.propValue.max = this.data.max;
			this.data.propValue.min = this.data.min;
			this.data.propValue.step = this.data.step;
			this.data.propValue.value = this.data.value;
			this.setData({
				propValue: this.data.propValue
			})
		}
	},

	/**
	 * 组件的方法列表
	 */
	methods: {
		setVal(val) {
			// this.setData({
			// 	value: val
			// })
		}
	}
})

wxml

<!--自定义滑块组件-->
<wxs module="computed" src="./index.wxs"></wxs>


<view class="n-slider" change:prop="{{computed.propObserver}}" prop="{{propValue}}" bind:tap="{{computed.onClick}}" bind:touchstart="{{computed.onTouchStart}}" catch:touchmove="{{computed.onTouchMove}}" bind:touchend="{{computed.onTouchEnd}}" bind:touchcancel="{{computed.onTouchEnd}}">

	<view class="n-slider-rail">


		<view class="n-slider-rail__fill"></view>

		<view class="n-slider-handles">
			<view class="n-slider-handle-wrapper">

				<view class="n-slider-handle">
					<slot></slot>
				</view>


			</view>
		</view>
	</view>
</view>

wxs 

var DRAG_STATUS = {
	START: 'start',
	MOVING: 'moving',
	END: 'end',
};

var dragStatus = DRAG_STATUS.START;


var propValue = {
	disabled: false,
	max: 100,
	min: 0,
	step: 1,
	value: 0
}

var newValue;


function onTouchStart(event, ins) {


	var disabled = propValue.disabled;
	if (disabled) {
		return;
	}

	newValue = propValue.value;
	dragStatus = DRAG_STATUS.START;
}


function onTouchMove(event, ins) {

	var disabled = propValue.disabled;
	if (disabled) {
		return;
	}

	if (dragStatus === DRAG_STATUS.START) {
		ins.triggerEvent('drag-start');
	}

	dragStatus = DRAG_STATUS.MOVING;

	var touch = event.touches[0];
	var rect = ins.selectComponent('.n-slider-handles').getBoundingClientRect();
	var percentage = (touch.clientX - rect.left) / rect.width;

	newValue = percentageToValue(percentage);
	updateValue(ins, newValue, false, true);
}


function onTouchEnd(event, ins) {
	var disabled = propValue.disabled;
	if (disabled) {
		return;
	}
	if (dragStatus === DRAG_STATUS.MOVING) {
		dragStatus = DRAG_STATUS.END;
		updateValue(ins, newValue, true);
		ins.triggerEvent('drag-end');
	}


}

function onClick(event, ins) {
	var touch = event.touches[0];
	var rect = ins.selectComponent('.n-slider-handles').getBoundingClientRect();
	var percentage = (touch.clientX - rect.left) / rect.width;
	updateValue(ins, percentageToValue(percentage), true);

}

/**
 * 限制拖动值不能超出最小和最大范围
 * @param value 
 */
function format(value) {

	return Math.round(Math.max(propValue.min, Math.min(value, propValue.max)) / propValue.step) * propValue.step;
}


/**
 * 
 * @param ins 
 * @param val 不能和value重复
 * @param end 
 * @param drag 
 */
function updateValue(ins, val, end, drag) {
	value = format(val);
	console.log(val);
	ins.selectComponent('.n-slider-handle-wrapper').setStyle({
		"left": getOffsetWidth(value),
	});

	ins.selectComponent('.n-slider-rail__fill').setStyle({
		"width": getOffsetWidth(value),
	});

	if (drag) {
		ins.triggerEvent('drag', {
			value: value
		});
	}
	if (end) {

		ins.triggerEvent('change', value);
	}
	if (drag || end) {
		// ins.callMethod('setVal', value);

	}
}


function getScope() {
	return Number(propValue.max) - Number(propValue.min);
}


function getOffsetWidth(current) {
	var scope = getScope();
	// 避免最小值小于最小step时出现负数情况
	return "".concat(Math.max(((current - Number(propValue.min)) * 100) / scope, 0), "%");
}


function percentageToValue(percentage) {
	return propValue.min + (propValue.max - propValue.min) * percentage
}

function propObserver(newValue, oldValue, ownerInstance, instance) {

	if (newValue.value) {
		propValue = newValue;
		console.log('propValue.value:' + propValue.value);
		updateValue(ownerInstance, propValue.value);
	}

}

module.exports = {
	onTouchStart: onTouchStart,
	onTouchMove: onTouchMove,
	onTouchEnd: onTouchEnd,
	onClick: onClick,
	propObserver: propObserver
}

wxss 

.n-slider {
	position: relative;
	z-index: 0;
	width: 100%;
	/* 增大点击范围 */
	padding: 7px 0;
}

.n-slider .n-slider-rail {
	width: 100%;
	position: relative;
	height: 10rpx;
	background-color: rgb(219, 219, 223);
	border-radius: 10rpx;
}

.n-slider .n-slider-rail .n-slider-rail__fill {
	position: absolute;
	top: 0;
	bottom: 0;
	background-color: #FA6800;
	left: 0;
	/* 改变这个 */
	width: 0%;
	border-radius: inherit;
}

.n-slider .n-slider-handles {
	position: absolute;
	top: 0;
	bottom: 0;
	/* 这里是滑块宽度的一半 */
	left: 80rpx;
	right: 80rpx;
}

.n-slider .n-slider-handles .n-slider-handle-wrapper {
	outline: none;
	position: absolute;
	top: 50%;
	transform: translate(-50%, -50%);
	display: flex;
	/* 改变这个 */
	left: 0%;
	z-index: 0;
}

.n-slider .n-slider-handles .n-slider-handle-wrapper .n-slider-handle {
	height: 42rpx;
	line-height: 42rpx;
	width: 160rpx;
	overflow: hidden;
	background-color: #FFFFFF;
	/* box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.3), inset 0 0 1px 0 rgba(0, 0, 0, 0.05); */
	opacity: .8;
	font-size: 26rpx;
	text-align: center;
	border: 1px solid #b9b9b9;
	box-sizing: border-box;
	border-radius: 6rpx;
	color: #333333;
}

如果觉得可以,请微信关注《华音有声剧社》公众号,进入小程序听书

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

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

相关文章

AWS入列CNCF基金会

7月27日&#xff0c;IT之家曾经报道&#xff0c;微软加入Linux旗下CNCF基金会&#xff0c;在这之后不到一个月的今天&#xff0c;亚马逊AWS也宣布&#xff0c;以铂金身份加入此基金会。 CNCF&#xff0c;全称Cloud Native Computing Fundation&#xff0c;该基金会旨在使得容器…

Java中Hashset存储原理底层深挖

上课老师讲了Hashset的添加元素方法&#xff0c;感觉不甚准确&#xff0c;于是下课扒一扒底层源码&#xff0c;这一看&#xff0c;霍&#xff01; 原来如此。现在小丁来捋一遍他的存储原理。 public boolean add(E e) {return map.put(e, PRESENT)null;} 可以看到PRESENT是一…

HTTPS 证书生成脚本详细讲解

前言 HTTPS证书的作用是用于保障网站的安全性。在HTTPS协议中&#xff0c;通过使用证书来实现客户端与服务器之间的认证和数据加密&#xff0c;防止中间人攻击、信息泄漏等安全问题的发生。https证书也就是SSL证书&#xff0c;我们首先要确定好需要 https 安全连接的域名&…

IMX6ULL移植篇-Linux内核源码目录分析一

一. Linux内核源码目录 之前文章对 Linux内核源码的文件做了大体的了解&#xff0c;如下&#xff1a; IMX6ULL移植篇-Linux内核源码文件表_凌肖战的博客-CSDN博客 本文具体说明 Linux内核源码的一些重要文件含义。 二. Linux内核源码中重要文件分析 1. arch 目录 这个目录…

Spring的后处理器

Spring后处理器 Spring后处理器是Spring对外开放的重要拓展点&#xff08;让我们可以用添加自己的逻辑&#xff09;&#xff0c;允许我们介入到Bean的整个实例化流程中来&#xff0c;以达到动态注册BeanDefinition&#xff08;向BeanDefitionMap中添加BeanDefition对象的过程&…

【视觉SLAM入门】8. 回环检测,词袋模型,字典,感知,召回,机器学习

"见人细过 掩匿盖覆” 1. 意义2. 做法2.1 词袋模型和字典2.1.2 感知偏差和感知变异2.1.2 词袋2.1.3 字典 2.2 匹配(相似度)计算 3. 提升 前言&#xff1a; 前端提取数据&#xff0c;后端优化数据&#xff0c;但误差会累计&#xff0c;需要回环检测构建全局一致的地图&…

数据结构与算法(C语言版)P5---栈

1、栈 1.1、栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。__进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。__栈中的数据元素遵守__后进先出&#xff08;先进后出&#xff09;__LIFO&#xf…

【C++STL基础入门】list改、查操作

文章目录 前言一、list查操作1.1 迭代器循环1.2 for_each函数 二、list改操作2.1 迭代器修改2.2 assign函数2.3 运算符 总结 前言 C标准模板库&#xff08;STL&#xff09;是C语言中非常重要的部分&#xff0c;它提供了一组通用的模板类和函数&#xff0c;用于处理常见的数据结…

利用C++开发一个迷你的英文单词录入和测试小程序-源码

接上一篇&#xff0c;有了数据库的查询&#xff0c;再把小测试的功能给补足&#xff0c;小程序的结构就出来了。 备注&#xff1a;enable_if 有更优秀的concept C 20替代品&#xff0c;C11 里面提到的any&#xff0c;variant&#xff0c;再C17 已经被纳入了标准库。这里完全可…

iOS加固保护技术:保护你的iOS应用免受恶意篡改

目录 转载&#xff1a;开始使用ipaguard 前言 下载ipa代码混淆保护工具 获取ipaguard登录码 代码混淆 文件混淆 IPA重签名与安装测试 转载&#xff1a;开始使用ipaguard 前言 iOS加固保护是直接针对ios ipa二进制文件的保护技术&#xff0c;可以对iOS APP中的可执行文件…

机器学习(17)---支持向量机(SVM)

支持向量机 一、概述1.1 介绍1.2 工作原理1.3 三层理解 二、sklearn.svm.SVC2.1 查看数据集2.2 contour函数2.3 画决策边界&#xff1a;制作网格2.4 建模画图 三、非线性情况推广3.1 查看数据集3.2 线性画图3.3 为非线性数据增加维度并绘制3D图像 四、核函数 一、概述 1.1 介绍…

记一次 mysql 数据库定时备份

环境&#xff1a;Centos 7.9 数据库&#xff1a;mysql 8.0.30 需求&#xff1a;生产环境 mysql 数据&#xff08;约670MB&#xff09;备份。其中存在大字段、longblob字段 参考博客&#xff1a;Linux环境下使用crontab实现mysql定时备份 - 知乎 一、数据库备份 1. 备份脚本。创…

Python项目Flask ipv6双栈支持改造

一、背景 Flask 是一个微型的(轻量)使用Python 语言开发的 WSGI Web 框架(一组库和模块),基于Werkzeug WSGI工具箱/库和Jinja2 模板引擎,当然,Python的WEB框架还有:Django、Tornado、Webpy,这暂且不提。 Flask使用BSD授权。 Flask也被称为microframework(微框架),F…

RFID技术在工业智能制造生产线中的应用

随着自动化和信息化的快速发展&#xff0c;工业智能制造成为制造业的重要趋势&#xff0c;在制造商的生产线上&#xff0c;准确获取和管理工艺流程等各个环节的信息至关重要&#xff0c;作为物联网感知层的核心组成部分&#xff0c;RFID技术以其非接触式、无感知的特点&#xf…

隔山打牛:金融大崩溃

当2004-2006年美联储主席格林斯潘在任期的末尾一鼓作气把联邦利率从1%拉高到5%&#xff0c;然后把美联储主席的位子交给继任者伯南克的时候&#xff0c;没有人意识到接下来将要发生何等巨变。 图&#xff1a;美国联邦利率 伯南克把利率稳定在5.3%附近的高位一年左右时间&#x…

【ArcGIS】基本概念-矢量空间分析

栅格数据与矢量数据 1.1 栅格数据 栅格图是一个规则的阵列&#xff0c;包含着一定数量的像元或者栅格 常用的栅格图格式有&#xff1a;tif&#xff0c;png&#xff0c;jpeg/jpg等 1.2 矢量数据 矢量图是由一组描述点、线、面&#xff0c;以及它们的色彩、位置的数据&#x…

无涯教程-JavaScript - AVEDEV函数

描述 AVEDEV函数返回数据点与其平均值的绝对偏差的平均值。 AVEDEV是数据集中变异性的量度。 语法 AVEDEV (number1, [number2] ...)争论 Argument描述Required/OptionalNumber11 to 255 arguments for which you want the average of the absolute deviations.Requirednum…

趴趴雅思作文修改

前言 在网上试了下趴趴雅思作文修改的服务&#xff0c;淘宝上直接就可以购买&#xff0c;首次有优惠&#xff0c;之后还是挺贵的。 用了下感觉&#xff0c;有用还是有用的&#xff0c;但是挺贵的&#xff0c;一次40&#xff0c;不值。他给我作文的评分是7分&#xff0c;应该给…

fineReport11.0.4版本新建数据链接

需要以下几步&#xff1a; 1.设计器和服务器都需要安装对应数据库的驱动&#xff08;已安装就跳过&#xff09; 对应驱动可以在官网下载&#xff0c;百度搜下有教程 2.服务器没有驱动需要上传驱动 2.1 服务器上传驱动文件&#xff0c;需要修改finedb中的fine_conf_entity表…

Mobpush上线跨时区推送功能,助力中国开发者应用出海

近年来随着国内移动应用存量市场饱和&#xff0c;国内移动应用厂商转向”移动出海“&#xff0c;把握国际市场中存在结构性发展机会&#xff0c;提升中国品牌移动应用的知名度和影响力。根据公开资料显示&#xff0c;中国应用开发者中有79.1%计划出海&#xff0c;其中43%的开发…