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圆心如下:
注:.round_right 元素如下:
其中 吸附效果的代码在getAngle中。
转载于:https://www.cnblogs.com/zhuxiaoweb/p/10032323.html
vue实现移动端圆形旋钮插件相关推荐
- animate inater插件_基于animate.css动画库的全屏滚动小插件,适用于vue.js(移动端、pc)项目...
功能简介 基于animate.css动画库的全屏滚动,适用于vue.js(移动端.pc)项目. 安装 npm install vue-animate-fullpage --save 使用 main.j ...
- vue前端对接Hikvision海康威视监控,pc端对接,插件模式
一.简介 1.运行环境 Win7 32/64 位操作系统:32 位 IE10(兼容 64 位 IE10,64 位 IE10 环境下浏览器会默认启动 32 位 IE).32/64 位 IE11.32/6 ...
- Vue动态计算百分比配合vux插件
1.首先进入vux官网中引入插件 XProgress 组件使用教程 | VUX - 基于 WeUI 和 Vue 的移动端组件库https://doc.vux.li/zh-CN/components/x ...
- Java Vue uni-app 三端实现,滑动拼图验证码
一步一步实现 图片滑动验证码 项目中要使用 图片滑动验证码,顾了解之 需要以下几步来完成: 1.后端随机计算抠图的距离,生成背景与拼图块的图片,缓存 拼图块需 滑动的距离像素. 2.前端加载背景图 和 ...
- vue手机端项目php,MintUI基于Vue.js移动端组件库详解
Mint UI 包含丰富的 CSS 和 JS 组件,能够满足日常的移动端开发需要.接下来通过本文给大家分享Mint UI 基于 Vue.js 移动端组件库,需要的朋友参考下吧,希望能帮助到大家. 官网 ...
- vue适配PC端屏幕自适应
vue适配PC端屏幕自适应 1.下载postcss-px2rem和px2rem-loader npm i postcss-px2rem px2rem-loader 2.src目录下新建utils文件夹 ...
- Capacitor+Vue+Vant移动端打包总结
Capacitor+Vue+Vant移动端打包总结 本笔记为打包Vue移动端Android Apk 打包步骤 Capacitor与Vue项目结合基本配置自行百度/谷歌,这里是已集成配置好的项目. 1. ...
- Vuex 数据流管理及Vue.js 服务端渲染(SSR)
Vuex 数据流管理及Vue.js 服务端渲染(SSR)项目见:https://github.com/smallSix6/fed-e-task-liuhuijun/tree/master/fed-e- ...
- vue实现移动端图片预览
vue实现移动端图片预览 1.安装插件 2.main引入 3.使用 注意 扩展 通过使用vue-photo-preview插件,实现移动端图片的预览,全屏等功能. 1.安装插件 npm install ...
最新文章
- 聊一聊我在 B站 上自学编程的经历吧
- 沈向洋博士:三十年科研路,我踩过的七个坑
- MECAT:PC组装人的基因组
- STL初探——构造和析构的基本工具: construct()和destroy()
- svn还原文件中去掉已经删除的文件
- 本地启动 SAP Commerce Cloud(Hybris) 产生的五个 Java 进程
- Java中包装类型和基本类型的使用场景(阿里开发规范)
- 腾讯面试官这样问我二叉树,我刚好都会 | 原力计划
- python脚本案例
- Ruby on Rails,创建模型,附赠模型与表名不一致时的解决方法
- 无法打开预编译头文件的解决方法及预编译头原理[ZZ] 转
- Kafka从上手到实践 - 实践真知:Kafka Java Producer | 凌云时刻
- 西门子S7-200的PLC,CPU224XP的模拟量接线怎样接
- 三千年来激荡人心的名句
- php eval 引号,PHP手册-eval()(可以将单引号中的变量解析)
- SkyLine——3DGIS三维地理信息系统软件产品介绍
- html5 代码画兰博基尼跑车,6不6你说的算!
- Java+Selenium+Junit demo
- 城市应急处置系统实施目标
- 【优化求解】基于自适应模拟退火粒子群优化算法求解单目标优化问题matlab代码