123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- <template>
- <view style="flex: 1;">
- <page-head title="横向滑动时阻止默认事件,即阻止页面滚动"></page-head>
- <view class="uni-padding-wrap uni-common-mt" style="height: 40px; align-items: center;">
- <text>手势方向:{{direction}}</text>
- </view>
- <scroll-view style="flex: 1;" @scroll="onScroll">
- <view v-for="item in 120" :key="item" class="box" @touchstart="touchstart" @touchmove="touchmove" @touchend="touchend">
- {{item}}
- </view>
- </scroll-view>
- </view>
- </template>
- <script setup>
- const scrollTop = reactive({
- value: 0
- })
- defineExpose({
- scrollTop
- })
- function getDirection(x : number, y : number) {
- if (x > y && x > 10) {
- return 'horizontal';
- }
- if (y > x && y > 10) {
- return 'vertical';
- }
- return '';
- }
- const startX = ref(0)
- const startY = ref(0)
- const direction = ref("")
- function touchstart(e : UniTouchEvent) {
- direction.value = ""
- startX.value = e.touches[0].clientX
- startY.value = e.touches[0].clientY
- }
- function touchend(e : UniTouchEvent) {
- console.log('>>>>> touchend')
- direction.value = ""
- }
- function touchmove(e : UniTouchEvent) {
- const deltaX = e.touches[0].clientX - startX.value
- const deltaY = e.touches[0].clientY - startY.value
- if (direction.value == "") {
- direction.value = getDirection(Math.abs(deltaX), Math.abs(deltaY))
- }
- //只有横向滑动时才阻止默认事件,即阻止页面滚动
- if (direction.value != 'horizontal') {
- return
- }
- if (e.cancelable) {
- e.preventDefault()
- }
- }
- function onScroll(e: UniScrollEvent) {
- console.log('>>>>> onScroll', e.detail.scrollTop)
- scrollTop["value"] = e.detail.scrollTop
- }
- </script>
- <style scoped>
- .box {
- border-bottom: 1px solid #c6d1c3;
- padding: 16px 10px;
- }
- </style>
|