基于vue实现移动端圆形旋钮插件效果


Posted in Javascript onNovember 28, 2018

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

基于vue实现移动端圆形旋钮插件效果

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圆心如下:

基于vue实现移动端圆形旋钮插件效果

注:.round_right 元素如下:

基于vue实现移动端圆形旋钮插件效果

总结

以上所述是小编给大家介绍的基于vue实现移动端圆形旋钮插件效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
js showModalDialog参数的使用详解
Jan 07 Javascript
轮播图组件js代码
Aug 08 Javascript
jQuery ajaxForm()的应用
Oct 14 Javascript
面试常见的js算法题
Mar 23 Javascript
jQuery中的deferred使用方法
Mar 27 jQuery
Bootstrap布局之栅格系统学习笔记
May 04 Javascript
jQuery实现的粘性滚动导航栏效果实例【附源码下载】
Oct 19 jQuery
Vue导出json数据到Excel电子表格的示例
Dec 04 Javascript
electron + vue项目实现打印小票功能及实现代码
Nov 25 Javascript
layui固定下拉框的显示条数(有滚动条)的方法
Sep 10 Javascript
Javascript模块化机制实现原理详解
Apr 02 Javascript
WebStorm无法正确识别Vue3组合式API的解决方案
Feb 18 Vue.js
VUE2.0 ElementUI2.0表格el-table自适应高度的实现方法
Nov 28 #Javascript
Vue触发式全局组件构建的方法
Nov 28 #Javascript
Vue axios全局拦截 get请求、post请求、配置请求的实例代码
Nov 28 #Javascript
jQuery实现购物车的总价计算和总价传值功能
Nov 28 #jQuery
vue与原生app的对接交互的方法(混合开发)
Nov 28 #Javascript
vue微信分享出来的链接点开是首页问题的解决方法
Nov 28 #Javascript
vue实现微信分享功能
Nov 28 #Javascript
You might like
使用PHP+AJAX让WordPress动态加载文章的教程
2015/12/11 PHP
PHP下载文件的函数实例代码
2016/05/18 PHP
php文件上传类的分享
2017/07/06 PHP
自动检查并替换文本框内的字符
2006/06/30 Javascript
javascript实现图片延迟加载方法汇总(三种方法)
2015/08/27 Javascript
jQuery实现无限往下滚动效果代码
2016/04/16 Javascript
Angularjs中的验证input输入框只能输入数字和小数点的写法(推荐)
2017/08/16 Javascript
vue 中固定导航栏的实例代码
2019/11/01 Javascript
js通过循环多张图片实现动画效果
2019/12/19 Javascript
[34:56]Ti4冒泡赛LGD vs Liquid 1
2014/07/14 DOTA
python3.5仿微软计算器程序
2020/03/30 Python
Python解析并读取PDF文件内容的方法
2018/05/08 Python
python实现顺时针打印矩阵
2019/03/02 Python
对python while循环和双重循环的实例详解
2019/08/23 Python
WxPython实现无边框界面
2019/11/18 Python
如何基于Python + requests实现发送HTTP请求
2020/01/13 Python
Python编程快速上手——Excel到CSV的转换程序案例分析
2020/02/28 Python
Python基于yaml文件配置logging日志过程解析
2020/06/23 Python
如何使用Cython对python代码进行加密
2020/07/08 Python
详解CSS3的图层阴影和文字阴影效果使用
2016/06/09 HTML / CSS
HTML5仿手机微信聊天界面
2016/03/18 HTML / CSS
html5 canvas移动浏览器上实现图片压缩上传
2016/03/11 HTML / CSS
Columbia美国官网:美国著名的户外服装品牌
2016/11/24 全球购物
利物浦足球俱乐部官方网上商店:Liverpool FC Official Store
2018/01/13 全球购物
英国川宁茶官方网站:Twinings茶
2019/05/21 全球购物
安踏官方商城:anta.cn
2019/12/16 全球购物
node中使用shell脚本的方法步骤
2021/03/23 Javascript
零件设计自荐信范文
2013/11/27 职场文书
机械制造专业大学生自我鉴定
2014/09/19 职场文书
2014大四本科生自我鉴定总结
2014/10/04 职场文书
逃课打麻将检讨书
2014/10/05 职场文书
停车场管理协议书范本
2014/10/08 职场文书
2015年中秋晚会主持词
2015/07/01 职场文书
redis三种高可用方式部署的实现
2021/05/11 Redis
Python基础知识学习之类的继承
2021/05/31 Python
nginx访问报403错误的几种情况详解
2022/07/23 Servers