微信小程序实现时间轴
短信预约 -IT技能 免费直播动态提醒
本文实例为大家分享了微信小程序实现时间轴的具体代码,供大家参考,具体内容如下
一、显示样式
二、代码
1.wxml:
<view class="header">
<view class="header-left">
<view class="header-left-top">{{selectedDay.year}}/{{selectedDay.month}}/{{selectedDay.day}}</view>
</view>
<view class="header-right">
<button bindtap="returnToday" color="#4e8a8d" class=".button" round type="info">回到今天</button>
</view>
</view>
<!-- 顶部日历部分 -->
<view class="page-section-spacing">
<!-- scroll-into-view 不能以数字开头 -->
<scroll-view class="scroll-view_H" scroll-x="true" bindscroll="scroll" scroll-into-view="{{intoView}}"
style="width: 100%">
<!-- 这里用到了自定义属性,需要以 data 开头,以-连接,否则在event中获取不到 -->
<view wx:for="{{dayList}}" wx:for-item="item" wx:for-index="index" wx:key="index" id="view{{index}}"
class="scroll-view-item_H {{currentIndex==index ?'active':'noactive'}}" data-index="{{index}}"
bindtap="clickDate">
<view class="scroll-week">周{{item.week}}</view>
<view class="scroll-day">{{item.day}}</view>
</view>
</scroll-view>
</view>
2.js:
Page({
data: {
//日期数组,每个元素都是一个对象,共有21个元素 {day: 10, month: 11, week: "二", year: 2020}
dayList: [],
// 一天的毫秒数
millisecond: 86400000,
// 生命周期函数中设置为 view7,用来控制 scroll-view 的滑动,滑动到指定项(该项的id和intoView的值相同)
intoView: '',
// 当前项的下标,初始值是7。从0开始,“今天”之前有7天,所以“今天”的下标是7
currentIndex: 7,
// 选中的日期(用户通过点击上面的按钮)
selectedDay: {},
// 滑动动画时长
duration: 500,
// swiper里面的数据,是一个对象数组。每一个元素都代表一条记录。
targetList: [],
// swiper的高度
widHeight: 350,
// 用户id,页面加载时从全局 globalData 中获取
uid: "1",
// // 完成按钮图标对应的 url: ../../icon/target.png 或者 ../../icon/target_ok.png
// imageUrl: "",
// iconClass: ""
},
clickTargetItem: function (e) {
console.log("clickItem");
console.log(e.currentTarget.dataset);
this.setData({
"message": e.currentTarget.dataset
})
console.log("本条记录的id为:", e.currentTarget.dataset.id);
console.log(this.data.targetList[this.data.currentIndex]);
},
// 中部 swiper 滑动触发的点击事件
siwperChange: function (e) {
// console.log(e.detail);
// 1. 设置 data 中的 index 的值,然后上面的日历部分的index也会改变。这样上面日历部分和下面的swipper部分就可以同步
this.setData({
"currentIndex": e.detail.current
})
// 2. 重新设置 siwper 的高度(先更改 currentIndex,然后在设置对应 siwper 的高度)
// console.log("slide");
// console.log(this.data.targetList);
// console.log("currentIndex", this.data.currentIndex);
// console.log(this.data.targetList[this.data.currentIndex].length);
// console.log("myheight", myHeight);
var myHeight = this.data.targetList[this.data.currentIndex].length * 135 + 3 * 70 + 176 + 100;
wx.getSystemInfo({
success: (result) => {
console.log("页面高度", result.screenHeight);
if (myHeight < result.screenHeight) {
myHeight = result.screenHeight;
}
},
});
// 设置页面高度和当前选择的日期
this.setData({
'widHeight': myHeight,
"selectedDay": this.data.dayList[e.detail.current]
})
},
// 点击日历上面的日期
clickDate: function (event) {
console.log(event.currentTarget.dataset);
// 设置数组下标
this.setData({
'intoView': "view" + event.currentTarget.dataset.index,
'currentIndex': event.currentTarget.dataset.index
})
// 更改用户选中的日期,然后在页面中渲染选中的日期
this.setData({
"selectedDay": this.data.dayList[event.currentTarget.dataset.index]
})
this.onPullDownRefresh()
},
// “回到今天” 按钮对应的点击事件
returnToday: function () {
console.log("回到今天");
this.setData({
"intoView": "view7",
"currentIndex": 7,
"selectedDay": this.data.dayList[7]
})
this.onPullDownRefresh()
},
// 封装的 js 函数,生成一个 dayList,里面有最近3个礼拜的日期信息
weekDate: function () {
var dayList = [];
// 获取当前时间对应的 date 对象
var myDate = new Date();
// 因为要最近3个礼拜的日期信息,可能涉及到月份的变化所以不能简单的对天数加1或者减1,可以先计算出毫秒数,然后转换为日期
var millisecond = myDate.getTime();
// 为 "上一个礼拜的时间" 加入 dayList 中
for (var i = 7; i > 0; i--) {
// 根据毫秒数构造一个 Date 对象
var tempDate = new Date(millisecond - i * this.data.millisecond);
dayList.push({
'day': tempDate.getDate(),
'month': tempDate.getMonth() + 1,
'week': this.toWeekDay(tempDate.getDay()),
'year': tempDate.getFullYear()
});
}
// 将 “今天” 加入 dayList 中
dayList.push({
'day': myDate.getDate(),
'month': myDate.getMonth() + 1,
'week': this.toWeekDay(myDate.getDay()),
'year': myDate.getFullYear()
})
// 将 “未来2周” 加入 dayList 中
for (var i = 1; i <= 13; i++) {
var tempDate = new Date(millisecond + i * this.data.millisecond);
dayList.push({
'day': tempDate.getDate(),
'month': tempDate.getMonth() + 1,
'week': this.toWeekDay(tempDate.getDay()),
'year': tempDate.getFullYear()
})
}
return dayList;
},
// 传入数据 讲一周的某一天返回成中文状态下的字符
toWeekDay: function (weekDay) {
switch (weekDay) {
case 1:
return '一';
break;
case 2:
return '二';
break;
case 3:
return '三';
break;
case 4:
return '四';
break;
case 5:
return '五';
break;
case 6:
return '六';
break;
case 0:
return '日';
break;
default:
break;
}
return '传入未知参数';
},
onLoad: function (options) {
// 加载数据,调用封装的方法
this.loadingData();
},
// 生命周期函数:用户下拉刷新
onPullDownRefresh: function () {
console.log("refresh");
// 加载数据,调用封装的方法
this.loadingData();
},
// 封装出来的加载数据的函数
loadingData: function () {
wx.showLoading({
title: '加载中',
})
// 1. 获取最近3周的日期信息,存入 this.data 中
var dayList = this.weekDate();
// 通过 scroll-into-view 设置一开始的位置
this.setData({
"dayList": dayList,
"intoView": "view7"
});
// 1.1 设置当前选中的日期
this.setData({
"selectedDay": this.data.dayList[7]
})
// 2. 从 globalData 中获取用户openid
var app = getApp();
this.setData({
"uid": wx.getStorageSync('openid')
})
// 2. 获取代办事项信息,根据用户id获取
// 向后端服务器发送请求
// 将当前的日期发送给后端服务器
var myDate = new Date();
var millisecond = myDate.getTime();
var that=this;
wx.request({
url: app.globalData.url + 'api/wx/getTargetByUserId',
method: "GET",
data: {
"uid": this.data.uid,
"millisecond": millisecond,
"currentIndex": this.data.currentIndex
},
success: res => {
console.log("请求成功!")
console.log(res.data.length);
// 设置待办事项,同时设置 swiper 的高度
// “今天” 对应的 swiper-item 下标是7,所以选择数组第7个元素
var myHeight = res.data.length * 70 +250;
console.log(myHeight);
//console.log("今天的代办事项有:", res.data[7].length)
//console.log("myheight", myHeight);
// 为了让 swiper 能够覆盖整个页面(只有这样,按住其他地方进行滑动时,也可以成功的滑动 siwpper)
wx.getSystemInfo({
success: (result) => {
console.log("页面高度", result.screenHeight);
if (myHeight < result.screenHeight-250) {
myHeight = result.screenHeight-250;
}
},
})
this.setData({
'targetList': res.data,
'winHeight': myHeight,
})
// 隐藏提示框
wx.hideLoading();
// 停止下拉刷新
wx.stopPullDownRefresh()
}
})
},
})
3.wxss:
.header {
width: 100%;
height: 125rpx;
}
.header-left {
float: left;
}
.header-left-top {
height: 62.5rpx;
line-height: 62.5rpx;
margin-left: 25rpx;
font-size: 40rpx;
font-weight: 500;
margin-top: 25rpx;
}
.header-left-bottom {
height: 62.5rpx;
margin-left: 25rpx;
}
.header-right {
float: right;
margin-right: 30rpx;
margin-top: 25rpx;
}
.scroll-view_H {
white-space: nowrap;
}
.scroll-view-item_H {
display: inline-block;
width: 14.4%;
height: 140rpx;
border-bottom: 1px solid #cccccc;
color: #96989D;
font-size: 32rpx;
font-family: CenturyGothic-Bold;
font-weight: bold;
padding-bottom: 30rpx;
}
.scroll-week {
text-align: center;
height: 70rpx;
line-height: 70rpx;
}
.scroll-day {
text-align: center;
height: 70rpx;
line-height: 70rpx;
}
.active .scroll-day {
border-radius: 90rpx;
background-color: #4e8a8d;
color: white;
}
swiper {
height: 100%;
}
.swiper-box{ display: block; height: 100%; width: 100%; overflow: hidden; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341