当前位置: 首页 > 编程日记 > 正文

一个简单的slider滑块组件

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

我们先来看一张图片:

要实现这样的效果我们有很多种方法,比如直接使用<input type="range" />修改样式即可,也可用下面的这种方式修改 样式
HTML代码:

<div class="slider"><button class="slider-track"></button><button class="slider-thumb"></button>
</div>

CSS 样式:

.slider {padding: 5px 0;position: relative;margin: 30px 10%;--percent: 0;
}.slider-track {display: block;width: 100%;height: 6px;background-color: lightgray;border: 0;padding: 0;
}.slider-track::before {content: '';display: block;height: 100%;background-color: skyblue;width: calc(1% * var(--percent));
}.slider-thumb {position: absolute;width: 16px;height: 16px;border: 0;padding: 0;background: #fff;box-shadow: 0 0 0 1px skyblue;border-radius: 50%;left: calc(1% * var(--percent));top: 0;margin: auto -8px;
}`

那如何以组件的形式生成一个简单的滑块呢?

JS代码如下:

class Slider {constructor(opts = {}) {this.el = opts.el;this.value = opts.value || 0;this.slider = null;this.render();this.bindEvt();return {val: (value) => {this.val(value);}}}//渲染DOMrender() {const container = document.querySelector(this.el);const slider = document.createElement('div');this.slider = slider;// 有缺省值则赋值if (this.value) {this.val(this.value);}slider.className = "slider";// 轨道无需获取焦点slider.innerHTML = (`<button class="slider-track" tabindex="-1"></button><button class="slider-thumb"></button>`);if (container) {container.appendChild(slider);} else {// 若未指定容器,则在 body 标签最后插入 DOM 结构document.body.appendChild(slider);}}// 监听事件bindEvt() {const {slider} = this;const slider_track = slider.querySelector('.slider-track');const slider_thumb = slider.querySelector('.slider-thumb');let readymMove = false;const startHandle = e => {if (e.target === slider_thumb) {e.stopPropagation();readymMove = true;}}const moveHandle = e => {if (readymMove) {this.computeVal(e);}}const endHandle = () => {readymMove = false};slider.addEventListener('click', e => {if (e.target == slider_track) {this.computeVal(e);}}, false)slider.addEventListener('keydown', evt => {if (document.activeElement === slider_thumb) {let value = this.val();evt = (evt) ? evt : ((window.event) ? window.event : ""); //兼容IE和Firefox获得keyBoardEvent对象  var keyCode = evt.keyCode ? evt.keyCode : evt.which; //兼容IE和Firefox获得keyBoardEvent对象的键值  switch (keyCode) {//左箭头case 37:value--;break;//右箭头case 39:value++;break;}}this.val(value);}, false)// 开始拖动slider.addEventListener('touchstart', startHandle);slider.addEventListener('mousedown', startHandle);// 拖动中window.addEventListener('touchmove', moveHandle);window.addEventListener('mousemove', moveHandle);// 拖动结束window.addEventListener('touchend', endHandle);window.addEventListener('mouseup', endHandle);}// 计算当前值computeVal(e) {const {width, left} = this.slider.getBoundingClientRect();let posX = e.pageX;if (e.touches) { // 兼容移动端posx = e.touches[0].pageX;}this.val((posX - left) / width * 100);}// 赋值 & 取值val(value) {if (typeof value === 'undefined') {// 返回当前 slider 的 percent 值return this.slider.style.getPropertyValue('--percent').trim() || 0;}if (isNaN(value)) { // 过滤非法字符return;}if (value < 0) {value = 0;} else if (value > 100) {value = 1000;}this.slider.style.setProperty('--percent', value);}
}

使用方式:

let myslider1 = new Slider({ el: '#box' });  // 指定容器
new Slider({ value: 50 });  // 缺省赋值
myslider1.val(value);  // js 动态赋值
or
new Slider();  // 无参数(插入到 body 标签最后,赋值为 0)

代码实现还是很简单的,有兴趣的可以点这里,更多基础测试等着你

转载于:https://my.oschina.net/u/1778998/blog/3043705

相关文章:

压测接口线程数设置_ZAT掌门性能压测巡检系统实战和落地

项目背景随着业务拓展&#xff0c;对于接口性能的要求也在上升&#xff0c;各部门也开始针对部分慢接口进行优化&#xff0c;从测试角度针对这些优化需求进行测试时不仅要保证对应接口的功能正常使用同时也要验证接口优化成果。在日常的开发工作中一些后台服务配置的改动也会对…

01python语言程序设计基础——初识python

1.python的字符串中format函数用法 format 函数可以接受不限个参数&#xff0c;位置可以不按顺序。In [2]:"{} {}".format("hello", "world") # 不设置指定位置&#xff0c;按默认顺序Out[2]:hello world In [3]:"{0} {1}".format(&q…

没有什么不可能(1)

近在读一本书《没有什么不可能》&#xff0c;书中宗旨就是&#xff1a;这个世界没有什么不可能&#xff0c;每个人的脚下都有一条通往成功的道路&#xff0c;信念是一切力量的源泉。这本书看了三分之一&#xff0c;跟大家分享一下前三个观点。 1、只有想不到&#xff0c;没有做…

浅浅认识之VBS脚本访问接口与COMODO拦截COM接口

这2天测试了一个使用了WMI提供ASEC后门&#xff0c;里面使用了JS脚本往外请求http获取执行命令。但我的分析系统却没抓到这个行为&#xff0c;可在真机中确实抓到有HTTP请求。相当奇怪。 最后无奈windbg出手&#xff0c;内核断点afd 发送函数。最后发现是scrcons.exe进程&#…

redis最大储存512m_redis系列篇01

今天写的这篇是redis系列的文章&#xff0c;我的安排是由浅入深写redis系列。本篇是简单的介绍入门&#xff0c;后续的文章会详细讲解redis深层次的知识。欢迎大家关注我的微信公众号&#xff1a;码农Bug首先说几个简单的命令&#xff1a;keys *:查询所有的键值del key&#xf…

批处理命令——goto 和 :

谈起goto&#xff0c;相信大家应该想到的是面向过程编程。其实&#xff0c;这就相当于当有人向你谈起class&#xff0c;意味着你就懂得面向对象编程。如果你不懂&#xff0c;那么你们的沟通将会很困难。不懂我说的啥意思吗&#xff1f;请参见曾经分享王路的一篇文章《永远不要对…

浮动布局会受父框滚动条影响

此时的效果是&#xff1a;如果此时把父框的滚动条去掉或隐藏掉&#xff1a;而此时的效果是:总结:1 有时我们的布局发生了改变可能就是受到出现滚动条的影响了 而我们很容易忽略掉这一点转载于:https://blog.51cto.com/11871779/2387118

Delphi7的主窗口

Delphi7的主窗口转载于:https://www.cnblogs.com/LoveFishC/archive/2012/08/10/3845692.html

线程组多次调用_详细分析 Java 中启动线程的正确和错误方式

start 方法和 run 方法的比较代码演示:/** * * start() 和 run() 的比较 * * * author 踏雪彡寻梅 * version 1.0 * date 2020/9/20 - 16:15 * since JDK1.8 */public class StartAndRunMethod {public static void main(String[] args) {// run 方法演示// 输出: name: main//…

Concurrency Runtime in Visual C++ 2010

PDC 2010 Hejlsberg的演讲中我们看到了VB.NET、C#新的简化异步编程的方式&#xff08;可以下载新的Async CTP体验&#xff09;。之前的TPL&#xff08;Task Parallel Library&#xff09;简化了并行编程。工业语言的飞速发展大大改进、简化了开发人员的编程方式。不仅是微软平台…

关于安卓你不知道的6件事

安卓第一次亮相是出如今2008年公布的HTC Dream手机上&#xff0c;到如今为止它已经6岁了。或许没有人想过在2010年底它就成为了智能手机平台率先的操作系统。这当然要感谢谷歌的努力和强大的財力支持。尽管眼下安卓系统是世界上最流行的移动操作系统&#xff0c;可是关于它的非…

vmware的三种网络模式讲解

vmware有三种网络设置模式&#xff0c;分别是Bridged(桥接),NAT(网络地址转换)&#xff0c;Host-only(私有网络共享主机) 1.Bridged(桥接) 桥接模式默认使用的是&#xff1a;VMnet0 什么是桥接模式&#xff1f;桥接模式就是把主机网卡和虚拟机虚拟的网卡利用虚拟网桥进行通信。…

当前路径_[JSP] 07 JSP 路径问题

首先先明确一下下列URL的假设一个URL是这样的losthost:8080/myservlet/path服务器根路径:losthost:8080/项目根路径:losthost:8080/myservlet/明确了服务器根路径和项目根路径之后,我们就可以开始学习后面的知识了servlet路径问题请求转发和重定向的相对路径写法总结:Servlet重…

CPU时间戳获取

inline long long timt(){long long p; int&a*(((int*)&p)1);__asm__ __volatile__("rdtsc":"a"(p),"d"(a));return p; } 因为在64位CPU上rdtsc出来的结果仍然是在%eax和%edx,而%rax却不是由%eax和%edx拼起来的(反正我试了它没用...也许…

NYOJ 366 D的小L

地址&#xff1a;http://acm.nyist.net/JudgeOnline/problem.php?pid366 方法&#xff1b;用next_permutation&#xff08;pɝmjʊteʃə&#xff09;来求解&#xff0c;递归调用代码 1 #include<stdio.h>2 #include<algorithm>3 using namespace std;4 int main(…

MySQL 语句整理 2019-5-3

MySQL 语句整理 在整理完Oracle的一些常见用语句后,由于MySQL的语法跟Oracle略有不同,随跟PN的MySQL视频进行了间接整理. 查询薪水大于1800, 并且部门编号为20或30的员工sql select deptno,ename,sal from emp where sal > 1800 and (deptno 20 or deptno 30); and 优先级…

联想e580没有声音_现在你可以购买通过 Linux 认证的联想 ThinkPad 和 ThinkStation

曾经有一段时间&#xff0c;ThinkPad 是 Linux 用户的首选系统。但那是在 ThinkPad 还是 IBM 的产品的时候。来源&#xff1a;https://linux.cn/article-12283-1.html作者&#xff1a;Abhishek Prakash译者&#xff1a;Xingyu.Wang曾经有一段时间&#xff0c; ThinkPad 是 Linu…

linux平台下防火墙iptables原理(转)

原文地址&#xff1a;http://www.cnblogs.com/ggjucheng/archive/2012/08/19/2646466.html iptables简介 netfilter/iptables&#xff08;简称为iptables&#xff09;组成Linux平台下的包过滤防火墙&#xff0c;与大多数的Linux软件一样&#xff0c;这个包过滤防火墙是免费的&a…

SQL语法大全

SQL语句大全 --语 句 功 能--数据操作SELECT --从数据库表中检索数据行和列INSERT --向数据库表添加新数据行DELETE --从数据库表中删除数据行UPDATE --更新数据库表中的数据--数据定义CREATE TABLE --创建一个数据库表DROP TABLE --从数据库中删除表ALTER TABLE --修改数据库表…

Node.js的url模块简介

什么是URL URL是Uniform Location Resource的缩写&#xff0c;翻译为“统一资源定位符”&#xff0c;也就是描述资源位置的固定表示方法。被URL描述的资源可以位于互联网上&#xff0c;也可以位于本地。 URL的组成结构 基本URL包含模式&#xff08;或者成为协议&#xff09;&am…

python游戏结束显示分数代码_当游戏循环在Python中运行时,多线程来显示游戏分数?...

我想根据比赛时间的推移得分。为此&#xff0c;我想让两个循环同时运行。游戏循环和得分循环&#xff0c;每1.5秒加1。当我运行程序时&#xff0c;分数不会出现。我是否正确使用多线程&#xff1f;这是最好的办法吗&#xff1f;为了简单起见&#xff0c;我只发布了相关代码。谢…

NOIP2015解题报告 By ljt12138

Day1t1 幻方 练过的一道题&#xff0c;简单模拟&#xff0c;用二维数组存储&#xff0c;ij两个游标记录横纵坐标&#xff0c;利用题目条件改变坐标直到填入n个数即可。复杂度O(n^2) AC Day2t2 图的最小环 首先抽象出图论模型。每个人对应点&#xff0c;传输对应边。因为自己…

设计模式笔记——Adapter

适配器模式Adapter 将一个类的接口转换成用户希望的另外一个接口。适配器模式主要应用于希望复用一些现存的类&#xff0c;但是接口又与复用的环境要求不一样的情况。 package adapter.pattern; /*** * author Real H LI**/ public class Existed {public void OldRequest(){Sy…

iOS12-crash错误-reason: 'UITableView failed to obtain a cell from its dataSource'

错误原因&#xff1a; cellForRowAtIndexPath函数返回了nil override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {let cell tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: in…

with as python_python - with as的用法

摘自&#xff1a;http://www.cnblogs.com/DswCnblog/p/6126588.htmlWith 是什么&#xff1f;有一些任务可能事先需要设置&#xff0c;事后做清理工作。对于这种场景&#xff0c;Python的with语句提供了一种非常方便的处理方式。一个很好的例子是文件处理&#xff0c;你需要获取…

wcf系列学习5天速成——第四天 wcf之分布式架构(转载)

今天是wcf系列的第四天&#xff0c;也该出手压轴戏了。嗯&#xff0c;现在的大型架构&#xff0c;都是神马的&#xff0c; nginx鸡群&#xff0c;iis鸡群&#xff0c;wcf鸡群&#xff0c;DB鸡群&#xff0c;由一个人作战变成了群殴....... 今天我就分享下wcf鸡群&#xff0c;高…

检测jQuery.js是否已加载的判断代码

转载自http://www.jb51.net/article/27185.htm 测类、方法、变量或属性是否已存在&#xff0c;这是Javascript编程基础知识。在这里我们就是要检测jQuery()或$()函数是否存在 当然&#xff0c;该方法不局限于jQuery的检测&#xff0c;对与任何Javascript变量或函数都是通用的。…

Java中常见的锁简述

在Java的应用中&#xff0c;或多或少的都会接触到一些锁&#xff0c;那么问题就来了&#xff0c;在Java中&#xff0c;常见的锁有哪些&#xff0c;都有什么样的作用&#xff1f;&#xff1f; 这里给大家简单的简述一下这些学常见的锁。 本文件所涉及到的锁&#xff1a; 1.公平锁…

加了好友怎么还掉血_微信聊天窗口出现风险提醒,无法添加好友解决办法

再更&#xff0c;你想马上解封&#xff0c;你得有朋友。没有朋友&#xff0c;你就等个十天半个月&#xff01;更新一下 帖子浏览人挺多的&#xff0c;有问题可以在评论里相互交流&#xff0c;下面是原文&#xff1a;先让我说一句脏话&#xff1a;傻x微信风控系统 终于特么的聊天…

[小明爬坑系列]AssetBundle原理介绍

一.简介 Assetbundle 是Unity Pro提供提供的功能&#xff0c;它可以把多个游戏对象或者资源二进制文件封装到Assetbundle中&#xff0c;提供了封装与解包的方法使用起来很便利。 二.移动平台特点 Assetbundle是可以把预制,文件以及场景都打包到Assetbundle中去的,但是在移动平台…