经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » Vue.js » 查看文章
Vue滑块解锁组件使用方法详解
来源:jb51  时间:2022/3/7 11:13:02  对本文有异议

本文实例为大家分享了Vue滑块解锁组件的使用,供大家参考,具体内容如下

依据 JS拖动滑块验证 开发的 Vue 滑块解锁组件。

  1. <template>
  2. ? <div ref="wrap" class="slider-unlock">
  3. ? ? <div class="before">请按住滑块,拖动到最右边</div>
  4. ? ? <div ref="after" class="after">
  5. ? ? ? <div class="after-inner">{{ success?'验证成功':'请按住滑块,拖动到最右边' }}</div>
  6. ? ? </div>
  7. ? ? <div ref="slider" class="slider" :class="{'is-success': success}" />
  8. ? </div>
  9. </template>
  10.  
  11. <script>
  12. export default {
  13. ? name: 'SliderUnlock',
  14. ? data() {
  15. ? ? return {
  16. ? ? ? success: false,
  17. ? ? ? clear: null,
  18. ? ? }
  19. ? },
  20. ? mounted() {
  21. ? ? this.init()
  22. ? },
  23. ? beforeDestroy() {
  24. ? ? this.clear && this.clear()
  25. ? },
  26. ? methods: {
  27. ? ? init() {
  28. ? ? ? // 获取 dom
  29. ? ? ? const after = this.$refs.after
  30. ? ? ? const slider = this.$refs.slider
  31. ? ? ? const wrap = this.$refs.wrap
  32. ? ? ? // 设置after-inner的固定宽度
  33. ? ? ? after.childNodes[0].style.width = wrap.offsetWidth + 'px'
  34. ? ? ? // 滑块移动最大位置
  35. ? ? ? const limit = wrap.offsetWidth - slider.offsetWidth
  36.  
  37. ? ? ? // 实时计算滑块的偏移量
  38. ? ? ? let offsetX
  39. ? ? ? // 点击滑块时的鼠标X位置
  40. ? ? ? let initX
  41.  
  42. ? ? ? // 页面鼠标移动事件
  43. ? ? ? const docMousemoveHandler = e => {
  44. ? ? ? ? // 获取移动后鼠标实时位置
  45. ? ? ? ? const moveX = e.clientX
  46. ? ? ? ? // 计算滑块应该移动的偏移量
  47. ? ? ? ? offsetX = moveX - initX
  48.  
  49. ? ? ? ? // 限制上下限
  50. ? ? ? ? if (offsetX < 0) {
  51. ? ? ? ? ? offsetX = 0
  52. ? ? ? ? } else if (offsetX > limit) {
  53. ? ? ? ? ? offsetX = limit
  54. ? ? ? ? }
  55.  
  56. ? ? ? ? // 移动滑块
  57. ? ? ? ? slider.style.left = offsetX + 'px'
  58. ? ? ? ? // 修改高亮背景宽度
  59. ? ? ? ? after.style.width = offsetX + 'px'
  60.  
  61. ? ? ? ? if (offsetX >= limit) {
  62. ? ? ? ? ? this.success = true
  63. ? ? ? ? ? this.$emit('success')
  64. ? ? ? ? ? document.removeEventListener('mousemove', docMousemoveHandler)
  65. ? ? ? ? ? slider.removeEventListener('mousedown', sliderMousedownHandler)
  66. ? ? ? ? }
  67. ? ? ? }
  68.  
  69. ? ? ? // 页面鼠标松开事件
  70. ? ? ? const docMouseupHandler = e => {
  71. ? ? ? ? // 解绑事件
  72. ? ? ? ? document.removeEventListener('mousemove', docMousemoveHandler)
  73. ? ? ? ? // 重置滑块
  74. ? ? ? ? if (offsetX < limit) {
  75. ? ? ? ? ? slider.style.left = 0
  76. ? ? ? ? ? after.style.width = 0
  77. ? ? ? ? }
  78. ? ? ? }
  79.  
  80. ? ? ? // 滑块点击事件
  81. ? ? ? const sliderMousedownHandler = e => {
  82. ? ? ? ? // 获取鼠标位置
  83. ? ? ? ? initX = e.clientX
  84. ? ? ? ? // 绑定页面的鼠标移动事件
  85. ? ? ? ? document.addEventListener('mousemove', docMousemoveHandler)
  86. ? ? ? }
  87.  
  88. ? ? ? // 绑定滑块点击事件
  89. ? ? ? slider.addEventListener('mousedown', sliderMousedownHandler)
  90.  
  91. ? ? ? // 页面鼠标松开事件
  92. ? ? ? document.addEventListener('mouseup', docMouseupHandler)
  93.  
  94. ? ? ? // 定义清理方法
  95. ? ? ? this.clear = () => {
  96. ? ? ? ? document.removeEventListener('mousemove', docMousemoveHandler)
  97. ? ? ? ? slider.removeEventListener('mousedown', sliderMousedownHandler)
  98. ? ? ? ? document.removeEventListener('mouseup', docMouseupHandler)
  99. ? ? ? }
  100. ? ? },
  101. ? },
  102. }
  103. </script>
  104.  
  105. <style lang="less" scoped>
  106. .slider-unlock{
  107. ? height: 45px;
  108. ? background: #E1E1E1;
  109. ? border-radius: 4px;
  110. ? position: relative;
  111. ? overflow: hidden;
  112. ? border: 1px solid #CCCCCC;
  113. ? box-sizing: border-box;
  114. ? user-select: none;
  115. ? .before, .after {
  116. ? ? position: absolute;
  117. ? ? margin: -1px 0 0 -1px;
  118. ? ? top: 0;
  119. ? ? left: 0;
  120. ? ? z-index: 1;
  121. ? ? height: 100%;
  122. ? ? box-sizing: content-box;
  123. ? ? font-size: 14px;
  124. ? ? font-weight: bold;
  125. ? ? line-height: 43px;
  126. ? ? text-align: center;
  127. ? }
  128. ? .before {
  129. ? ? width: 100%;
  130. ? ? color: #333;
  131. ? ? padding: 0 1px 1px 0;
  132. ? }
  133. ? .after {
  134. ? ? width: 0;
  135. ? ? overflow: hidden;
  136. ? ? padding: 0 0 1px 0;
  137. ? ? &-inner {
  138. ? ? ? position: absolute;
  139. ? ? ? width:100%;
  140. ? ? ? height: 100%;
  141. ? ? ? color: #fff;
  142. ? ? ? background-color: #40C057;
  143. ? ? }
  144. ? }
  145. ? .slider{
  146. ? ? position: absolute;
  147. ? ? margin: -1px 0 0 -1px;
  148. ? ? top: 0;
  149. ? ? left: 0;
  150. ? ? z-index: 3;
  151. ? ? width: 70px;
  152. ? ? height: 45px;
  153. ? ? border: 1px solid #CCC;
  154. ? ? cursor: pointer;
  155. ? ? background: no-repeat center center #fff;
  156. ? ? background-image: url(~@/imgs/icon-allow-right.png);
  157. ? ? &.is-success {
  158. ? ? ? background-image: url(~@/imgs/icon-success.png);
  159. ? ? }
  160. ? }
  161. }
  162. </style>

使用:

  1. <SliderUnlock @success="handler" />

效果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号