应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

vue自定义组件实现右下角悬浮工具栏。vue实现可以拖动的右下角悬浮菜单。点击悬浮菜单,弹出一个自定义的弹窗组件,组件传参。vue模板

9883人阅读 2020/9/10 10:19 总访问:5182861 评论:0 收藏:0 手机
分类: 前端

创建一个可以拖动的自定义指令

创建拖拽代码放到/src/common/drag.js,位置根据自己的情况随便放。代码如下。

  1. // 实现拖动的js
  2. import Vue from 'vue';
  3. Vue.directive('drag', {
  4. bind: function (el) {
  5. const odiv = el;
  6. // 缓存 clientX clientY 的对象: 用于判断是点击事件还是移动事件
  7. const clientOffset = {};
  8. odiv.style.position = 'fixed';
  9. odiv.onmousedown = (e) => {
  10. const disX = e.clientX - odiv.offsetLeft;
  11. const disY = e.clientY - odiv.offsetTop;
  12. // 缓存 clientX clientY
  13. clientOffset.clientX = e.clientX;
  14. clientOffset.clientY = e.clientY;
  15. document.onmousemove = (e) => {
  16. const left = e.clientX - disX;
  17. const top = e.clientY - disY;
  18. odiv.style.left = left + 'px';
  19. odiv.style.top = top + 'px';
  20. // odiv 距离顶部的距离
  21. const dragDivTop = window.innerHeight - odiv.getBoundingClientRect().height;
  22. // odiv 距离左部的距离
  23. const dragDivLeft = window.innerWidth - odiv.getBoundingClientRect().width;
  24. // 边界判断处理
  25. // 2、超出顶部处理
  26. if (odiv.getBoundingClientRect().top <= 0) {
  27. odiv.style.top = '0px';
  28. }
  29. // 3、超出底部处理
  30. if (odiv.getBoundingClientRect().top >= dragDivTop) {
  31. odiv.style.top = dragDivTop + 'px';
  32. }
  33. // 4、超出右边边界区域处理
  34. if (odiv.getBoundingClientRect().left >= dragDivLeft) {
  35. odiv.style.left = dragDivLeft + 'px';
  36. }
  37. // 5、超出左边边界区域处理
  38. if (odiv.getBoundingClientRect().left <= 0) {
  39. odiv.style.left = '0px';
  40. }
  41. };
  42. document.onmouseup = () => {
  43. document.onmousemove = null;
  44. document.onmouseup = null;
  45. };
  46. };
  47. // 绑定鼠标松开事件
  48. odiv.addEventListener('mouseup', (event) => {
  49. const clientX = event.clientX;
  50. const clientY = event.clientY;
  51. if (clientX === clientOffset.clientX && clientY === clientOffset.clientY) {
  52. return false
  53. // console.log('click 事件');
  54. } else {
  55. return false
  56. // console.log('drag 事件');
  57. }
  58. })
  59. }
  60. });

在main.js里面引入

  1. import "./common/drag.js";

这样引用后就可以自定义的全局使用v-drag指令了

然后创建vue文件添加内容

  1. <template>
  2. <div>
  3. <!-- 悬浮菜单开始 -->
  4. <div class="realTranslationInfos" v-drag>
  5. <div class="RealtranslationBox">
  6. <img draggable="false" @click="openFeedbackDialog()" src="@/assets/imgs/labroom/feedback.png" alt=""
  7. width="66px" height="66px">
  8. </div>
  9. </div>
  10. <!-- 悬浮菜单结束 -->
  11. </div>
  12. </template>
  13. <script>
  14. export default {
  15. // 组件名字
  16. name: 'FeedBack',
  17. // 组件参数
  18. props: {
  19. id: {
  20. type: String,
  21. default: ''
  22. },
  23. index: {
  24. type: Number,
  25. default: 0
  26. },
  27. },
  28. data() {
  29. return {
  30. }
  31. },
  32. mounted() {
  33. },
  34. // 组件方法
  35. methods: {
  36. openFeedbackDialog() {
  37. }
  38. }
  39. }
  40. </script>
  41. <style scoped="scoped" lang="scss">
  42. .realTranslationInfos {
  43. width: 66px;
  44. height: 66px;
  45. // background: red;
  46. position: fixed;
  47. // position: absolute;
  48. bottom: 56px;
  49. right: 20px;
  50. // bottom: 122px;
  51. // right: -30px;
  52. .translationContent {
  53. min-height: 100px;
  54. line-height: 23px;
  55. width: 338px;
  56. padding: 18px 74px 19px 19px;
  57. background: #004CB3;
  58. opacity: 0.80;
  59. border-radius: 12px;
  60. color: #fff;
  61. position: fixed;
  62. // position: absolute;
  63. right: 58px;
  64. bottom: 22px;
  65. z-index: 99999;
  66. }
  67. .RealtranslationBox {
  68. display: flex;
  69. align-items: center;
  70. position: absolute;
  71. right: 2px;
  72. bottom: 5px;
  73. z-index: 99999;
  74. img {
  75. cursor: pointer;
  76. }
  77. }
  78. }
  79. </style>

然后在需要使用封装的悬浮组件的页面引用一下即可

  1. <template>
  2. <div class="app-container learining-lab">
  3. ...........
  4. <FeedBack/>
  5. </div>
  6. </template>
  7. <script>
  8. import FeedBack from '@/pages/feedback/feedback.vue'
  9. export default {
  10. components: {
  11. FeedBack
  12. },
  13. ........
  14. }
  15. </script>

然后就会在右下角出现悬浮菜单了,而且可以拖动。如图右下角悬浮的用户反馈,这里就是简单的显示一个图标,也可以根据需求做复杂一点。

点击悬浮菜单,弹出一个自定义的弹窗组件

参考另外一篇博文,直接搜索:elmentui 弹窗,自定义样式


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

vue.js+Layer实现表格数据绑定与更新

一:使用Vue.js绑定好数据与更新事件 使用v-on绑定好事件,在事件里边直接把该行数据传递进去,在更新方法里边就可以直接...

vue.js 实现省市联动

HTML代码&lt;divid=&quot;pro_citys&quot;&gt; 省:&lt;selectid=&quot;provice&quot;v-on:change=&quot;prochange()&quo...

vue.js常见问题

一:花括号当做字符串显示的问题1:检查下绑定到vue.js的id是否重复,如果id重复了,就有可能存在这种问题,因为有可能把数...

vue.js常用指令

v-html可以把字符串当成一个html来渲染,而不是原样输出Html类似.net mvc中的@Html.Raw()方法&lt;divv-html=&quot;item.tit...

干货!div滚动到一定位置就固定他vue中实现一侧滚动到底部就固定

尊重原创:转载请注名出处div滚动到一定位置就固定他,例如左边的内容很多,右边的内容很少,如果不处理滚动到一定位置后右...

vue.js常用指令事件绑定等vue过滤器解析状态过滤器多个参数vue表格状态解析vue解析类型element ui解析类型状态el-tag

按照html的编码显示:v-html&lt;div class=&quot;font_info&quot; v-html=&quot;item.Content&quot;&gt;{{item.Content}}&l...

vue.js if用法

vue.js if可以做一些判断例如我们要把下面这个输出varvm=newVue({ el:&quot;#content&quot;, data:{ titles:[&quot;小明...

vue.js 学习日记第一章-安装vue开发环境

官网:https://cn.vuejs.org/v2/guide/ 这是一篇学习性文章,不定时更新,用来记录我学习vue.js的过程。 首先,是v...

vue.js 学习日记第二章-在vue中编写function及一些简单指令

官网:https://cn.vuejs.org/v2/guide/ vue.js 学习日记第一章:http://www.tnblog.net/18323015640/article/details/2...

vue.js 学习日记第三章-vue中的简单事件及事件修饰符

官网:https://cn.vuejs.org/v2/guide/ vue.js 学习日记第二章:http://www.tnblog.net/18323015640/article/details/2...

vue.js 学习日记第四章-vue中文本框数据获取与绑定及computed计算属性

官网:https://cn.vuejs.org/v2/guide/ vue.js学习日记第三章: http://www.tnblog.net/18323015640/article/details/2...

vue.js 学习日记第五章-v-if和v-for指令的使用方式

官网:https://cn.vuejs.org/v2/guide/ vue.js学习日记第四章: http://www.tnblog.net/18323015640/article/details/2...

vue.js 学习日记第六章-vue组件初步学习

官网:https://cn.vuejs.org/v2/guide/ vue.js学习日记第五章: http://www.tnblog.net/18323015640/article/details/2...

vue.js学习日记第七章-搭建脚手架

官网:https://cn.vuejs.org/v2/guide/ vue.js学习日记第六章: http://www.tnblog.net/18323015640/article/details/2...

vue实现好友选中效果

逛过vue官网肯定会发现一个有趣的指令“v-for”,相比与以前拼接html代码确实要上档次一点,而且减少了工作量,先看一波效...

js时间格式化vue.js时间格式化带T 时间格式化

也可以借助moment库, 参考:https://www.tnblog.net/aojiancc2/article/details/8079moment库有点大,推荐可以使用day.js...