最近公司有一个项目的需要做出旋钮的效果,旋钮有十个档,根据手指旋转切换,旋转时接近最近的档会有吸附效果,具体效果如下:

html部分代码:

<div class="_touch"><div class="round_box" ref="box" @touchstart="touchStart" @touchmove="touchMove"><div v-if="able" style="position:absolute;width:100%;height:100%;top:0;left:0;"><div class="round_right" ref="right" :style="{ transform: 'rotate(' + angle +'deg)' }"><div class="round_info"></div></div><div class="round_num">{{level}}</div></div></div>
</div>

less样式部分代码:

._touch {padding-top: 48px;.round_box {position: relative;width: 54%;padding-top: 54%;margin: 0 auto;background-image: url(../../assets/img/round_box.png);background-size: auto 100%;background-position: center top;background-repeat: no-repeat;.round_right {width: 8%;height: 27%;position: absolute;left: 46%;top: 23%;transform-origin: 50% 100%;-webkit-transform-origin: 50% 100%;z-index: 2;.round_info {background: linear-gradient(#858585, #b3b3b3);background: -webkit-gradient(#858585, #b3b3b3);background: -moz-linear-gradient(#858585, #b3b3b3);width: 100%;padding-top: 100%;border-radius: 100%;}}.round_num {display: inline-block;position: absolute;z-index: 1;text-align: center;width: 30%;top: 38%;left: 35%;font-size: 2.4em;font-weight: 900;background: linear-gradient(#b0b0b0, #c8c8c8);background: -webkit-gradient(#b0b0b0, #c8c8c8);-webkit-background-clip: text;background-clip: text;-webkit-text-fill-color: transparent;text-fill-color: transparent;}}
}

js部分代码:

methods: {......,touchStart(e) {e.preventDefault();e.stopPropagation();let round_box = this.$refs.box;var w = round_box.offsetWidth / 2;var h = round_box.offsetHeight / 2;this.px = round_box.getBoundingClientRect().left + w;this.py = round_box.getBoundingClientRect().top + h;},touchMove(e) {e.preventDefault();e.stopPropagation();this.getAngle(e.changedTouches[0].clientX, e.changedTouches[0].clientY);},touchEnd(e) {e.preventDefault();e.stopPropagation();},resetAngle(angle) {let list = [{ angle: 0, level: 5 },{ angle: 36, level: 6 },{ angle: 72, level: 7 },{ angle: 108, level: 8 },{ angle: 144, level: 9 },{ angle: 180, level: 10 },{ angle: 216, level: 1 },{ angle: 252, level: 2 },{ angle: 288, level: 3 },{ angle: 324, level: 4 },{ angle: 360, level: 5 }];let result = list.filter(function(currentVal, index, arr) {return Math.abs(angle - currentVal.angle) <= 18;});this.angle = result[0].angle;this.level = result[0].level;},getAngle(mx, my) {var px = this.px;var py = this.py;var x = Math.abs(px - mx);var y = Math.abs(py - my);var z = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));var cos = y / z;var radina = Math.acos(cos); //用反三角函数求弧度var angle = Math.floor(180 / (Math.PI / radina)); //将弧度转换成角度if (mx > px && my > py) {//鼠标在第四象限angle = 180 - angle;}if (mx == px && my > py) {//鼠标在y轴负方向上angle = 180;}if (mx > px && my == py) {//鼠标在x轴正方向上angle = 90;}if (mx < px && my > py) {//鼠标在第三象限angle = 180 + angle;}if (mx < px && my == py) {//鼠标在x轴负方向angle = 270;}if (mx < px && my < py) {//鼠标在第二象限angle = 360 - angle;}this.angle = angle;this.$nextTick(function() {this.resetAngle(this.angle);});},
......

主要的思路是根据监听 .round_box 元素的 touchmove 事件获取手指相对于圆心这条直线的旋转角度(transform : rotate),

并把旋转角度同步到水平居中于 .round_box 容器,底边框中心与 .round_box重合的元素 : .round_right 上,使它相对于

.round_box的圆心旋转即可。

注:.round_box圆心如下:

注:.round_right 元素如下:

其中 吸附效果的代码在getAngle中。

转载于:https://www.cnblogs.com/zhuxiaoweb/p/10032323.html

vue实现移动端圆形旋钮插件相关推荐

  1. animate inater插件_基于animate.css动画库的全屏滚动小插件,适用于vue.js(移动端、pc)项目...

    功能简介 基于animate.css动画库的全屏滚动,适用于vue.js(移动端.pc)项目. 安装 npm install vue-animate-fullpage --save 使用 main.j ...

  2. vue前端对接Hikvision海康威视监控,pc端对接,插件模式

    一.简介 1.运行环境 Win7 32/64 位操作系统:32 位 IE10(兼容 64 位 IE10,64 位 IE10 环境下浏览器会默认启动 32 位 IE).32/64 位 IE11.32/6 ...

  3. Vue动态计算百分比配合vux插件

    1.首先进入vux官网中引入插件 XProgress 组件使用教程 | VUX - 基于 WeUI 和 Vue 的移动端组件库https://doc.vux.li/zh-CN/components/x ...

  4. Java Vue uni-app 三端实现,滑动拼图验证码

    一步一步实现 图片滑动验证码 项目中要使用 图片滑动验证码,顾了解之 需要以下几步来完成: 1.后端随机计算抠图的距离,生成背景与拼图块的图片,缓存 拼图块需 滑动的距离像素. 2.前端加载背景图 和 ...

  5. vue手机端项目php,MintUI基于Vue.js移动端组件库详解

    Mint UI 包含丰富的 CSS 和 JS 组件,能够满足日常的移动端开发需要.接下来通过本文给大家分享Mint UI 基于 Vue.js 移动端组件库,需要的朋友参考下吧,希望能帮助到大家. 官网 ...

  6. vue适配PC端屏幕自适应

    vue适配PC端屏幕自适应 1.下载postcss-px2rem和px2rem-loader npm i postcss-px2rem px2rem-loader 2.src目录下新建utils文件夹 ...

  7. Capacitor+Vue+Vant移动端打包总结

    Capacitor+Vue+Vant移动端打包总结 本笔记为打包Vue移动端Android Apk 打包步骤 Capacitor与Vue项目结合基本配置自行百度/谷歌,这里是已集成配置好的项目. 1. ...

  8. Vuex 数据流管理及Vue.js 服务端渲染(SSR)

    Vuex 数据流管理及Vue.js 服务端渲染(SSR)项目见:https://github.com/smallSix6/fed-e-task-liuhuijun/tree/master/fed-e- ...

  9. vue实现移动端图片预览

    vue实现移动端图片预览 1.安装插件 2.main引入 3.使用 注意 扩展 通过使用vue-photo-preview插件,实现移动端图片的预览,全屏等功能. 1.安装插件 npm install ...

最新文章

  1. 聊一聊我在 B站 上自学编程的经历吧
  2. 沈向洋博士:三十年科研路,我踩过的七个坑
  3. MECAT:PC组装人的基因组
  4. STL初探——构造和析构的基本工具: construct()和destroy()
  5. svn还原文件中去掉已经删除的文件
  6. 本地启动 SAP Commerce Cloud(Hybris) 产生的五个 Java 进程
  7. Java中包装类型和基本类型的使用场景(阿里开发规范)
  8. 腾讯面试官这样问我二叉树,我刚好都会 | 原力计划
  9. python脚本案例
  10. Ruby on Rails,创建模型,附赠模型与表名不一致时的解决方法
  11. 无法打开预编译头文件的解决方法及预编译头原理[ZZ] 转
  12. Kafka从上手到实践 - 实践真知:Kafka Java Producer | 凌云时刻
  13. 西门子S7-200的PLC,CPU224XP的模拟量接线怎样接
  14. 三千年来激荡人心的名句
  15. php eval 引号,PHP手册-eval()(可以将单引号中的变量解析)
  16. SkyLine——3DGIS三维地理信息系统软件产品介绍
  17. html5 代码画兰博基尼跑车,6不6你说的算!
  18. Java+Selenium+Junit demo
  19. 城市应急处置系统实施目标
  20. 【优化求解】基于自适应模拟退火粒子群优化算法求解单目标优化问题matlab代码

热门文章

  1. PYTHON线程知识再研习F---队列同步Queue
  2. Map-Reduce编程模型gif图片解释
  3. C#制作自定义安装程序
  4. Linuxtone命令一句话
  5. lovely desktop
  6. python取整数_python 取整函数
  7. mongodb从3.2升级到4.4_丰田汉兰达汽车音响升级黄金声学GS265.2,焱哥音响
  8. Java学习_day009面向对象(oop):对象和类(下)
  9. KaliLinuxNetHunter教程下载相关资源
  10. iOS 9应用开发教程之编辑界面与编写代码