请问怎么样通过定位坐标显示对应数据?

新手上路,请多包涵

需求图片
需求图片
画个大概
画个大概
代码如下

<template>
  <div class="grid">
    <div class="left-wrap">
      <div class="time">日期</div>
      <div class="time">时间</div>
      <div class="info">
        <div class="pulse">
          <div v-for="(item,i) in pulse" :key="item" >
            <span>{{item}}</span>
          </div>
        </div>
        <div class="temp">
          <div v-for="(item,i) in temp" :key="item" >
            <span>{{item}}</span>
          </div>
        </div>
      </div>
    </div>
    <div class="right-wrap">
      <div class="date-content">
        <div v-for="(date,i) in dateArr">{{date}}</div>
      </div>
      <div class="hours">
        <div v-for="(day,i) in dayArr" :key="Math.random() + day" >
          <span v-for="(hours,index) in dayArr[i]" :key="Math.random() + hours">
            {{dayArr[i][index]}}
          </span>
        </div>
      </div>
      <div class="empty-content-row">
        <div v-for="col in emptyCols" :key="Math.random() + col" class="value-content-row">
          <span v-for="row in rows" :key="Math.random() + row" class="value-block">
              <template>
                  <span class="normal"></span>
              </template>
          </span>
        </div>
      </div>
      <div v-for="col in cols" :key="Math.random() + col" class="value-content-row">
          <span v-for="row in rows" :key="Math.random() + row" class="value-block">
              <template>
                  <span v-if="lattice[(col - 1) * rows + row - 1].isShow" class="dot"></span>
                  <span class="normal" v-else>{{ lattice[(col - 1) * rows + row - 1].index }}</span>
              </template>
          </span>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      // 横排格子数
      rows: 30,
      // 纵排格子数
      cols: 13,
      // 格子总数
      latticeNum: 0,
      lattice: [{
        index: 0, // 格子索引
        isShow: false, // 是否显示
      }],
      emptyCols:1,
      // 初始化高亮数据
      lightData:[[0,3]],
      dayArr:[[2,6,10,14,18,22],[2,6,10,14,18,22],[2,6,10,14,18,22],[2,6,10,14,18,22],[2,6,10,14,18,22]],
      pulse:['脉搏',240,220,200,180,160,140,120,100,80,60,40,20],
      temp:['体温',34,35,36,37,38,39,40,41,42,43,44,45],
      dateArr:['2021-07-22','20201-07-23','20201-07-24','20201-07-25','20201-07-26']

    }
  },
  created() {
    this.latticeNum = this.rows * this.cols;
    this.getInitLightArr()
    // 给每个格子赋予正确的属性
    this.initLattice();
  },
  methods: {
    // 格子属性初始化
    initLattice() {
      let latticeArr = [];
      for (let n = 1; n < this.latticeNum +1; n++) {
        let lattice = {
          index: n
        };
        // 标记是否显示
        if(this.getInitLightArr().indexOf(n) > -1){
          lattice.isShow = true
        }
        latticeArr.push(lattice);
      }
      this.lattice = latticeArr;
    },
    //高亮数据
    getInitLightArr(){
      let num = 0
      let arr  = []
      for (let t = 0; t < this.lightData.length; t++) {
        num = (this.lightData[t][0] * this.rows) + this.lightData[t][1]
      }
      arr.push(num)
      return arr
    },
  }
}
</script>

<style lang="scss" scoped>
  .grid{
    display: flex;
    width: 1000px;
    margin: 0 auto;
    .left-wrap{
      .time{
        text-align: center;
        width: 62px;
        height: 30px;
        line-height: 30px;
        background-color: #fff;
        border: 1px solid black;
      }
      .info{
        display: flex;
        .pulse,.temp{
          span{
            margin: 0.5px;
            display: inline-block;
            width: 30px;
            height: 30px;
            line-height: 30px;
            font-size: 14px;
            color: red;
            background: #fff;
          }
        }
        .temp{
          span{
            color: blue;
          }
        }
      }
    }
    .right-wrap{
      max-width: 1200px;
      overflow: auto;
      width: 1200px;
      display: flex;
      flex-wrap: nowrap;
      flex-direction: column;
      .hours{
        display: flex;
        div{
          display: flex;
          span{
            display: inline-block;
            margin: 0.5px;
            background-color: #bbb;
            width: 30px;
            height: 30px;
            line-height: 30px;
            font-size: 14px;
            color: #fff;
            text-align: center;
            cursor: pointer;
          }
        }

      }
      .value-content-row {
        display: flex;
        flex-direction: row;
        width: fit-content;
        font-size: 0;
        .value-block {
          display: inline-block;
          margin: 0.5px;
          border:1px solid #bbb;
          width: 30px;
          height: 30px;
          line-height: 30px;
          font-size: 14px;
          color: #fff;
          text-align: center;
          cursor: pointer;
          .dot{
            display: inline-block;
            width: 10px;
            height: 10px;
            background-color: red;
            border-radius: 50%;
          }
          .normal{
            visibility: hidden;
          }
        }
      }
      .date-content{
        display: flex;
        div{
          border: 1px solid black;
          min-width: 186px;
          height: 30px;
          line-height: 30px;
          text-align: center;
        }
      }
    }
  }

</style>

横坐标是日期 1天6个小格 每一小格是4个小时
纵坐标是温度或者体温值
假如给了数据2021-07-22 2:30 温度34.5
因为一个格子左右区间是2,3,4,5小时 上下温度区间34.0 - 34.9 要如精准何定位到对应的位置显示圆点呢,麻烦大佬们指点一下

阅读 1.1k
1 个回答

可以在lattice中每一个item定义偏移标记
在getInitLightArr中判断是否在 (x,x+1]之间 并把偏移百分比传入
例如当前值是34.7 属于34这个单元格 偏移0.7 相对于单位1 就是70%;
最后在 dot span中根据偏移的百分比传入style transform: translateY(percent * 10px);

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题