vue 点击滚动时间轴

<template>
  <div class="background">
    <div class="sjz">
      <div class="iconDiv">
        <a-icon
          :class="showMonth[0].yearsMonth == startTime ? 'disabledIcon' : 'sjzIcon'"
          type="up-circle"
          @click="upSjz"
          theme="filled"
        />
      </div>
      <!-- 中间月份 -->
      <div class="monthList">
        <div v-for="(item, index) in showMonth" :key="index" class="monthItem">
          <span v-if="item.yearsMonth.indexOf('01') != -1">
            <!-- 年份显示 -->
            <div class="yearClass">
              <div>{{ item.yearsMonth.substring(0, 4) }}年</div>
              <img src="~@/assets/yeardown.png" alt="" class="yeardown" />
            </div>
            <!-- 判断是否可以点击 -->
            <span v-if="!item.clickMark">
              <div class="disabledCorsor">
                <span>
                  {{
                    item.yearsMonth.substring(5, 6) == 0
                      ? item.yearsMonth.substring(6, 7) + '月'
                      : item.yearsMonth.substring(5, 7) + '月'
                  }}
                </span>
              </div>
            </span>
            <span v-else>
              <div
                :class="item.yearsMonth == selectMonth ? 'selectMonth' : 'monthText'"
                @click="selectClick(item.yearsMonth)"
              >
                <span v-if="item.yearsMonth == selectMonth">
                  {{ item.yearsMonth }}
                </span>
                <span v-else>
                  {{
                    item.yearsMonth.substring(5, 6) == 0
                      ? item.yearsMonth.substring(6, 7) + '月'
                      : item.yearsMonth.substring(5, 7) + '月'
                  }}
                </span>
              </div>
            </span>
          </span>
          <span v-else>
            <!-- 判断是否可以点击 -->
            <span v-if="!item.clickMark">
              <div class="disabledCorsor">
                <span>
                  {{
                    item.yearsMonth.substring(5, 6) == 0
                      ? item.yearsMonth.substring(6, 7) + '月'
                      : item.yearsMonth.substring(5, 7) + '月'
                  }}
                </span>
              </div>
            </span>
            <span v-else>
              <div
                :class="item.yearsMonth == selectMonth ? 'selectMonth' : 'monthText'"
                @click="selectClick(item.yearsMonth)"
              >
                <span v-if="item.yearsMonth == selectMonth">
                  {{ item.yearsMonth }}
                </span>
                <span v-else>
                  {{
                    item.yearsMonth.substring(5, 6) == 0
                      ? item.yearsMonth.substring(6, 7) + '月'
                      : item.yearsMonth.substring(5, 7) + '月'
                  }}
                </span>
              </div>
            </span>
          </span>
        </div>
      </div>
      <div class="iconDiv">
        <a-icon
          :class="showMonth[showMonth.length - 1].yearsMonth == lastMonth ? 'disabledIcon' : 'sjzIcon'"
          class="sjzIcon"
          type="down-circle"
          @click="downSjz"
          theme="filled"
        />
      </div>
    </div>
  </div>
</template>

<script>
import moment from 'moment'

export default {
  data() {
    return {
      // 时间轴
      monthList: [],
      showMonth: [],
      minMonthNum: 0,
      maxMonthNum: 0,
      selectMonth: '',
      // 最终日期
      lastMonth: '',
      startTime:'',
      endTime:'',
    }
  },
  created() {
    var that = this
    that.startTime = '2020-10'
    that.endTime = '2024-12'
    // 时间轴
    that.monthList = that.timeline([that.startTime, that.endTime])  //传入两个时间端,计算出所有的月份
    if (that.monthList.length >= 12) {
      that.minMonthNum = that.monthList.length - 12
      that.maxMonthNum = that.monthList.length
    } else {
      that.minMonthNum = 0
      that.maxMonthNum = that.monthList.length
    }
    that.showMonth = that.monthList.slice(that.minMonthNum, that.maxMonthNum)
    that.selectMonth = that.endTime
    that.lastMonth = that.monthList[that.monthList.length - 1].yearsMonth
  },
  methods: {
    moment,
    // 时间轴
    timeline(date) {
      const startDate = new Date(date[0])
      const endDate = new Date(date[1])
      const result = []
      while (startDate <= endDate) {
        result.push({ yearsMonth: moment(startDate).format('YYYY-MM'), clickMark: true })
        startDate.setMonth(startDate.getMonth() + 1)
      }
      return result
    },
    // 向上
    upSjz() {
      if (this.showMonth[0].yearsMonth != this.startTime) {
        this.minMonthNum = this.minMonthNum - 1
        this.maxMonthNum = this.maxMonthNum - 1
        this.showMonth = this.monthList.slice(this.minMonthNum, this.maxMonthNum)
      }
    },
    // 向下
    downSjz() {
      if (this.showMonth[this.showMonth.length - 1].yearsMonth != this.lastMonth) {
        this.minMonthNum = this.minMonthNum + 1
        this.maxMonthNum = this.maxMonthNum + 1
        this.showMonth = this.monthList.slice(this.minMonthNum, this.maxMonthNum)
      }
    },
    // 选择月份
    selectClick(item) {
      this.selectMonth = item
    },
  },
}
</script>

<style lang="less" scoped>
.sjz {
  width: 72px;
  border: 1px solid #e8e8e8;
  margin-left: 10px;
}

.iconDiv {
  text-align: center;
}

.sjzIcon {
  font-size: 16px;
  font-style: normal;
  // cursor: pointer;
  color: #1677ff;
  margin: 8px 0;
}

.disabledIcon {
  font-size: 16px;
  font-style: normal;
  // cursor: pointer;
  color: #cccccc;
  margin: 8px 0;
}

.yearClass {
  font-size: 13px;
  // font-weight: 700;
  display: inline-block;
  text-align: center;
  width: 100%;
  color: #1677ff;
  font-weight: bold;
  position: relative;
}

.monthText {
  cursor: pointer;
  color: #333;
}

.monthList {
  text-align: center;
  // color: #333;
  // font-weight: 700;
  line-height: 26px;
  font-size: 12px;
}

.selectMonth {
  background: #1677ff;
  color: #fff;
  cursor: pointer;
  // border-radius: 18px;
  display: block;
  margin: auto;
  // width: 92%;
  line-height: 26px;
}

.yeardown {
  position: absolute;
  right: 31px;
  top: 20px;
  width: 8px;
}

.disabledCorsor {
  color: #e5e5e5;
  cursor: not-allowed;
}
</style>

展示的样式
在这里插入图片描述
注意:引入 moment 插件

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hello.鑫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值