小程序:无限自动滚动的Gallery

栏目: CSS · 发布时间: 5年前

内容简介:遇到一个需求,需要在小程序内实现自动轮播的画廊效果,如果是网页版的话有大量现成的库可以用,但小程序找了一圈没找到有类似的库,只好自己想办法了。在踩了多个坑之后找到最简单的方法,就是用CSS animation来实现,但缺点就是不能手动拖动。先贴一下效果图

遇到一个需求,需要在小程序内实现自动轮播的画廊效果,如果是网页版的话有大量现成的库可以用,但小程序找了一圈没找到有类似的库,只好自己想办法了。

在踩了多个坑之后找到最简单的方法,就是用CSS animation来实现,但缺点就是不能手动拖动。

先贴一下效果图

小程序:无限自动滚动的Gallery

第一步 html

因为要无限滚动,所以放完在最后一个图之后需要切换回第一个图。为了让用户感知不到这个切换过程,需要将最开始图片复制后末尾,小程序里把 wx:for 复制一遍就行了,注意要修改 wx:key 的值,避免重复。

为啥是复制全部图片呢,主要是因为 keyframes 的值不能动态设置,复制全部后只需要将 end 进度值设置为-50%即可。

<view class="series">
    <view
        style="animation: {{duration}}ms scroll-animation linear infinite;width: {{seriesWidth*2}}rpx"
        class="images">
        <view class="row" wx:for="{{productSeries}}" wx:key="{{index}}">
            <image
                wx:for="{{item}}"
                wx:for-item="img"
                wx:for-index="imgIndex"
                wx:key="{{img + imgIndex}}"
                src="{{img}}"
            ></image>
            <image
                wx:for="{{item}}"
                wx:for-item="img"
                wx:for-index="imgIndex"
                wx:key="{{img + imgIndex}}-extra"
                src="{{img}}"
            ></image>
        </view>
    </view>
</view>
复制代码

第二步 css

CSS动画很简单,让gallery转动到-50%的时候跳回0%,并设置 infinite 。使用 style 而非 class 的原因是画廊总长不确定,动画的时长根据图片数量来设置。 width 也是需要动态设置,自动计算的 width 会有问题。

.series {
    overflow: hidden;
    .images {
        min-width: 100%;
        .row {
            white-space: nowrap;
            line-height: 1;
            &:last-child {
                transform: translateX(-100rpx);
            }
        }
        image {
            width: 180rpx;
            height: 180rpx;
            margin: 0 10rpx 8rpx 0;
        }
    }
}
@keyframes scroll-animation {
        from {
            transform: translateX(0);
        }
        to {
            transform: translateX(-50%);
        }
    }
复制代码

第三步 js

我们还需要通过js计算动画时长和view的长度,数字 190 是image width + margin-right 的值。最后要再减一次 margin-right 的原因我也不确定,但不减这个值的话动画最后会有一点卡顿的感觉,显得不太流畅,希望有大佬解答一下原理。

data = {
    productSeries: [
        [
            '/images/house1.png',
            '/images/house2.png',
            '/images/house3.png',
            '/images/house2.png',
            '/images/house3.png',
            '/images/house4.png'
        ],
        [
            '/images/house1.png',
            '/images/house2.png',
            '/images/house3.png',
            '/images/house2.png',
            '/images/house3.png',
            '/images/house4.png'
        ]
    ],
    speed: 40,
    seriesWidth: 400,
    duration: 60000
}
onShow() {
    if (this.productSeries[0].length > 4) {
        this.seriesWidth = 190 * this.productSeries[0].length - 10
        this.duration = Math.floor(this.seriesWidth / this.speed * 1000)
    } else { // 当一行图片太少时就没必要加动画了
        this.seriesWidth = null
        this.duration = 0
    }
}
复制代码

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

计算机与人脑

计算机与人脑

[美] 约·冯·诺意曼 / 甘子玉 / 商务印书馆 / 1965-3 / 7.00元

《计算机与人脑》是自动机(以电子计算机为代表)理论研究中的重要材料之一。原书是冯·诺意曼在1955-1956年准备讲演用的未完成稿。著者从数学的角度,主要是从逻辑和统计数学的角度,探讨计算机的运算和人脑思维的过程,进行了一些比较研究。书中的许多技术推论带有预测性,尚待今后实验研究及进一步探讨才能判断其是否正确。一起来看看 《计算机与人脑》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具