123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- <template>
- <view>
- <view
- id="_drag_button"
- class="drag"
- :style="'left: ' + left + 'px; top:' + top + 'px;'"
- @touchstart="touchstart"
- @touchmove.stop.prevent="touchmove"
- @touchend="touchend"
- @click.stop.prevent="click"
- :class="{transition: isDock && !isMove }"
- >
- <slot></slot>
- </view>
- </view>
- </template>
- <script>
- export default {
- name: 'drag-button',
- props: {
- isDock:{
- type: Boolean,
- default: true
- },
- existTabBar:{
- type: Boolean,
- default: false
- }
- },
- data() {
- return {
- top:1000,
- left:1000,
- width: 0,
- height: 0,
- offsetWidth: 0,
- offsetHeight: 0,
- windowWidth: 0,
- windowHeight: 0,
- isMove: false,
- edge: 10,
- }
- },
- mounted() {
- const sys = uni.getSystemInfoSync();
-
- this.windowWidth = sys.windowWidth;
- this.windowHeight = sys.windowHeight;
-
- this.existTabBar && (this.windowHeight -= 80);
- if (sys.windowTop) {
- this.windowHeight += sys.windowTop;
- }
- // console.log(sys)
-
- const query = uni.createSelectorQuery().in(this);
- query.select('#_drag_button').boundingClientRect(data => {
- this.width = data.width;
- this.height = data.height;
- this.offsetWidth = data.width / 2;
- this.offsetHeight = data.height / 2;
- this.left = this.windowWidth - this.width+4;
- this.top = this.windowHeight - this.height - this.edge;
- }).exec();
- },
- methods: {
- click() {
- this.$emit('btnClick');
- },
- touchstart(e) {
- this.$emit('btnTouchstart');
- },
- touchmove(e) {
- // 单指触摸
- if (e.touches.length !== 1) {
- return false;
- }
-
- this.isMove = true;
-
- this.left = e.touches[0].clientX - this.offsetWidth;
-
- let clientY = e.touches[0].clientY - this.offsetHeight;
- // #ifdef H5
- clientY += this.height;
- // #endif
- let edgeBottom = this.windowHeight - this.height - this.edge;
- // 上下触及边界
- if (clientY < this.edge) {
- this.top = this.edge;
- } else if (clientY > edgeBottom) {
- this.top = edgeBottom;
- } else {
- this.top = clientY
- }
- },
- touchend(e) {
- if (this.isDock) {
- let edgeRigth = this.windowWidth - this.width;
-
- if (this.left < this.windowWidth / 2 - this.offsetWidth) {
- this.left = -4;
- } else {
- this.left = edgeRigth+4;
- }
-
- }
-
- this.isMove = false;
-
- this.$emit('btnTouchend');
- },
- }
- }
- </script>
- <style lang="scss">
- .drag {
- display: flex;
- justify-content: center;
- align-items: center;
- // background-color: rgba(0, 0, 0, 0.5);
- // box-shadow: 0 0 6upx rgba(0, 0, 0, 0.4);
- // color: $uni-text-color-inverse;
- min-width: 80upx;
- min-height: 80upx;
- // border-radius: 50%;
- // font-size: $uni-font-size-sm;
- position: fixed;
- z-index: 99;
-
- &.transition {
- transition: left .3s ease,top .3s ease;
- }
- }
-
- </style>
|