国外MOSE官网
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

196 lines
4.5 KiB

<template>
<view class="volunteer-header">
<view class="swiper-container" @click="goToDetail">
<uv-swiper :list="bannerList" indicator indicatorMode="dot" height="270rpx" circular></uv-swiper>
<!-- <view class="header-title">
<text class="title-text">国际志愿者日</text>
<text class="date-text">12/05</text>
</view> -->
<!-- <image class="dove-icon" src="/static/路径 6665@2x.png" mode="aspectFit"></image> -->
</view>
<view class="notice-bar" @click="goToAnnouncement">
<image class="horn-icon" src="/static/首页_小喇叭.png" mode="aspectFit"></image>
<view class="notice-scroll-container">
<view class="notice-scroll" :animation="animationData">
<text class="notice-text" v-for="(notice, index) in noticeList" :key="index">
{{ notice.title }}
</text>
</view>
</view>
<uv-icon name="arrow-right" color="#999" size="14"></uv-icon>
</view>
</view>
</template>
<script>
export default {
name: 'VolunteerHeader',
data() {
return {
bannerList: [
'/static/bannerImage.png',
'/static/bannerImage.png',
'/static/bannerImage.png',
],
noticeList: [
{ id: 1, title: '【重要通知】志愿者服务活动报名开始啦,欢迎大家踊跃参与!' },
{ id: 2, title: '【活动预告】本周六将举办环保志愿活动,期待您的参与' },
{ id: 3, title: '【表彰通知】优秀志愿者表彰大会将于下周举行' },
{ id: 4, title: '【温馨提醒】请各位志愿者及时更新个人信息' }
],
animationData: {},
currentIndex: 0,
scrollTimer: null
}
},
methods: {
goToAnnouncement() {
// 跳转到公告页面
uni.navigateTo({
url: '/subPages/index/announcement'
})
},
goToDetail() {
// 跳转到详情页面
uni.navigateTo({
url: '/subPages/index/activityDetail'
})
},
async queryBannerList() {
const res = await this.$api.home.queryBannerList()
this.bannerList = res.result.records.map(item => item.image)
},
// 获取公告列表
async queryNoticeList() {
const res = await this.$api.home.queryNoticeList({
pageNo: 1,
pageSize: 4,
})
this.noticeList = res.result.records
},
// 开始滚动动画
startScroll() {
this.scrollTimer = setInterval(() => {
this.currentIndex = (this.currentIndex + 1) % this.noticeList.length
const animation = uni.createAnimation({
duration: 500,
timingFunction: 'ease-in-out'
})
animation.translateY(-this.currentIndex * 30).step()
this.animationData = animation.export()
}, 2000)
},
// 停止滚动动画
stopScroll() {
if (this.scrollTimer) {
clearInterval(this.scrollTimer)
this.scrollTimer = null
}
}
},
async mounted() {
console.log('出发喽');
await this.queryBannerList()
await this.queryNoticeList()
// 启动公告滚动
this.startScroll()
},
beforeDestroy() {
// 清理定时器
this.stopScroll()
},
}
</script>
<style lang="scss" scoped>
.volunteer-header {
width: 100%;
.swiper-container {
position: relative;
margin: 20rpx;
border-radius: 20rpx;
overflow: hidden;
.header-title {
position: absolute;
bottom: 20rpx;
left: 20rpx;
z-index: 10;
display: flex;
flex-direction: column;
background-color: rgba(0,0,0,0.4);
padding: 10rpx 20rpx;
border-radius: 10rpx;
.title-text {
font-size: 36rpx;
font-weight: bold;
color: #fff;
}
.date-text {
font-size: 28rpx;
color: #2c5e2e;
margin-top: 6rpx;
}
}
.dove-icon {
position: absolute;
right: 20rpx;
bottom: 20rpx;
z-index: 10;
width: 70rpx;
height: 70rpx;
background-color: #fff;
border-radius: 50%;
padding: 10rpx;
}
}
.notice-bar {
display: flex;
align-items: center;
background-color: #fff;
padding: 20rpx;
margin: 0 20rpx 20rpx;
border-radius: 12rpx;
// 如何只显示底部阴影
box-shadow: 0rpx 1rpx 0rpx 0rpx #3a94e1; ;
// border-bottom: 1rpx solid #3A94E1;
.horn-icon {
width: 40rpx;
height: 40rpx;
margin-right: 10rpx;
}
.notice-scroll-container {
flex: 1;
height: 60rpx;
overflow: hidden;
position: relative;
}
.notice-scroll {
position: absolute;
top: 0;
left: 0;
width: 100%;
}
.notice-text {
display: block;
height: 60rpx;
line-height: 60rpx;
font-size: 28rpx;
color: $uni-text-color;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
}
}
</style>