Skip to content

Commit 9cf78b1

Browse files
committed
feat: 微调手势拖拽参数配置,统一配置参数名
1 parent 8811fe1 commit 9cf78b1

File tree

7 files changed

+52
-25
lines changed

7 files changed

+52
-25
lines changed

index.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<head>
44
<meta charset="UTF-8">
55
<meta http-equiv="X-UA-Compatible" content="IE=edge">
6-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
6+
<meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1,user-scalable=0">
77
<meta name="keywords" content="前端,程序员,上网首页,起始页,工具,小组件"/>
88
<meta name="description" content="前端上网首页,程序员摸鱼起始页,剧中人的个人上网首页。"/>
99
<title>小剧起始页</title>

src/App.vue

+11-2
Original file line numberDiff line numberDiff line change
@@ -125,18 +125,27 @@ textarea
125125
</template>
126126

127127
<script lang="ts">
128-
import { ref } from 'vue'
128+
import { onUnmounted, ref } from 'vue'
129129
import Gallery from '@/components/gallery.vue'
130130
import SearchEntrance from '@/components/search-entrance.vue'
131131
import BookmarkDesktop from '@/components/bookmark-desktop.vue'
132132
import Settings from '@/components/settings/index.vue'
133133
import LogoAbout from '@/components/logo-about/index.vue'
134-
135134
import EasyRouter from '@/components/easy-router.vue'
135+
136136
export default {
137137
components: { Gallery, SearchEntrance, BookmarkDesktop, LogoAbout, Settings, EasyRouter },
138138
setup() {
139139
const focused = ref(false)
140+
141+
// 阻止双指放大
142+
function preventPageZoom(event: Event) {
143+
event.preventDefault()
144+
}
145+
document.addEventListener('gesturestart', preventPageZoom)
146+
onUnmounted(() => {
147+
document.removeEventListener('gesturestart', preventPageZoom)
148+
})
140149
return {
141150
focused,
142151
}

src/assets/ts/drag-handle.ts

+11-11
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ export type dragOptions = {
1313
move: (a: dragParams) => void;
1414
end: (a: dragParams) => void;
1515
cancel?: () => void;
16-
mouseStableDistance: number;
16+
mouseStableDistance?: number;
1717
touchStableDistance?: number;
18-
touchHoldTime?: number;
18+
touchStableTime?: number;
1919
};
2020
export type dragParams = {
2121
clientX: number;
@@ -57,7 +57,7 @@ function getParamFromTouchEvent(event: TouchEvent, startX: number, startY: numbe
5757
}
5858
export function mouseDragHandle(originEvent: MouseEvent | TouchEvent, options?: dragOptions) {
5959
const event = originEvent as MouseEvent
60-
const { beforeStart, start, move, end, cancel, mouseStableDistance } = options || {}
60+
const { beforeStart, start, move, end, cancel, mouseStableDistance = 20 } = options || {}
6161
// 非左键不处理
6262
if (event.button !== 0) {
6363
cancel && cancel()
@@ -105,7 +105,7 @@ export function mouseDragHandle(originEvent: MouseEvent | TouchEvent, options?:
105105

106106
export function touchDragHandle(originEvent: MouseEvent | TouchEvent, options?: dragOptions) {
107107
const event = originEvent as TouchEvent
108-
const { beforeStart, start, move, end, cancel, touchHoldTime = 300, touchStableDistance = 50 } = options || {}
108+
const { beforeStart, start, move, end, cancel, touchStableTime = 240, touchStableDistance = 20 } = options || {}
109109
const touches = event.touches || []
110110
const targetNode = event.target
111111
if (touches.length !== 1 || !targetNode) {
@@ -124,16 +124,15 @@ export function touchDragHandle(originEvent: MouseEvent | TouchEvent, options?:
124124
start && start(startX, startY)
125125
const param = getParamFromTouchEvent(event, startX, startY)
126126
move && move(param)
127-
}, touchHoldTime)
127+
}, touchStableTime)
128128
function touchMove(originEvent: Event) {
129129
const event = originEvent as TouchEvent
130130
const param = getParamFromTouchEvent(event, startX, startY)
131-
if (!hasTriggerStartEvent && Math.sqrt(param.xOffset * param.xOffset + param.yOffset * param.yOffset) >
132-
touchStableDistance) {
133-
touchCancel()
134-
return
135-
}
136131
if (!hasTriggerStartEvent) {
132+
const moveDistance = Math.sqrt(param.xOffset * param.xOffset + param.yOffset * param.yOffset)
133+
if (moveDistance > touchStableDistance) {
134+
touchCancel()
135+
}
137136
return
138137
}
139138
event.stopPropagation && event.stopPropagation()
@@ -167,8 +166,9 @@ export function touchDragHandle(originEvent: MouseEvent | TouchEvent, options?:
167166
targetNode.addEventListener('touchcancel', touchCancel, listenerConfig)
168167
}
169168

169+
export const supportTouch = 'ontouchend' in document
170170
export default function (event: MouseEvent | TouchEvent, options?: dragOptions) {
171-
if ('ontouchend' in document) {
171+
if (supportTouch) {
172172
touchDragHandle(event, options)
173173
} else {
174174
mouseDragHandle(event, options)

src/components/draged-layer.vue

+26-6
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@
2121
position absolute
2222
width 40px
2323
height 40px
24-
margin -10px 0 0 -10px
24+
transform translate(-50%, -50%)
2525
border-radius 4px
26-
background #333
26+
background #2196f3
2727
box-shadow 1px 1px 2px rgba(0, 0, 0, 0.2),2px 2px 20px rgba(0, 0, 0, 0.2)
2828
.trash-area
2929
position absolute
@@ -96,14 +96,20 @@
9696
transform scale(1.25)
9797
background #4d636f
9898
color #bac8cf
99+
.touch-mode
100+
.draged-shadow
101+
width 80px
102+
height 80px
103+
border-radius 20px
104+
opacity .5
99105
</style>
100106

101107
<template>
102108
<teleport to="#v-ui">
103109
<transition name="fade-fast">
104110
<div
105111
v-if="isStableStart"
106-
class="draged-layer"
112+
:class="['draged-layer', supportTouch ? 'touch-mode' : '']"
107113
>
108114
<div
109115
:class="{
@@ -151,6 +157,18 @@
151157
background: dragedBookmark.undercoat,
152158
}"
153159
/>
160+
<!-- <div
161+
v-for="item in gridTestData"
162+
:key="item.id"
163+
:style="{
164+
position: 'absolute',
165+
top: item.top + 'px',
166+
left: item.left + 'px',
167+
width: (item.right - item.left) + 'px',
168+
height: item.bottom - item.top + 'px',
169+
border: '1px solid red',
170+
}"
171+
/> -->
154172
</div>
155173
</transition>
156174
</teleport>
@@ -159,7 +177,7 @@
159177
<script lang="ts">
160178
import { ref, getCurrentInstance, Ref, ComponentInternalInstance } from 'vue'
161179
import { getAppConfigItem } from '@/assets/ts/app-config'
162-
import dragHandle from '@/assets/ts/drag-handle'
180+
import dragHandle, { supportTouch } from '@/assets/ts/drag-handle'
163181
import { Bookmark, BookmarkSize } from '@database/entity/bookmark'
164182
type mapItem = {
165183
id: string,
@@ -328,6 +346,7 @@ export default {
328346
const isStableStart = ref(false)
329347
const clientX = ref(0)
330348
const clientY = ref(0)
349+
// const gridTestData: Ref<mapItem[]> = ref([])
331350
const gridGap = getAppConfigItem('gridGap') as number
332351
const shadowRectStyle = ref({
333352
top: '',
@@ -341,12 +360,11 @@ export default {
341360
let itemSizeAndPositionMap: mapItem[] = []
342361
343362
dragHandle(props.event, {
344-
mouseStableDistance: 20,
345363
start() {
346364
context.emit('beforeDrag')
347365
isStableStart.value = true
348366
itemSizeAndPositionMap = getItemListMap(internalInstance)
349-
// console.log('itemSizeAndPositionMap', itemSizeAndPositionMap)
367+
// gridTestData.value = itemSizeAndPositionMap
350368
},
351369
move(params) {
352370
const triggered = getMouseTriggered(
@@ -450,6 +468,8 @@ export default {
450468
},
451469
})
452470
return {
471+
// gridTestData,
472+
supportTouch,
453473
clientX,
454474
clientY,
455475
isStableStart,

src/components/private-bookmarks/main-draged-layer.vue

-1
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,6 @@ export default {
247247
let sideRectList: mapItem[] = []
248248
249249
dragHandle(props.event, {
250-
mouseStableDistance: 20,
251250
start() {
252251
context.emit('beforeDrag')
253252
isStableStart.value = true

src/ui-lib/components/v-slider.vue

-1
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,6 @@ export default {
195195
}
196196
197197
const dragOption: dragOptions = {
198-
mouseStableDistance: 20,
199198
beforeStart() {
200199
const trackNode = trackRef.value
201200
if (trackNode === null) {

src/ui-lib/directives/drag.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import { App as Application } from 'vue'
2-
import { mouseDragHandle, touchDragHandle } from '@/assets/ts/drag-handle'
2+
import { supportTouch, mouseDragHandle, touchDragHandle } from '@/assets/ts/drag-handle'
33

44
export default {
55
install(app: Application) {
66
app.directive('drag', {
77
mounted (el: HTMLElement, binding) {
88
const bindingValue = typeof binding.value === 'object' ? binding.value : {}
99
const triggerElement = el
10-
if ('ontouchend' in document) {
10+
if (supportTouch) {
1111
triggerElement.addEventListener('touchstart', (event: TouchEvent) => {
1212
touchDragHandle(event, bindingValue)
1313
})
@@ -21,7 +21,7 @@ export default {
2121
app.directive('drag-start', {
2222
mounted (el: HTMLElement, binding) {
2323
const triggerElement = el
24-
if ('ontouchend' in document) {
24+
if (supportTouch) {
2525
triggerElement.addEventListener('touchstart', (event: TouchEvent) => {
2626
if (typeof binding.value === 'function') {
2727
binding.value(event)

0 commit comments

Comments
 (0)