基于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 相关文章推荐
Div Select挡住的解决办法
Aug 07 Javascript
js 获取服务器控件值的代码
Mar 05 Javascript
jquery 选项卡效果 新手代码
Jul 08 Javascript
jQuery使用animate创建动画用法实例
Aug 07 Javascript
jquery判断复选框选中状态以及区分attr和prop
Dec 18 Javascript
JavaScript 浏览器兼容性总结及常用浏览器兼容性分析
Mar 30 Javascript
Node.js v8.0.0正式发布!看看带来了哪些主要新特性
Jun 02 Javascript
Django使用多数据库的方法
Sep 06 Javascript
Vue中使用webpack别名的方法实例详解
Jun 19 Javascript
利用jquery和BootStrap实现动态滚动条效果
Dec 03 jQuery
JS实现使用POST方式发送请求
Aug 30 Javascript
JavaScript this在函数中的指向及实例详解
Oct 14 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
全国FM电台频率大全 - 25 云南省
2020/03/11 无线电
php设置静态内容缓存时间的方法
2014/12/01 PHP
PHP函数shuffle()取数组若干个随机元素的方法分析
2016/04/02 PHP
发现的以前不知道的函数
2006/09/19 Javascript
经常用的图片在容器中的水平垂直居中实例
2007/06/10 Javascript
javascript中substr,substring,slice.splice的区别说明
2010/11/25 Javascript
很棒的学习jQuery的12个网站推荐
2011/04/28 Javascript
点弹代码 点击页面任何位置都可以弹出页面效果代码
2012/09/17 Javascript
多种方法判断Javascript对象是否存在
2013/09/22 Javascript
javascript中的变量作用域以及变量提升详细介绍
2013/10/24 Javascript
jQuery中extend函数详解
2015/07/13 Javascript
javascript实现移动端上的触屏拖拽功能
2016/03/04 Javascript
setTimeout学习小结
2017/02/08 Javascript
JS二分查找算法详解
2017/11/01 Javascript
jQuery中$原理实例分析
2018/08/13 jQuery
javascript开发实现贪吃蛇游戏
2020/07/31 Javascript
React冒泡和阻止冒泡的应用详解
2020/08/18 Javascript
JavaScript 实现下雪特效的示例代码
2020/09/09 Javascript
js canvas实现五子棋小游戏
2021/01/22 Javascript
Anaconda多环境多版本python配置操作方法
2017/09/12 Python
基于python 处理中文路径的终极解决方法
2018/04/12 Python
python 获取当天凌晨零点的时间戳方法
2018/05/22 Python
Python操作word常见方法示例【win32com与docx模块】
2018/07/17 Python
Python设计模式之享元模式原理与用法实例分析
2019/01/11 Python
Python文件操作中进行字符串替换的方法(保存到新文件/当前文件)
2019/06/28 Python
Python3.5 win10环境下导入kera/tensorflow报错的解决方法
2019/12/19 Python
Python使用turtle库绘制小猪佩奇(实例代码)
2020/01/16 Python
CSS实现聊天气泡效果
2020/04/26 HTML / CSS
CSS3新增布局之: flex详解
2020/06/18 HTML / CSS
使用canvas压缩图片大小的方法示例
2019/08/02 HTML / CSS
美国球鞋寄卖网站:Stadium Goods
2018/05/09 全球购物
小学教师学期末自我评价
2013/09/25 职场文书
《桃林那间小木屋》教学反思
2014/05/01 职场文书
运动会开幕式新闻稿
2015/07/17 职场文书
人民调解协议书
2016/03/21 职场文书
Navicat连接MySQL错误描述分析
2021/06/02 MySQL