vue/uni-app使用fullpage.js实现简单的翻页

来源:https://github.com/l-x-f/uni-full-page

 

components/FullPage/index.vue

<template>
  <view class="full-page-container">
    <view
      class="full-page-main"
      @touchstart="handleTouchStart"
      @touchmove="handleTouchMove"
      @touchend="handleTouchEnd"
      :style="style"
    >
      <slot />
    </view>
  </view>
</template>

<script>
export default {
  name: 'FullPage',
  props: {
    // 触发翻页的临界值
    critical: {
      type: Number,
      default: 50
    },
    // 总共页面数
    totalPage: {
      type: Number,
      required: true,
      default: 0
    },
    // 当前页面的索引值
    activeIndex: {
      type: Number,
      required: true,
      default: 0
    }
  },
  data() {
    return {
      pageIndex: 0, // 当前页面的索引值
      startPageY: 0, // 开始的位置
      endPageY: 0, // 结束的位置
      marginTop: 0 // 滑动下拉(上拉)距离
    }
  },
  mounted() {
    this.pageIndex = this.activeIndex
  },
  computed: {
    style() {
      return `transform:translateY(-${this.pageIndex * 100}%);margin-top:${
        this.marginTop
      }px`
    }
  },
  watch: {
    activeIndex(value) {
      this.pageIndex = value
    }
  },
  methods: {
    // 开始滑动
    handleTouchStart(e) {
      const { pageY } = e.touches[0]
      this.startPageY = pageY
    },
    // 滑动中
    handleTouchMove(e) {
      const { pageY } = e.touches[0]
      if (
        pageY - this.startPageY < this.critical &&
        pageY - this.startPageY > -this.critical
      ) {
        this.marginTop = pageY - this.startPageY
      }
      this.endPageY = pageY
    },
    // 滑动结束
    handleTouchEnd() {
      if (!this.endPageY) {
        return
      }
      if (
        this.endPageY - this.startPageY > this.critical &&
        this.pageIndex > 0
      ) {
        this.pageIndex -= 1
      } else if (
        this.endPageY - this.startPageY < -this.critical &&
        this.pageIndex < this.totalPage - 1
      ) {
        this.pageIndex += 1
      }
      this.$emit('update:activeIndex', this.pageIndex)
      this.startPageY = 0
      this.endPageY = 0
      this.marginTop = 0
    }
  }
}
</script>

<style lang="scss" scoped>
.full-page-container {
  height: 100%;
  overflow: hidden;
  .full-page-main {
    height: 100%;
    transition: all 0.3s;
  }
}
</style>

 

pages/index/index

<template>
  <full-page :active-index.sync="activeIndex" :total-page="totalPage">
    <view
      class="section"
      v-for="(item, index) in totalPage"
      :key="index"
      :style="getRandomStyle()"
    >
      <div :class="'page page-' + index">
        {{ index + 1 }}
        <button type="primary" @click="toPage(1)">
          跳转到第1页
        </button>
        <button type="primary" @click="toPage(10)">
          跳转到第10页
        </button>
      </div>
    </view>
  </full-page>
</template>

<script>
import FullPage from '@/components/FullPage'
export default {
  components: {
    FullPage,
  },
  data() {
    return {
      totalPage: 10,
      activeIndex: 0,
    }
  },
  methods: {
    getRandomStyle() {
      const r = Math.floor(Math.random() * 256)
      const g = Math.floor(Math.random() * 256)
      const b = Math.floor(Math.random() * 256)
      const color = '#' + r.toString(16) + g.toString(16) + b.toString(16)
      return `background-color:${color}`
    },
    toPage(index) {
      this.activeIndex = index - 1
    },
  },
}
</script>
<style lang="scss" scoped>
page {
  height: 100%;
}
.section {
  height: 100%;
  width: 100%;
  position: relative;
}
.page {
  height: 100%;
  width: 100%;
  text-align: center;
  font-size: 50rpx;
  padding-top: 150rpx;
  box-sizing: border-box;
}
button {
  font-size: 30rpx;
  width: 400rpx;
  margin: 50rpx;
}
</style>

 

来源里主要针对手机端,如果想在电脑端用滚轮滑动,只需要在pages/index/index里添加滚轮事件

this.handleScroll

改变activeIndex的值就好了

 mounted() {
    // chrome and ie
    window.addEventListener('mousewheel', this.handleScroll, false)
    // firefox
    window.addEventListener("DOMMouseScroll", this.handleScroll, false)
 },

 

上一篇:小程序实现商品查询分页功能自动加载下一页


下一篇:续 _WebAPI+Mvc 问题操作 + 操作