微信小程序實現時間軸
本文實例為大傢分享瞭微信小程序實現時間軸的具體代碼,供大傢參考,具體內容如下
一、顯示樣式
二、代碼
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裡面的數據,是一個對象數組。每一個元素都代表一條記錄。 /* 所有的代辦事項,是一個數組,每一個元素依舊是一個數組。任何裡面的每一個元素就是一個對象,代表一條代辦記錄 {gmtCreate: 1605023745000, gmtModify: 1605023750000, id: 1, importance: 1, isFinished: 0,remark: "測試備註",timeFlag: 1 title: "微信小程序" uId: 1} */ 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) /* 判斷 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; /* background-color: palegreen; */ } .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; /* background-color: pink; */ /* border: 2px solid; */ border-bottom: 1px solid #cccccc; /* opacity: 0.5; */ 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-item */ swiper { height: 100%; } .swiper-box{ display: block; height: 100%; width: 100%; overflow: hidden; }
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。