更新记录

1.0.4(2024-11-14) 下载此版本

修复了在中子元素点击事件无法触发问题

1.0.3(2024-11-14) 下载此版本

修改描述文件

1.0.2(2024-11-14) 下载此版本

添加示例项目,更新使用说明

查看更多

平台兼容性

Vue2 Vue3
App 快应用 微信小程序 支付宝小程序 百度小程序 字节小程序 QQ小程序
HBuilderX 3.1.0 × × × × ×
钉钉小程序 快手小程序 飞书小程序 京东小程序
× × × ×
H5-Safari Android Browser 微信浏览器(Android) QQ浏览器(Android) Chrome IE Edge Firefox PC-Safari
× × × × ×

fox-scroll-pager 组件文档

fox-scroll-pager 组件实现了一个可水平滚动的分页器,适用于需要分页显示内容的场景,如图片画廊、商品展示等。该组件支持动态计算页面的总数,并提供指示器来显示当前页码。

fox-scroll-pager 是一款轻量级、灵活的水平滚动分页组件,专为需要展示可滑动内容的场景设计。无论是图片画廊、商品展示还是任何需要分页显示的内容,fox-scroll-pager 都能完美应对。

组件亮点:

  • 智能分页:自动根据内容宽度计算总页数,并根据滚动位置动态更新当前页。
  • 可定制化指示器:支持显示精美的分页指示器,可自定义指示器颜色、大小和位置,完美契合各种设计需求。
  • 平滑的滚动体验:滑动操作流畅,触摸结束后会自动定位到最接近的页面,确保用户体验的流畅和自然。
  • 响应式支持:组件能够根据容器宽度自适应调整,兼容多种设备尺寸。

适用场景:

  • 商品列表展示
  • 图片画廊/轮播图
  • 任意需要分页展示的大型内容列表

如果你在开发中需要一个简洁、灵活的分页滚动组件,fox-scroll-pager 将是你理想的选择!它不仅简单易用,还能轻松适配各种页面布局,让你的项目更加流畅、美观。

赶紧使用 fox-scroll-pager 组件来提升你的页面体验吧!

功能特性

  • 支持水平滚动:组件通过水平滚动展示内容,自动计算总页数。
  • 指示器显示:可以显示当前页面的指示器,支持自定义颜色和位置。
  • 滚动位置控制:支持通过事件更新当前滚动位置和页码。
  • 触摸结束定位:通过触摸结束事件,自动将滚动位置调整到最近的页面。

组件属性

属性名 类型 默认值 说明
initialScrollLeft Number 0 初始化时的滚动位置,单位为像素。
indicator Boolean true 控制是否显示面板指示器。
indicatorColor String #999 指示器非激活状态的颜色。
indicatorActiveColor String #2AA4F4 指示器激活状态的颜色。
indicatorPosition String 10px 指示器距离底部的距离,单位为像素。

组件数据

数据名 类型 说明
scrollLeftVal Number 当前的滚动位置,单位为像素。
currentPageIndexVal Number 当前页的索引,从 0 开始计数。
lastScrollLeft Number 上一次的滚动位置,用于判断滑动方向。
contentWidthVal Number 内容总宽度,单位为像素。
totalPages Number 总页数。
temporarilyLeftVal Number 临时存储的滚动位置,用于在触摸结束时计算当前页。
showoverlay Boolean 是否显示滚动结束的遮罩层。

事件

事件名 参数 说明
update:scrollLeft scrollLeft 当滚动位置变化时触发,更新滚动位置。
update:currentPageIndex currentPageIndex 当页面索引变化时触发,更新当前页码。

方法

calculatePageIndex(scrollLeft, offsetWidth)

根据当前滚动位置和偏移宽度,计算当前的页码索引。

参数

  • scrollLeft: 当前滚动位置,单位为像素。
  • offsetWidth: 单个页面的宽度,单位为像素。

返回值

  • 返回当前页面的索引。

getWindow()

获取滚动容器的位置信息,并返回一个 Promise。

返回值

  • 返回一个 Promise,成功时解析为容器位置信息对象,失败时返回 null

getWinWidth()

获取滚动容器的宽度,返回 Promise。

返回值

  • 返回容器的宽度,单位为像素。

calculateTotalPages()

根据内容宽度和滚动容器宽度,计算总页数。

onScroll(e)

滚动事件的处理函数,更新滚动位置并触发页码更新。

参数

  • e.detail.scrollLeft: 当前滚动位置。
  • e.detail.scrollWidth: 内容总宽度。

gridlistTouchend(e)

触摸结束时,自动将滚动位置调整到最近的页面位置,并更新当前页码。


使用说明

基本用法

<template>
    <view>
        <fox-scroll-pager>
            <!-- 参考1 -->
            <!-- <view style="display: flex;">
                <view class="swiper" v-for="(item,index) in SwiperList" :key="index">
                    <view class="wrapper" v-for="(citm,cidx) in item" :key="cidx">
                        <view class="image" :style="`--bgcolor:${citm.bgColor};--brcolor:${citm.brColor}`">{{citm.image}}</view>
                        <view class="text">{{citm.text}}</view>
                    </view>
                </view>
            </view> -->
            <!-- 参考2 -->
            <view style="display: flex;width: 100%;flex-shrink: 0;flex-wrap: nowrap;">
                <view v-for="(item,index) in 7" :key="index" style="width:300px;background-color: antiquewhite;height: 300px;flex-shrink: 0;word-wrap: normal;">{{item}}</view>
            </view>
        </fox-scroll-pager>
    </view>
</template>

<script>
    export default {
        data() {
            return {
                title: 'Hello',
                SwiperList:[
                    [
                        {
                            image:'美食',
                            text:'美食',
                            bgColor:'#F84819',
                            brColor: '#F6412D',
                        },
                        {
                            image:'卖场',
                            text:'卖场便利',
                            bgColor:'#2AA4F4',
                            brColor: '#2AA4F4',
                        },
                        {
                            image:'水果',
                            text:'水果',
                            bgColor:'#44C241',
                            brColor: '#44C241',
                        },
                        {
                            image:'跑腿',
                            text:'跑腿代购',
                            bgColor:'#2AA4F4',
                            brColor: '#2AA4F4',
                        },      
                        {
                            image:'甜品',
                            text:'甜品饮品',
                            bgColor:'#F488C0',
                            brColor: '#F488C0',
                        },
                        {
                            image:'星选',
                            text:'星选好店',
                            bgColor:'#F84819',
                            brColor: '#F84819',
                        },
                        {
                            image:'药店',
                            text:'送药上门',
                            bgColor:'#F84819',
                            brColor: '#F84819',
                        },
                        {
                            image:'大牌',
                            text:'大牌惠吃',
                            bgColor:'#F99104',
                            brColor: '#F99104',
                        },
                        {
                            image:'秒送',
                            text:'取送件',
                            bgColor:'#2AA4F4',
                            brColor: '#2AA4F4',
                        },
                        {
                            image:'签到',
                            text:'签到赢饭钱',
                            bgColor:'#FF9800',
                            brColor: '#FF9800',
                        },
                    ],
                    [
                        {
                            image:'美食',
                            text:'美食',
                            bgColor:'#F84819',
                            brColor: '#F6412D',
                        },
                        {
                            image:'卖场',
                            text:'卖场便利',
                            bgColor:'#2AA4F4',
                            brColor: '#2AA4F4',
                        },
                        {
                            image:'水果',
                            text:'水果',
                            bgColor:'#44C241',
                            brColor: '#44C241',
                        },
                        {
                            image:'跑腿',
                            text:'跑腿代购',
                            bgColor:'#2AA4F4',
                            brColor: '#2AA4F4',
                        },      
                        {
                            image:'甜品',
                            text:'甜品饮品',
                            bgColor:'#F488C0',
                            brColor: '#F488C0',
                        },
                        {
                            image:'星选',
                            text:'星选好店',
                            bgColor:'#F84819',
                            brColor: '#F84819',
                        },
                        {
                            image:'药店',
                            text:'送药上门',
                            bgColor:'#F84819',
                            brColor: '#F84819',
                        },
                        {
                            image:'大牌',
                            text:'大牌惠吃',
                            bgColor:'#F99104',
                            brColor: '#F99104',
                        },
                        {
                            image:'秒送',
                            text:'取送件',
                            bgColor:'#2AA4F4',
                            brColor: '#2AA4F4',
                        },
                        {
                            image:'签到',
                            text:'签到赢饭钱',
                            bgColor:'#FF9800',
                            brColor: '#FF9800',
                        },
                    ]
                ]
            }
        },
        onLoad() {

        },
        methods: {

        }
    }
</script>

<style scoped lang="scss">
    view{
        box-sizing: border-box;
    }
    .swiper{
        display: grid;
        padding: 0 20rpx;
        grid-template-columns: repeat(5, minmax(0, 1fr));
        gap: 5px;
        width: 100%;
        flex-shrink: 0;
        .wrapper{
            display: flex;
            flex-direction: column;
            align-items: center;
            .image{
                width: 90rpx;
                height: 90rpx;
                line-height: 34rpx;
                background-color: var(--bgcolor);
                border: 1px solid var(--brcolor);
                color: rgba(255, 255, 255, 1);
                font-size: 24rpx;
                display: flex;
                justify-content: center;
                align-items: center;
                border-radius: 100%;
            }
            .text{
                height: 36rpx;
                opacity: 0.68;
                color: rgba(16, 16, 16, 1);
                font-size: 24rpx;
                margin-top: 10rpx;
            }
        }
    }
</style>

高级用法

<template>
  <fox-scroll-pager
    :initialScrollLeft="0"
    :indicator="true"
    :indicatorColor="'#ccc'"
    :indicatorActiveColor="'#42b983'"
    :indicatorPosition="'15px'"
    @update:scrollLeft="LeftUpdate"
    @update:currentPageIndex="onPageIndexUpdate"
  >
    <view class="content">
      <!-- 可以动态生成页面内容 -->
    </view>
  </fox-scroll-pager>
</template>

<script>
export default {
  data() {
    return {
      currentPageIndex: 0,
      scrollLeft: 0,
    };
  },
  methods: {
    LeftUpdate(scrollLeft) {
      this.scrollLeft = scrollLeft;
    },
    onPageIndexUpdate(pageIndex) {
      this.currentPageIndex = pageIndex;
    },
    reloadComponent() {
      // 使用重新加载组件的方式更新页面
      this.$refs.foxScrollPager.scrollLeftVal = 0;
    },
  },
};
</script>

样式

<style>
.fox-scroll-pager {
  width: 100%;
  overflow-x: auto;
}

.fox-scroll-pager-warpper {
  display: flex;
  width: 100%;
}

.fox-scroll-indicator {
  position: absolute;
  bottom: 10px;
  left: 50%;
  transform: translateX(-50%);
  display: flex;
  justify-content: center;
}

.fox-scroll-indicator-item {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  margin: 0 4px;
}
</style>

注意事项

  • 性能优化:尽量避免在滚动过程中频繁调用 calculateTotalPages,可以根据实际需求使用防抖(debounce)或节流(throttle)来优化性能。
  • 兼容性:确保使用的是支持 uni.createSelectorQuery 的环境,如 uni-appVue

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问