基于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 相关文章推荐
File, FileReader 和 Ajax 文件上传实例分析(php)
Apr 27 Javascript
JavaScript instanceof 的使用方法示例介绍
Oct 23 Javascript
jquery获取颜色在ie和ff下的区别示例介绍
Mar 28 Javascript
Javascript基础教程之关键字和保留字汇总
Jan 18 Javascript
JScript中的条件注释详解
Apr 24 Javascript
jQuery实现气球弹出框式的侧边导航菜单效果
Sep 22 Javascript
JavaScript实现广告弹窗效果
Aug 09 Javascript
jquery实现转盘抽奖功能
Jan 06 Javascript
js仿拉勾网首页穿墙广告效果
Mar 08 Javascript
jQuery实现图片随机切换、抽奖功能(实例代码)
Oct 23 jQuery
Vue分页效果与购物车功能
Dec 13 Javascript
JS 逻辑判断不要只知道用 if-else 和 switch条件判断(小技巧)
May 27 Javascript
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基础知识:类与对象(4) 范围解析操作符(::)
2006/12/13 PHP
php xml文件操作代码(一)
2009/03/20 PHP
PHP5多态性与动态绑定介绍
2015/04/03 PHP
基于JQuery+PHP编写砸金蛋中奖程序
2015/09/08 PHP
Yii2中如何使用modal弹窗(基本使用)
2016/05/30 PHP
php探针使用原理和技巧讲解
2019/09/17 PHP
PHP程序员简单的开展服务治理架构操作详解(一)
2020/05/14 PHP
js对数字的格式化使用说明
2011/01/12 Javascript
jquery监控数据是否变化(修正版)
2011/04/12 Javascript
JS 添加网页桌面快捷方式的代码详细整理
2012/12/27 Javascript
jquery实现ajax提交form表单的方法总结
2014/03/03 Javascript
jquery加载图片时以淡入方式显示的方法
2015/01/14 Javascript
js中json处理总结之JSON.parse
2016/10/14 Javascript
解决拦截器对ajax请求的拦截实例详解
2016/12/21 Javascript
JavaScript中无法通过div.style.left获取值的解决方法
2017/02/19 Javascript
react中fetch之cors跨域请求的实现方法
2018/03/14 Javascript
一文读懂ES7中的javascript修饰器
2019/05/06 Javascript
JS实现小星星特效
2019/12/24 Javascript
vue实现页面切换滑动效果
2020/06/29 Javascript
[16:21]教你分分钟做大人:圣堂刺客
2014/12/03 DOTA
python子线程退出及线程退出控制的代码
2019/10/16 Python
python 6.7 编写printTable()函数表格打印(完整代码)
2020/03/25 Python
PatPat香港:婴童服饰和亲子全家装在线购物
2020/09/27 全球购物
品管员岗位职责
2013/11/10 职场文书
乔迁宴答谢词
2014/01/21 职场文书
采购部部长岗位职责
2014/02/06 职场文书
三严三实学习心得体会
2014/10/13 职场文书
《夜莺的歌声》教学反思
2016/02/22 职场文书
年终工作总结范文
2019/06/20 职场文书
使用Golang的channel交叉打印两个数组的操作
2021/04/29 Golang
Redis缓存-序列化对象存储乱码问题的解决
2021/06/21 Redis
python基础之函数的定义和调用
2021/10/24 Python
MySQL面试题讲解之如何设置Hash索引
2021/11/01 MySQL
nginx内存池源码解析
2021/11/20 Servers
vue实现书本翻页动画效果实例详解
2022/04/08 Vue.js
vue elementUI批量上传文件
2022/04/26 Vue.js