【 vue/css列表无限滚动轮播,可接受动态赋值】

vue/css列表无限滚动轮播,可接受动态赋值

1.先上效果图

vue/css 列表轮播

嫌麻烦的话可以直接看源码,我博客也只是纯代码记录,没啥思想含量……
https://gitee.com/penny0906/blog-files/tree/master/infiniteScrollList

2.vue中template代码和css样式,仅做参考,数据列表项最好定义固定高度,涉及后期动画高度计算,这里我用的50px

dashboardTitle是我引用的通用头部组件,可以忽略

<!--  dashboardTitle是我引用的通用头部组件,可以忽略 -->
<template>
    <dashboardTitle title="完修量排行榜" titleTip="截至目前" :hiddenScroll="true">
        <!--  注意此处是添加 animation 动画,不可缺少 -->
        <div
            class="huazhu-ranking"
            :style="{
                animation: `scroll ${list.length}s 2s both infinite`
            }"
        >
            <div v-for="(item, index) in list" :key="index" class="item">
                <div class="rank-title">
                    <div class="rank">No.{{ item.rank }}</div>
                    <div class="name">{{ item.name }}</div>
                    <div class="num">{{ item.num }}</div>
                </div>
                <div class="slider" :style="{ width: `${(item.num / total) * 100}%` }"></div>
            </div>
            <!-- 再次重复一列,避免滑到最底部的时候底部出现空白; -->
            <!-- key做处理,避免报错duplicate key -->
            <div v-for="(item, index) in list" :key="index.toString().padStart(3, 0)" class="item">
                <div class="rank-title">
                    <div class="rank">No.{{ item.rank }}</div>
                    <div class="name">{{ item.name }}</div>
                    <div class="num">{{ item.num }}</div>
                </div>
                <div class="slider" :style="{ width: `${(item.num / total) * 100}%` }"></div>
            </div>
        </div>
    </dashboardTitle>
</template>
<style lang="scss" scoped>
.huazhu-dashboard-card .content {
    overflow-y: hidden !important;
}
.huazhu-ranking {
    padding: 0 10px;
    box-sizing: border-box;
    .item {
        height: 50px;
        padding: 4px 0;
        display: flex;
        flex-direction: column;
        justify-content: space-between;
        .rank-title {
            font-size: 12px;
            display: flex;
            align-items: center;
            .rank {
                width: 40px;
                color: var(--theme-color);
            }
            .name {
                flex: 1;
            }
        }
        .slider {
            height: 2px;
            background: var(--theme-color);
        }
    }
}
</style>

3.data中定义list数组

data() {
        return {
            total: 10000,
            list: []
        };
    },

4.created中获取数据并且要删除多余的scroll动画,否则会覆盖新的动画,动画效果混乱

created() {
        // 删除多余的之前的scroll动画,否则会覆盖新的动画
        document.styleSheets[0]?.cssRules.forEach((it, index) => {
            if (it?.name === 'scroll') {
                document.styleSheets[0].deleteRule(index);
            }
        });
        // 获取数据
        this.getRankingList();
    },

4.methods手动根据数据量添加相应动画

methods: {
        getRankingList() {
            // 模拟接口
            setTimeout(() => {
                this.list = new Array(12)
                    .toString()
                    .split(',')
                    .map((item, index) => {
                        return {
                            rank: index + 1,
                            name: '天德电器销售有限公司',
                            num: 9999 - index * 500
                        };
                    });
                // 添加动画
                this.addKeyFrames();
            }, 200);
        },
        addKeyFrames() {
            let gap = 100 / this.list.length;
            let content = new Array(this.list.length + 1)
                .toString()
                .split(',')
                .map((it, index) => {
                    return `${gap * index}% {transform: translateY(-${50 * index}px);}`;
                });
            // 写入样式
            document.styleSheets[0].insertRule(`@keyframes scroll {${content.join('')}}`);
        }
    }

5.补充碎碎念

1)这个代码滚动效果是会停顿一下的,我这边业务要求如此,如果想平滑的滚动可以把vue template中绑定的animation的both 换成 linear

:style="{animation: `scroll ${list.length}s 2s both infinite`}"

改为

:style="{animation: `scroll ${list.length}s 2s linear infinite`}"

2)竖向滚动条一般可能都会显示的,个人觉得不美观,用overflow: hidden; 隐藏了

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值