记录(十八)vue3的滚动轮播公告

效果图,公告会上下滚动

代码

<template>
  <div class="col-xs-4">
    <div class="title">
      <i>
        <img src="../assets/img/icon-tt04.png" alt="">
      </i>
      "本周推荐"
      <a href="" class="tt-more">more+</a>
    </div>
    <div class="marquee-wrap">
      <ul class="marquee-list" :class="{ 'animate-up': animateUp }">
        <li v-for="(item, index) in listData" :key="index">{{ truncateText(item, 18) }}</li>
      </ul>
    </div>
  </div>

</template>
<script setup>
import { ref, onMounted, onUnmounted } from 'vue';
const animateUp = ref(false);
const listData = ref([
  '[新闻周刊]本周特写 跨越城市的“背篓”',
  '[新闻周刊]本周人物 朱昌忠:老将 从“新”出发',
  '[新闻周刊]本周人物 巫婧:谈谈死亡',
  '[新闻周刊]本周视点 校园,拒绝欺凌',
  '点火成功!直击神舟十七号飞船发射升空瞬间',
  '[新闻周刊]本周人物 刘磊:山火扑救',
  '[新闻周刊]本周人物 陈晓光:蚊来了',
]);

let timer = null;
//设置滚动时间
const scrollAnimate = () => {
  animateUp.value = true;
  setTimeout(() => {
    listData.value.push(listData.value[0]);
    listData.value.shift();
    animateUp.value = false;
  }, 500);
};
//当字数超过多少时,变成省略号...
const truncateText = (text, length) => {
  if (text && text.length > length) {
    return text.slice(0, length) + '...';
  }
  return text;
}

onMounted(() => {
  timer = setInterval(scrollAnimate, 2000);
});

onUnmounted(() => {
  clearInterval(timer);
});
</script>
<style scoped lang="scss">
.col-xs-4 {
  width: 400px;
  padding: 1px 10px;

}

.title {
  position: relative;
  padding-left: 45px;
  font-size: 26px;
  font-weight: 700;
  color: #31499a;
  margin-top: 20px;
  margin-bottom: 30px;
  width: 300px;
  //border: 1px red solid;
}

.title i {
  position: absolute;
  left: 0;
  top: 50%;
  height: 40px;
  margin-top: -20px;
  display: block;
}

.tt-more {
  float: right;
  font-size: 12px;
  color: #999;
  font-weight: normal;
  height: 37px;
  line-height: 37px;
  text-decoration: none;
  background-color: transparent;
}

.marquee-wrap {
  width: 360px;
  height: 300px;
  border-radius: 20px;
  background: rgba($color: #000000, $alpha: 0.6);

  .marquee-list {
    li {
      width: 340px;
      height: 100%;
      text-overflow: ellipsis;
      overflow: hidden;
      white-space: nowrap;
      padding: 0 10px;
      list-style: none;
      line-height: 40px;
      color: #fff;
      font-size: 18px;
      font-weight: 400;
      display: flex;
      display: inline-block;
      cursor: pointer;
    }

    li:hover {
      background-color: rgb(193, 193, 146);
      /* 设置鼠标移动到字体上面时的高亮背景颜色 */
    }
  }

  .animate-up {
    transition: all 0.5s ease-in-out;
    transform: translateY(-40px);
  }
}
</style>

希望能帮助到大家,谢谢!

Vue公告滚动效果通常是指在一个滚动区域(如轮播图、滚动列表或消息面板)展示动态更新的内容,比如系统通知或新闻。实现这种效果的一种常见做法是使用 Vue 的响应式特性结合 CSS 或动画库(如 Vuetify 的 `v-loading` 或 Vanilla JavaScript 的 `Intersection Observer API`)。步骤大致如下: 1. **创建组件**:定义一个公告组件,包含消息列表和滚动功能。 ```html <template> <div class="scrolling-container"> <ul ref="scrollList" v-for="announcement in announcements" :key="announcement.id"> <!-- 每条公告的模板 --> <li>{{ announcement.content }}</li> </ul> <button @click="loadMore">加载更多</button> </div> </template> <script> export default { data() { return { announcements: [], isScrolling: false, hasMore: true, // 初始状态表示还有更多内容 }; }, methods: { loadMore() { if (this.hasMore) { this.$axios.get('api/announcements') // 使用 API 获取更多数据 .then(response => { this.announcements.push(...response.data); this.isScrolling = true; setTimeout(() => { // 等待滚动完成后再停止 this.isScrolling = false; }, 500); // 假设动画延迟500ms }); } }, }, }; </script> ``` 2. **CSS样式**:添加 CSS 来实现滚动效果和加载提示。例如,可以设置滚动监听器并在滚动到容器底部时触发 `loadMore` 方法。 ```css .scrolling-container { overflow-y: auto; /* 自动滚动 */ } .load-more { display: none; position: fixed; bottom: 20px; width: 80%; text-align: center; } .is-scrolling & { display: block; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值