基于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 相关文章推荐
jQuery文本框(input textare)事件绑定方法教程
Apr 24 Javascript
Javascript 按位左移运算符使用介绍(
Feb 04 Javascript
jQuery实现级联菜单效果(仿淘宝首页菜单动画)
Apr 10 Javascript
javascript下拉框选项单击事件的例子分享
Mar 04 Javascript
js实现每日自动换一张图片的方法
May 04 Javascript
jquery实现漫天雪花飞舞的圣诞祝福雪花效果代码分享
Aug 20 Javascript
基于jquery二维码生成插件qrcode
Jan 07 Javascript
微信小程序 Toast自定义实例详解
Jan 20 Javascript
Node.js pipe实现源码解析
Aug 12 Javascript
vue 解决addRoutes动态添加路由后刷新失效问题
Jul 02 Javascript
解决layui中的form表单与button的点击事件冲突问题
Aug 15 Javascript
ES6 async、await的基本使用方法示例
Jun 06 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中实现接收多个name相同但Value不相同表单数据实例
2015/02/03 PHP
php版微信发红包接口用法示例
2016/09/23 PHP
thinkPHP中钩子的两种配置调用方法详解
2016/11/11 PHP
用JavaScript页面不刷新时全选择,全删除(GridView)
2009/04/14 Javascript
jQuery Select(单选) 模拟插件 V1.3.62 改进版
2010/07/17 Javascript
Jvascript学习实践案例(开发常用)
2012/06/25 Javascript
javascript实现点击商品列表checkbox实时统计金额的方法
2015/05/15 Javascript
jQuery自制提示框tooltip改进版
2016/08/01 Javascript
jquery的checkbox,radio,select等方法小结
2016/08/30 Javascript
你真的了解BOM中的history对象吗
2017/02/13 Javascript
JS简单验证上传文件类型的方法
2017/04/17 Javascript
Js利用prototype自定义数组方法示例
2017/10/20 Javascript
浅谈Vue.js路由管理器 Vue Router
2018/08/16 Javascript
让Vue响应Map或Set的变化操作
2020/11/11 Javascript
[02:09]2018DOTA2亚洲邀请赛TNC赛前采访
2018/04/04 DOTA
[43:26]完美世界DOTA2联赛PWL S2 Forest vs Rebirth 第二场 11.20
2020/11/23 DOTA
tornado框架blog模块分析与使用
2013/11/21 Python
Flask框架实现的前端RSA加密与后端Python解密功能详解
2019/08/13 Python
Python中顺序表原理与实现方法详解
2019/12/03 Python
python绘制雪景图
2019/12/16 Python
python通过文本在一个图中画多条线的实例
2020/02/21 Python
Selenium元素定位的30种方式(史上最全)
2020/05/11 Python
Python txt文件常用读写操作代码实例
2020/08/03 Python
Python数据分析库pandas高级接口dt的使用详解
2020/12/11 Python
巴西网上药店:Drogaria Araujo
2021/01/06 全球购物
敬老文明号事迹材料
2014/01/16 职场文书
市场营销专业应届生自荐信
2014/06/19 职场文书
创优争先心得体会
2014/09/11 职场文书
献爱心大型公益活动策划方案
2014/09/15 职场文书
2015年医院药剂科工作总结
2015/05/04 职场文书
初婚初育证明范本
2015/06/18 职场文书
我的生日感言
2015/08/03 职场文书
2016入党积极分子考察评语
2015/12/01 职场文书
2019新员工心得体会
2019/06/25 职场文书
解读MySQL的客户端和服务端协议
2021/05/10 MySQL
python 标准库原理与用法详解之os.path篇
2021/10/24 Python