Based on Vue and native javascript encapsulation, pull-down refresh and pull-up loading components are provided for your reference. The specific contents are as follows
The component code is as follows <template> <div class="refresh" id="refresh"> <slot name="upTilte"></slot> <slot></slot> <slot name="downTilte"></slot> </div> </template> <script> export default { name: 'PullupOrPulldownRefresh', props: { // Maximum moving distance maxMove: { type: Number, default: 300 }, // Damping coefficient friction: { type: Number, default: 0.3 } }, data() { return { startY: 0, ul: null, draw: null, up: null, down: null, y: 0 // Inertial rebound distance} }, mounted() { this.$nextTick(() => { this.draw = document.getElementById('refresh') this.ul = this.draw.children[1] this.up = this.draw.children[0] this.down = this.draw.children[2] this.draw.addEventListener('touchstart', this.touchstart) this.draw.addEventListener('touchmove', this.touchmoveEvent) this.draw.addEventListener('touchend', this.touchendEvent) }) }, methods: { // Touch start event touchstart(event) { this.startY = event.changedTouches[0].clientY }, // Touch move event touchmoveEvent(event) { const height = this.ul.clientHeight - this.draw.clientHeight if (height === this.draw.scrollTop || this.draw.scrollTop === 0) { var a = event.changedTouches[0].clientY - this.startY this.y = a <= this.maxMove ? a : this.maxMove // In order to eliminate the lag problem, you need to clear the transition effect this.ul.style.transition = 'none' this.ul.style.transform = 'translateY(' + this.friction * this.y + 'px)' // Modify status const upHeight = -this.up.clientHeight + this.friction * this.y // Pull down to start if (this.friction * this.y > 0) (this.setStatus(this.friction * this.y), this.up.style.transition = 'none', this.up.style.transform = 'translateY(' + upHeight + 'px) translateX(-50%)') // Pull up and start if (this.friction * this.y < 0) (this.setStatus(this.friction * this.y), this.down.style.transition = 'none', this.down.style.marginTop = this.friction * this.y + 'px') } }, // Touch end event touchendEvent(event) { if (this.friction * this.y >= 50) this.$emit('RefreshUp', this.friction * this.y) else if (this.friction * this.y < -50) this.$emit('RefreshDown', this.friction * this.y) else this.resetStyle() }, // Reset and add transition effects resetStyle() { this.ul.style.transition = 'transform .6s' this.ul.style.transform = 'translateY(' + 0 + 'px)' this.up.style.transition = 'all .6s' this.up.style.transform = 'translateY(-' + this.up.clientHeight + 'px) translateX(-50%)' this.down.style.transition = 'all .6s' this.down.style.marginTop = -this.down.clientHeight + 'px' }, // Set the refresh status setStatus(y) { this.$emit('setStatus', y) } } } </script> <style lang="scss"> .refresh { width: 100%; height: 100vh; border: 2px solid #ccc; position: relative; overflow: hidden; overflow:auto; position: fixed; ul { zoom: 1; padding: 0 10%; } ul::after { content: ''; display: block; visibility: hidden; height: 0; clear: both; } li { list-style: none; width: 100%; height: 50px; line-height: 50px; text-align: center; } .UpRefresh { position: absolute; left: 50%; transform: translateX(-50%); z-index: -9; } .DownRefresh { position: relative; left: 50%; transform: translateX(-50%); margin-top: -10px; z-index: -9; } } </style>
<template> <div> <PullupOrPulldownRefresh ref="PullupOrPulldownRefresh" :maxMove="maxMove" :friction="friction" @RefreshUp="RefreshUp" @RefreshDown="RefreshDown" @setStatus="setStatus" > <template v-slot:upTilte> <!-- <div class="UpRefresh" v-show="isUpRefresh">{{ Uptitle }}</div> --> <div class="UpRefresh" v-show="isUpRefresh"> <img :src="require('@/assets/logo.png')" alt="" /> <p>{{ Uptitle }}</p> </div> </template> <ul> <li v-for="(item, index) in data" :key="index" style="background: orange" > {{ item }} </li> </ul> <template v-slot:downTilte> <div class="DownRefresh" v-show="isDownRefresh">{{ Downtitle }}</div> </template> </PullupOrPulldownRefresh> </div> </template> <script> export default { data() { return { maxMove: 300, friction: 0.3, data: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], isUpRefresh: false, isDownRefresh: false, Downtitle: 'Pull up to load more', Uptitle: 'Pull down to refresh' } }, methods: { setStatus(y) { if (y && y > 0) { this.isUpRefresh = true this.Uptitle = 'Pull down to refresh' if (y >= 50) this.Uptitle = 'Release to refresh' return } this.isDownRefresh = true this.Downtitle = 'Pull up to load more' if (y <= -50) this.Downtitle = 'Release to load more' }, RefreshUp(y) { if (!y) return if (y >= 50) { this.Uptitle = 'Refreshing' setTimeout(() => { for (var i = 1; i <= 10; i++) { this.data.push(this.data[this.data.length - 1] + 1) } this.$refs.PullupOrPulldownRefresh.resetStyle() // Rebound reset}, 1000) } }, RefreshDown(y) { if (!y) return if (y <= -50) { this.Downtitle = 'Loading' setTimeout(() => { for (var i = 1; i <= 10; i++) { this.data.push(this.data[this.data.length - 1] + 1) } this.$refs.PullupOrPulldownRefresh.resetStyle() // Rebound reset}, 1000) } } } } </script> <style scoped lang="scss"> .UpRefresh img{ width: 30px; } </style> The above is the full content of this article. I hope it will be helpful for everyone’s study. I also hope that everyone will support 123WORDPRESS.COM. You may also be interested in:
|
<<: Example verification MySQL | update field with the same value will record binlog
>>: How to deploy Vue project using Docker image + nginx
1. Installation package preparation VMware-player...
MySQL 8.0: MVCC for Large Objects in InnoDB In th...
Generally, lists have selection functions, and si...
The first parameter passing method is dynamic rou...
Table of contents Multi-table join query Inner Jo...
Table of contents 1. Three functions of toString ...
After half an hour of trying to pull the MySQL im...
1. Import mysql command The mysql command import ...
“How to make a website look high-end? Or more des...
<div class="box"> <img /> &...
The Swap partition of the Linux system, that is, ...
Table of contents Question: answer: Reality: Know...
This article uses the "Attribution 4.0 Inter...
Physical Structure of an InnoDB Index All InnoDB ...
Page replacement algorithm: The essence is to mak...