123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- <template>
- <div >
- <div class="help" v-drag="isMove">
- <div @click="feedback">
- <span>
- <i class="iconfont icon-yijianfankui"></i>
- </span>
- <span>意见反馈</span>
- </div>
- <div @click="guide" class="help-guid">
- <span>
- <i class="iconfont icon-xinshouzhiyin"></i>
- </span>
- <span>新手指引</span>
- </div>
- </div>
- <feedback ref="feedback"></feedback>
- </div>
- </template>
- <script>
- import feedback from './dialog/feedback.vue';
- import { guide } from "./guide";
- export default {
- mixins:[guide],
- components: {
- feedback
- },
- props: {},
- data() {
- return {
- move:false,
- };
- },
- //注册局部组件指令
- directives: {
- drag: function (el,data,vnode) {
- let dragBox = el; //获取当前元素
- let clientHeight = document.documentElement.clientHeight
- dragBox.onmousedown = e => {
- //算出鼠标相对元素的位置
- var start = dragBox.offsetTop
- var height = dragBox.offsetHeight
- var startY = e.clientY
- document.onmousemove = e => {
- if ( e.stopPropagation ) {
- e.stopPropagation()
- }
- if ( e.preventDefault ) {
- e.preventDefault()
- }
- var moveY = e.clientY - startY
- var bottom = 50
- if(moveY < 0){
- bottom = clientHeight - start - height + Math.abs(moveY)
- if(bottom - height > clientHeight - 200){
- bottom = clientHeight - 100
- }
- }else{
- bottom = clientHeight - start - height - Math.abs(moveY)
- if(bottom < 50){
- bottom = 50
- }
- }
- dragBox.style.bottom = bottom + 'px'
- };
- document.onmouseup = e2 => {
- //鼠标弹起来的时候不再移动
- document.onmousemove = null;
- //预防鼠标弹起来后还会循环(即预防鼠标放上去的时候还会移动)
- document.onmouseup = null;
- if ( startY == e2.clientY ) {
- data.value(true)
- }else{
- data.value(false)
- }
- };
- };
- }
- },
-
- watch: {},
- computed: {},
- created() {},
- mounted() {},
- methods: {
- //是否移动
- isMove(val){
- this.move = val
- },
- //意见反馈
- feedback(){
- if(this.move){
- this.$refs.feedback.open()
- }
- },
- //新手指引
- guide(){
- if(this.move){
- //开始新手指引(title:当前路由标识,arr:需要展示的指引步骤,userinfo:用户信息)
- this.startGuide(this.$route.meta.sign)
- }
- },
- },
- };
- </script>
- <style lang="scss">
- @keyframes moveX {
- to{
- transform: translateX(var(--x));
- }
- }
- @keyframes moveY {
- to{
- transform: translateY(var(--y));
- }
- }
- .plus{
- position:fixed;
- top:var(--top);
- left: var(--left);
- width: 30px;
- height: 30px;
- border-radius: 50%;
- cursor: pointer;
- z-index: 99999999;
- animation: moveY .8s cubic-bezier(0.5,-0.5,1,1);
- }
- .plus-icon{
- height: 100%;
- width: 100%;
- background-color: #5151e7;
- border-radius: 50%;
- z-index: 99999999;
- animation: moveX .8s linear;
- }
- // .plus-icon::before{
- // content: '';
- // position: absolute;
- // left: 50%;
- // top: 3;
- // width: 4px;
- // height: 24px;
- // margin-left: -2px;
- // background-color: #fff;
- // border-radius: 8px;
- // }
- // .plus-icon::after{
- // content: '';
- // position: absolute;
- // left: 3px;
- // top: 50%;
- // width: 24px;
- // height: 4px;
- // margin-top: -2px;
- // background-color: #fff;
- // border-radius: 8px;
- // }
- </style>
- <style lang="scss" scoped>
- .help{
- background: white;
- z-index: 999;
- border:3px solid var(--color1);
- border-right: none;
- width: 35px;
- height: auto;
- white-space: nowrap;
- border-radius: 5px 0 0 10px;
- position: fixed;
- right: 0;
- bottom:50px;
- div{
- border-bottom: 1px solid var(--color1);
- padding: 5px 0;
- }
- div:last-child{
- border-bottom: none;
- }
- span{
- color: var(--color1);
- font-family: var(--fm);
- font-size: 14px;
- font-weight: bold;
- margin-left:10px;
- cursor: pointer;
- }
- i{
- font-size: 20px;
- }
- }
- .help:hover{
- width: 100px;
- i{
- font-size: 14px;
- }
- }
- </style>
|