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

我们先来看一张图片:

要实现这样的效果我们有很多种方法,比如直接使用<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

一个简单的slider滑块组件相关推荐

  1. modal组件 vue_开发一个简单的 Vue 弹窗组件

    https://github.com/woai3c/Front-end-articles​github.com 一个弹窗组件通常包含两个部分,分别是遮罩层和内容层. 遮罩层是背景层,一般是半透明或不透 ...

  2. matlab滑块sliderstep,slider滑块组件

    概述 1 .划定输入器,用于在数值区间.自定义区间内进行选择,支持连续或者离散值 2 .主要问题:兼容性是个大问题https://caniuse.com/#search=appearance 其实最简 ...

  3. Deer-ui:一个简单高效的react组件库

    1.前言 自己一直想搭建一套自己的博客系统,今年年末终于有时间开发,在开发后台cms系统时,使用antd组件库,突然一天问自己,组件库是怎么实现的,内部是怎么运行的,打包部署是怎么个原理,带着这些疑问 ...

  4. 用Vue写一个简单好看的菜单组件(Vue实战系列)

    一.需求 实现一个左边栏菜单,菜单只包括两层: 点击出现水波纹效果: 激活效果:有一个绿球小点,标识激活的菜单,顶层菜单被激活时左边出现浅色激活标志: 二.实现 新建一个菜单组件whrmenu pro ...

  5. 第5章第18节:创建一个简单的Widget小组件 [SwiftUI快速入门到实战]

    Widget是iOS 14的新特性,要创建小组件,需要使用到SwiftUI和WidgetKit.要在项目中创建Widget,首先点击此处的加号图标,添加一个target. 点击右侧的垂直滚动条,查看W ...

  6. 【一个简单的vue公式编辑器组件】

    vue 一个简单的公式编辑器组件 示例 一个基于vue实现数据统计公式的基本功能. 新建一个 formula.vue 组件, 使用 <formula ref="formulaPage& ...

  7. 一个简单可参考的API网关架构设计

    http://www.infoq.com/cn/articles/api-gateway-architecture-design 网关一词较早出现在网络设备里面,比如两个相互独立的局域网段之间通过路由 ...

  8. vue2组件系列:Slider 滑块

    我所接触到的Slider滑块应用的场景,主要有图片的放大缩小,调节声音的大小.不知道小伙伴们的应用场景都有哪些呢?欢迎在文章下方留言讨论哈. 准备工作: 创建一个页面: Slider.vue在rout ...

  9. Vue封装一个简单轻量的上传文件组件

    一.之前遇到的一些问题 项目中多出有上传文件的需求,使用现有的UI框架实现的过程中,不知道什么原因,总会有一些莫名其妙的bug.比如用某上传组件,明明注明(:multiple="false& ...

最新文章

  1. Java中方法重载和方法重写的区别
  2. 元计算:《元计算破解生命密码》听课笔记
  3. tensorflow量化策略详解
  4. 出现could not find developer disk image解决办法和不受信任的开发者
  5. 删除ubuntu旧内核
  6. Java 用HTTP的方式发送JSON报文请求
  7. Windows 7丢失用户、密码解决办法-我体验了!
  8. Android Studio - xml布局文件不显示代码怎么办?
  9. 计时任务之StopWatch
  10. bat文件语法和技巧_这不是高手专利,一秒新建100个Excel文件
  11. 基于SSM开发的房屋租赁系统 JAVA
  12. minigui学习笔记四
  13. 解决 eclipse 上 Keystore was tampered with, or password was incorrect
  14. fatal error C1088
  15. 获取农历节日的公共方法
  16. w10计算机怎么恢复出厂设置路由器,Windows10系统重置无线wifi出厂设置的方法
  17. 一章——Web网站服务(一)(应用—linux高级管理)
  18. abb机器人负载配置设定_ABB机器人【 配置设定】大全 , 人手一份,建议永久收藏!...
  19. Linux内核数据结构——链表
  20. 计算机与打印机脱机后怎么共享,win7访问共享打印机显示打印机为脱机状态的方法...

热门文章

  1. c# unity PlayerPrefs 游戏存档,直白点就是讲游戏数据本地保存下来
  2. poj1625Censored!(AC自动机+dp)
  3. ulimit -SHn 65535 含义
  4. php 的opcode缓存apc以及其安装
  5. 怎么关闭wordpress评论
  6. 在网页中动态的生成一个gif图片
  7. DataGrid入门经典(C#)
  8. 服务器架设笔记——搭建用户注册和验证功能
  9. 使用Python3发送邮件测试代码
  10. C++11中Lambda表达式的使用