Vue3 动画_卡片循环滚动轮播效果

利用了css样式 transform: matrix() 控制卡片组滚动,来完成动画效果

:style="`transform: matrix(1, 0, 0, 1, 273, ${dataList[i]})`"

补充:

matrix(scaleX(),skewY(),skewX(),scaleY(),translateX(),translateY())
  • scaleX() (水平缩放):控制元素水平方向的缩放。如果值为 1,则不进行水平缩放;如果大于 1,则放大;如果在 0 和 1 之间,则缩小。
  • skewY() (垂直倾斜):控制元素在垂直方向上的倾斜。
  • skewX() (水平倾斜):控制元素在水平方向上的倾斜。
  • scaleY() (垂直缩放):控制元素垂直方向的缩放。如果值为 1,则不进行垂直缩放;如果大于 1,则放大;如果在 0 和 1 之间,则缩小。
  • translateX() (水平平移):控制元素在水平方向上的平移量。
  • translateY() (垂直平移):控制元素在垂直方向上的平移量。

即在不变换的情况下是matrix(1, 0, 0, 1, 0, 0)

<!-- 自下而上动画 -->
    <div class="anime-box">
      <div
        :style="`transform: matrix(1, 0, 0, 1, 273, ${dataList[i]})`"
        v-for="(item, i) in data"
        :key="item"
      >
        <p>{{ item.year }}</p>
      </div>
    </div>
.anime-box {
  background-color: #b2ea97;
  height: 670px;
  overflow-y: scroll;
  > div {
    height: 250px;
    width: 250px;
    background-color: #9c7070;
    display: flex;
    align-items: center;
    justify-content: center;
    color: #ede0e0;
    font-size: 30px;
  }
}

动画实现主要思路:

1.从接口获取展示用的数据data后,算出每个被渲染出的卡片应有的初始位移,保存到一个代表Y轴位移的数;

// 模拟接口返回数据
const data = [
  { year: "1991", value: 3 },
  { year: "1992", value: 4 },
  { year: "1993", value: 3.5 },
  { year: "1994", value: 5 },
  { year: "1995", value: 4.9 },
  { year: "1996", value: 6 },
  { year: "1997", value: 7 },
  { year: "1998", value: 9 },
  { year: "1999", value: 13 },
];
// 计算初始位移,保存至数组
const dataList = ref([]);
const getDataList = () => {
  let n = 0;
  data.forEach((item, i) => {
    dataList.value.push(n);
    n += 30;
  });

//开始动画
  dataListChangeDown(); // 需要哪个方向调哪个
  // dataListChange();
};

2.使用定时器,每过一段时间,数组每个值加或减一定的偏移量;

let intervalId;
// 从下到上动画
const dataListChange = () => {
  intervalId = setInterval(() => {
    dataList.value.forEach((item, i) => {
      if (item < -(280 * (i + 1))) {
        // 代表Y轴位移的数一旦触底后回归初始值
        dataList.value[i] += (30 + 250) * dataList.value.length;
      } else {
        dataList.value[i] = item - 1;
      }
    });
  }, 10);
};

// 从上到下动画
const dataListChangeDown = () => {
  intervalId = setInterval(() => {
    dataList.value.forEach((item, i) => {
      if (item > 670 - 250 * i) {
        // 代表Y轴位移的数一旦到顶后回归初始值
        dataList.value[i] -= (30 + 250) * dataList.value.length;
      } else {
        dataList.value[i] = item + 1;
      }
    });
  }, 10);
};

3.代表Y轴位移的数一旦触底/到顶后回归初始值。

页面销毁前记得清定时器

onUnmounted(() => {
  clearInterval(intervalId);
});

打开页面时根据需求先获取数据,之后加载计算位移方法

onMounted(() => {
  getDataList();
});

横滚

// 快速翻页 | 左
const quickScrollLeft = () => {
  const maxMove = cardWidth * moveNumList.value.length - 1920;
  moveNumList.value.forEach((item, i) => {
    if (maxMove - cardWidth * (i + 1) > item) {
      moveNumList.value[i] += cardWidth * 3;
    } else {
      // 代表Y轴位移的数一旦触底后回归初始值
      moveNumList.value[i] -= cardWidth * moveNumList.value.length;
    }
  });
};
// 快速翻页 | 右
const quickScrollRight = () => {
  moveNumList.value.forEach((item, i) => {
    if (item > 0 - cardWidth * (i + 1)) {
      moveNumList.value[i] -= cardWidth * 3;
    } else {
      // 代表X轴位移的数一旦触底后回归初始值
      moveNumList.value[i] += cardWidth * moveNumList.value.length;
    }
  });
};

Vue.js 3可以使用transition组件和v-for指令来实现左右照片无缝滚动轮播图。首先,你需要设置一个容器元素来包裹照片,并设置它的宽度为照片的宽度的n倍,其中n为照片的数量。然后,使用v-for指令在容器中循环渲染照片。接下来,使用transition组件和transform属性来实现左右滚动效果。最后,使用setInterval函数来实现自动切换照片的功能。 代码示例如下: ```html <template> <div class="carousel-container"> <transition-group name="carousel-slide" tag="div"> <div v-for="(photo, index) in photos" :key="index" class="carousel-slide-item"> <img :src="photo" alt="photo" /> </div> </transition-group> </div> </template> <script> export default { data() { return { photos: [ "photo1.jpg", "photo2.jpg", "photo3.jpg", // 添加更多照片 ], currentIndex: 0, intervalId: null, }; }, mounted() { this.startAutoSlide(); }, beforeUnmount() { this.stopAutoSlide(); }, methods: { startAutoSlide() { this.intervalId = setInterval(() => { this.slideRight(); }, 3000); }, stopAutoSlide() { clearInterval(this.intervalId); }, slideLeft() { this.currentIndex = (this.currentIndex - 1 + this.photos.length) % this.photos.length; }, slideRight() { this.currentIndex = (this.currentIndex + 1) % this.photos.length; }, }, }; </script> <style> .carousel-container { width: 100%; overflow: hidden; } .carousel-slide-item { float: left; width: 100%; } .carousel-slide-enter-active, .carousel-slide-leave-active { transition: transform 0.5s; } .carousel-slide-enter, .carousel-slide-leave-to { transform: translateX(100%); } </style> ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值