基于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 相关文章推荐
document.all还是document.getElementsByName?
Jul 21 Javascript
jquery实现侧边弹出的垂直导航
Dec 09 Javascript
JavaScript实现下拉列表框数据增加、删除、上下排序的方法
Aug 11 Javascript
深入浅析JavaScript面向对象和原型函数
Feb 06 Javascript
JavaScript学习笔记之数组随机排序
Mar 23 Javascript
Angular4 组件通讯方法大全(推荐)
Jul 12 Javascript
js canvas画布实现高斯模糊效果
Nov 27 Javascript
js实现随机8位验证码
Jul 24 Javascript
VUE实现移动端列表筛选功能
Aug 23 Javascript
javascript 内存模型实例详解
Apr 18 Javascript
浅析微信小程序自定义日历组件及flex布局最后一行对齐问题
Oct 29 Javascript
Vue+Bootstrap实现简易学生管理系统
Feb 09 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
如何删除多级目录
2006/10/09 PHP
sae使用smarty模板的方法
2013/12/17 PHP
php微信公众号开发(4)php实现自定义关键字回复
2016/12/15 PHP
PHP封装的验证码工具类定义与用法示例
2018/08/22 PHP
PHP CURL实现模拟登陆并上传文件操作示例
2020/01/02 PHP
Javascript 获取字符串字节数的多种方法
2009/06/02 Javascript
javascript 设置某DIV区域内的checkbox复选框
2009/11/30 Javascript
jQuery自动切换/点击切换选项卡效果的小例子
2013/08/12 Javascript
javascript 上下banner替换具体实现
2013/11/14 Javascript
jquery高级编程的最佳实践详解
2014/03/23 Javascript
nodejs 的 session 简单使用
2016/06/06 NodeJs
AngularJS前端页面操作之用户修改密码功能示例
2017/03/27 Javascript
微信小程序 后台登录(非微信账号)实例详解
2017/03/31 Javascript
让微信小程序支持ES6中Promise特性的方法详解
2017/06/13 Javascript
nodejs 最新版安装npm 的使用详解
2018/01/18 NodeJs
Vue多种方法实现表头和首列固定的示例代码
2018/02/02 Javascript
详解基于electron制作一个node压缩图片的桌面应用
2019/01/29 Javascript
vue2.0实现列表数据增加和删除
2020/06/17 Javascript
Python基于scrapy采集数据时使用代理服务器的方法
2015/04/16 Python
python逐行读写txt文件的实例讲解
2018/04/03 Python
python读取LMDB中图像的方法
2018/07/02 Python
聊聊python里如何用Borg pattern实现的单例模式
2019/06/06 Python
python批量下载抖音视频
2019/06/17 Python
python 中如何获取列表的索引
2019/07/02 Python
如何安装2019Pycharm最新版本(详细教程)
2019/09/26 Python
Django admin禁用编辑链接和添加删除操作详解
2019/11/15 Python
Python tkinter三种布局实例详解
2020/01/06 Python
pytorch快速搭建神经网络_Sequential操作
2020/06/17 Python
python自动化发送邮件实例讲解
2021/01/04 Python
美国厨房和园艺工具网上商店:Nestneed
2019/08/24 全球购物
Made in Design德国:设计师家具、灯具和装饰
2019/10/31 全球购物
美国艺术和工艺品商店:Hobby Lobby
2020/12/09 全球购物
三好学生自我鉴定
2013/12/17 职场文书
新闻学专业大学生职业生涯规划范文
2014/03/02 职场文书
财务工作失误检讨书
2015/02/19 职场文书
2015年幼儿园保育员工作总结
2015/04/23 职场文书