横向可滑动时间轴

初始版的效果

elemrntui横向时间轴 excel做横向时间轴_elemrntui横向时间轴

初始版的实现

  1. mock数据
const list = [{
    id: 11, title: '中国17岁选手苏翊鸣,凭借第2轮88.70分的成绩,获得该项目银牌', content: '北京时间2月7日,北京2022年冬奥会短道速滑男子1000米决赛在首都体育馆展开,中国选手任子威以1:26.768的成绩获得金牌,中国选手李文龙以1:29.917的成绩获得银牌。开赛前,中国三位选手碰了碰胳膊,互相鼓劲。发令枪响起,武大靖排在第一。第二圈时,刘少昂滑到第一位。中国三位选手在中间,武大靖在第三圈时开始领滑。但随后因为冰面上有刀片,比赛因为安全原因暂停。冰面经过修整后,比赛重新开赛。大', eventDate: '2022-02-07 22:39:19',
  }, {
    id: 2, title: '春雨、范可新、张雨婷、武大靖、任子威组成的中国队以2:37.348的成绩获得金牌。', content: '在2000米混合团体接力首轮即1/4决赛中,中国队力压强敌,以小组第一晋级半决赛。半决赛上演惊心动魄一幕,因为俄罗斯奥委会队多名运动员上跑道和美国队阻挡犯规,两队被取消比赛成绩。中国队晋级决赛。中国队决赛的对手为加拿大、意大利和匈牙利队。决赛,中国队派出范可新,曲春雨、任子威和武大靖组成的主力阵容。第一次出发,弯道处就有选手摔倒,比赛不得不重新开始。第二枪顺利出发后,范可新抢到第三,意大利和加拿大', eventDate: '2022-02-05 17:34:50',
  }, {
    id: 3, title: '中国17岁选手苏翊鸣,凭借第2轮88.70分的成绩,获得该项目银牌', content: '北京时间2月7日,北京2022年冬奥会短道速滑男子1000米决赛在首都体育馆展开,中国选手任子威以1:26.768的成绩获得金牌,中国选手李文龙以1:29.917的成绩获得银牌。开赛前,中国三位选手碰了碰胳膊,互相鼓劲。发令枪响起,武大靖排在第一。第二圈时,刘少昂滑到第一位。中国三位选手在中间,武大靖在第三圈时开始领滑。但随后因为冰面上有刀片,比赛因为安全原因暂停。冰面经过修整后,比赛重新开赛。大', eventDate: '2022-02-07 22:39:19',
  }, {
    id: 8, title: '春雨、范可新、张雨婷、武大靖、任子威组成的中国队以2:37.348的成绩获得金牌。', content: '在2000米混合团体接力首轮即1/4决赛中,中国队力压强敌,以小组第一晋级半决赛。半决赛上演惊心动魄一幕,因为俄罗斯奥委会队多名运动员上跑道和美国队阻挡犯规,两队被取消比赛成绩。中国队晋级决赛。中国队决赛的对手为加拿大、意大利和匈牙利队。决赛,中国队派出范可新,曲春雨、任子威和武大靖组成的主力阵容。第一次出发,弯道处就有选手摔倒,比赛不得不重新开始。第二枪顺利出发后,范可新抢到第三,意大利和加拿大', eventDate: '2022-02-05 17:34:50',
  }, {
    id: 5, title: '中国17岁选手苏翊鸣,凭借第2轮88.70分的成绩,获得该项目银牌', content: '北京时间2月7日,北京2022年冬奥会短道速滑男子1000米决赛在首都体育馆展开,中国选手任子威以1:26.768的成绩获得金牌,中国选手李文龙以1:29.917的成绩获得银牌。开赛前,中国三位选手碰了碰胳膊,互相鼓劲。发令枪响起,武大靖排在第一。第二圈时,刘少昂滑到第一位。中国三位选手在中间,武大靖在第三圈时开始领滑。但随后因为冰面上有刀片,比赛因为安全原因暂停。冰面经过修整后,比赛重新开赛。大', eventDate: '2022-02-07 22:39:19',
  }, {
    id: 6, title: '春雨、范可新、张雨婷、武大靖、任子威组成的中国队以2:37.348的成绩获得金牌。', content: '在2000米混合团体接力首轮即1/4决赛中,中国队力压强敌,以小组第一晋级半决赛。半决赛上演惊心动魄一幕,因为俄罗斯奥委会队多名运动员上跑道和美国队阻挡犯规,两队被取消比赛成绩。中国队晋级决赛。中国队决赛的对手为加拿大、意大利和匈牙利队。决赛,中国队派出范可新,曲春雨、任子威和武大靖组成的主力阵容。第一次出发,弯道处就有选手摔倒,比赛不得不重新开始。第二枪顺利出发后,范可新抢到第三,意大利和加拿大', eventDate: '2022-02-05 17:34:50',
  }, {
    id: 7, title: '中国17岁选手苏翊鸣,凭借第2轮88.70分的成绩,获得该项目银牌', content: '北京时间2月7日,北京2022年冬奥会短道速滑男子1000米决赛在首都体育馆展开,中国选手任子威以1:26.768的成绩获得金牌,中国选手李文龙以1:29.917的成绩获得银牌。开赛前,中国三位选手碰了碰胳膊,互相鼓劲。发令枪响起,武大靖排在第一。第二圈时,刘少昂滑到第一位。中国三位选手在中间,武大靖在第三圈时开始领滑。但随后因为冰面上有刀片,比赛因为安全原因暂停。冰面经过修整后,比赛重新开赛。大', eventDate: '2022-02-07 22:39:19',
  }, {
    id: 29, title: '春雨、范可新、张雨婷、武大靖、任子威组成的中国队以2:37.348的成绩获得金牌。', content: '在2000米混合团体接力首轮即1/4决赛中,中国队力压强敌,以小组第一晋级半决赛。半决赛上演惊心动魄一幕,因为俄罗斯奥委会队多名运动员上跑道和美国队阻挡犯规,两队被取消比赛成绩。中国队晋级决赛。中国队决赛的对手为加拿大、意大利和匈牙利队。决赛,中国队派出范可新,曲春雨、任子威和武大靖组成的主力阵容。第一次出发,弯道处就有选手摔倒,比赛不得不重新开始。第二枪顺利出发后,范可新抢到第三,意大利和加拿大', eventDate: '2022-02-05 17:34:50',
  }, {
    id: 30, title: '中国17岁选手苏翊鸣,凭借第2轮88.70分的成绩,获得该项目银牌', content: '北京时间2月7日,北京2022年冬奥会短道速滑男子1000米决赛在首都体育馆展开,中国选手任子威以1:26.768的成绩获得金牌,中国选手李文龙以1:29.917的成绩获得银牌。开赛前,中国三位选手碰了碰胳膊,互相鼓劲。发令枪响起,武大靖排在第一。第二圈时,刘少昂滑到第一位。中国三位选手在中间,武大靖在第三圈时开始领滑。但随后因为冰面上有刀片,比赛因为安全原因暂停。冰面经过修整后,比赛重新开赛。大', eventDate: '2022-02-07 22:39:19',
  }, {
    id: 81, title: '春雨、范可新、张雨婷、武大靖、任子威组成的中国队以2:37.348的成绩获得金牌。', content: '在2000米混合团体接力首轮即1/4决赛中,中国队力压强敌,以小组第一晋级半决赛。半决赛上演惊心动魄一幕,因为俄罗斯奥委会队多名运动员上跑道和美国队阻挡犯规,两队被取消比赛成绩。中国队晋级决赛。中国队决赛的对手为加拿大、意大利和匈牙利队。决赛,中国队派出范可新,曲春雨、任子威和武大靖组成的主力阵容。第一次出发,弯道处就有选手摔倒,比赛不得不重新开始。第二枪顺利出发后,范可新抢到第三,意大利和加拿大', eventDate: '2022-02-05 17:34:50',
  }, {
    id: 52, title: '中国17岁选手苏翊鸣,凭借第2轮88.70分的成绩,获得该项目银牌', content: '北京时间2月7日,北京2022年冬奥会短道速滑男子1000米决赛在首都体育馆展开,中国选手任子威以1:26.768的成绩获得金牌,中国选手李文龙以1:29.917的成绩获得银牌。开赛前,中国三位选手碰了碰胳膊,互相鼓劲。发令枪响起,武大靖排在第一。第二圈时,刘少昂滑到第一位。中国三位选手在中间,武大靖在第三圈时开始领滑。但随后因为冰面上有刀片,比赛因为安全原因暂停。冰面经过修整后,比赛重新开赛。大', eventDate: '2022-02-07 22:39:19',
  }, {
    id: 83, title: '春雨、范可新、张雨婷、武大靖、任子威组成的中国队以2:37.348的成绩获得金牌。', content: '在2000米混合团体接力首轮即1/4决赛中,中国队力压强敌,以小组第一晋级半决赛。半决赛上演惊心动魄一幕,因为俄罗斯奥委会队多名运动员上跑道和美国队阻挡犯规,两队被取消比赛成绩。中国队晋级决赛。中国队决赛的对手为加拿大、意大利和匈牙利队。决赛,中国队派出范可新,曲春雨、任子威和武大靖组成的主力阵容。第一次出发,弯道处就有选手摔倒,比赛不得不重新开始。第二枪顺利出发后,范可新抢到第三,意大利和加拿大', eventDate: '2022-02-05 17:34:50',
  }]
  1. 实现js
/* eslint-disable jsx-a11y/click-events-have-key-events */
  import React from 'react'
  import { Tooltip } from 'antd'

  const EventTimeLine = ({ list, onChange, currentEvent }) => (
    <div className="eventScreen-footer">
      {list.map(item => (
        <div
          className={currentEvent === item.id ? 'selected-event' : 'event'}
          key={item.id}
          // onClick={() => {
          //   setCurrentEvent(item.id)
          // }}
          onClick={() => onChange(item.id)}
        >
          <div className="event-content">
            <div
              className="event-title"
              style={{
                overflow: 'hidden',
                display: '-webkit-box',
                '-webkit-box-orient': 'vertical',
                'text-overflow': 'ellipsis',
              }}
              title={item.title}
            >
              <Tooltip
                title={(
                  <div>
                    <div className="mb8 fac">{item.title}</div>
                    <div>{item.content}</div>
                  </div>
                )}
                color="#fff"
                overlayInnerStyle={{ color: '#000' }}
              >
                {item.title}
              </Tooltip>
            </div>
          </div>
          <div className="event-style">
            <div className={currentEvent === item.id ? 'event-crile-selected' : 'event-crile'}>
              {currentEvent === item.id ? <div className="event-crile-checked" /> : null}
            </div>
          </div>
          <div className="event-time">
            {item.eventDate}
          </div>
        </div>
      ))}
    </div>
  )

  export default EventTimeLine
  1. 样式
.eventScreen-footer {
    position: absolute;
    bottom: 0;
    width: 100%;
    height: 200px;
    background: rgba(255, 76, 0, 0.6);
    white-space: nowrap;
    overflow-y: auto;
    color: #fff;
    text-align: center;
    padding-top: 30px;

    .event-content {
      height: 80px;
      overflow: hidden;
      display: flex;
      align-items: center;
    }

    .event, .selected-event {
      width: 220px;
      display: inline-block;
      white-space: normal;
      cursor: pointer;
    }

    .event-style {
      height: 30px;
      margin-top: 16px;
      position: relative;
      border: 1px solid rgba(0, 0, 0, 0);
    }

    .event-style:before {
      content: '';
      display: block;
      width: 220px;
      height: 4px;
      margin: 13px 0;
      color: #fff;
      background: rgba(255, 255, 255, 0.6);
      position: absolute;
    }

    .event-crile {
      width: 10px;
      height: 10px;
      border-radius: 50%;
      background: #fff;
      margin: 10px auto;
    }

    .event {
      .event-title, .event-time {
        font-size: 18px;
        font-weight: 300;
      }

      .event-title {
        -webkit-line-clamp: 3;
        height: 80px;
        padding: 0 16px;
      }
    }

    .selected-event {
      .event-title {
        -webkit-line-clamp: 2;
        height: 60px;
        padding: 0 16px;
      }

      .event-title, .event-time {
        // font-size: 20px;
        font-size: 18px;
        font-weight: 700;
      }

      .event-crile-selected {
        width: 30px;
        height: 30px;
        border-radius: 50%;
        margin: 0 auto;
        background: rgba(255, 2555, 252, 0.3);
        padding: 10px;
      }

      .event-crile-checked {
        width: 10px;
        height: 10px;
        border-radius: 50%;
        background: #fff;
      }
    }
  }
  1. 效果
  2. elemrntui横向时间轴 excel做横向时间轴_时间轴_02

plus版本实现

  1. mockdata
const list = [
    {
      id: 11,
      title: "中国17岁选手苏翊鸣,凭借第2轮88.70分的成绩,获得该项目银牌",
      content:
        "北京时间2月7日,北京2022年冬奥会短道速滑男子1000米决赛在首都体育馆展开,中国选手任子威以1:26.768的成绩获得金牌,中国选手李文龙以1:29.917的成绩获得银牌。开赛前,中国三位选手碰了碰胳膊,互相鼓劲。发令枪响起,武大靖排在第一。第二圈时,刘少昂滑到第一位。中国三位选手在中间,武大靖在第三圈时开始领滑。但随后因为冰面上有刀片,比赛因为安全原因暂停。冰面经过修整后,比赛重新开赛。大",
      eventDate: "2022-02-08 22:39:19"
    },
    {
      id: 13,
      title: "中国17岁选手苏翊鸣,凭借第2轮88.70分的成绩,获得该项目银牌",
      content:
        "北京时间2月7日,北京2022年冬奥会短道速滑男子1000米决赛在首都体育馆展开,中国选手任子威以1:26.768的成绩获得金牌,中国选手李文龙以1:29.917的成绩获得银牌。开赛前,中国三位选手碰了碰胳膊,互相鼓劲。发令枪响起,武大靖排在第一。第二圈时,刘少昂滑到第一位。中国三位选手在中间,武大靖在第三圈时开始领滑。但随后因为冰面上有刀片,比赛因为安全原因暂停。冰面经过修整后,比赛重新开赛。大",
      eventDate: "2022-02-09 22:39:19"
    },
    {
      id: 15,
      title: "中国17岁选手苏翊鸣,凭借第2轮88.70分的成绩,获得该项目银牌",
      content:
        "北京时间2月7日,北京2022年冬奥会短道速滑男子1000米决赛在首都体育馆展开,中国选手任子威以1:26.768的成绩获得金牌,中国选手李文龙以1:29.917的成绩获得银牌。开赛前,中国三位选手碰了碰胳膊,互相鼓劲。发令枪响起,武大靖排在第一。第二圈时,刘少昂滑到第一位。中国三位选手在中间,武大靖在第三圈时开始领滑。但随后因为冰面上有刀片,比赛因为安全原因暂停。冰面经过修整后,比赛重新开赛。大",
      eventDate: "2022-02-10 22:39:19"
    },
    {
      id: 16,
      title: "测试。",
      content:
        "在2000米混合团体接力首轮即1/4决赛中,中国队力压强敌,以小组第一晋级半决赛。半决赛上演惊心动魄一幕,因为俄罗斯奥委会队多名运动员上跑道和美国队阻挡犯规,两队被取消比赛成绩。中国队晋级决赛。中国队决赛的对手为加拿大、意大利和匈牙利队。决赛,中国队派出范可新,曲春雨、任子威和武大靖组成的主力阵容。第一次出发,弯道处就有选手摔倒,比赛不得不重新开始。第二枪顺利出发后,范可新抢到第三,意大利和加拿大",
      eventDate: "2022-02-11 17:34:50"
    },
    {
      id: 12,
      title:
        "春雨、范可新、张雨婷、武大靖、任子威组成的中国队以2:37.348的成绩获得金牌。",
      content:
        "在2000米混合团体接力首轮即1/4决赛中,中国队力压强敌,以小组第一晋级半决赛。半决赛上演惊心动魄一幕,因为俄罗斯奥委会队多名运动员上跑道和美国队阻挡犯规,两队被取消比赛成绩。中国队晋级决赛。中国队决赛的对手为加拿大、意大利和匈牙利队。决赛,中国队派出范可新,曲春雨、任子威和武大靖组成的主力阵容。第一次出发,弯道处就有选手摔倒,比赛不得不重新开始。第二枪顺利出发后,范可新抢到第三,意大利和加拿大",
      eventDate: "2022-02-12 17:34:50"
    },
    {
      id: 17,
      title: "中国17岁选手苏翊鸣,凭借第2轮88.70分的成绩,获得该项目银牌",
      content:
        "北京时间2月7日,北京2022年冬奥会短道速滑男子1000米决赛在首都体育馆展开,中国选手任子威以1:26.768的成绩获得金牌,中国选手李文龙以1:29.917的成绩获得银牌。开赛前,中国三位选手碰了碰胳膊,互相鼓劲。发令枪响起,武大靖排在第一。第二圈时,刘少昂滑到第一位。中国三位选手在中间,武大靖在第三圈时开始领滑。但随后因为冰面上有刀片,比赛因为安全原因暂停。冰面经过修整后,比赛重新开赛。大",
      eventDate: "2022-02-13 22:39:19"
    },
    {
      id: 18,
      title:
        "春雨、范可新、张雨婷、武大靖、任子威组成的中国队以2:37.348的成绩获得金牌。",
      content:
        "在2000米混合团体接力首轮即1/4决赛中,中国队力压强敌,以小组第一晋级半决赛。半决赛上演惊心动魄一幕,因为俄罗斯奥委会队多名运动员上跑道和美国队阻挡犯规,两队被取消比赛成绩。中国队晋级决赛。中国队决赛的对手为加拿大、意大利和匈牙利队。决赛,中国队派出范可新,曲春雨、任子威和武大靖组成的主力阵容。第一次出发,弯道处就有选手摔倒,比赛不得不重新开始。第二枪顺利出发后,范可新抢到第三,意大利和加拿大",
      eventDate: "2022-02-14 17:34:50"
    },
    {
      id: 129,
      title:
        "春雨、范可新、张雨婷、武大靖、任子威组成的中国队以2:37.348的成绩获得金牌。",
      content:
        "在2000米混合团体接力首轮即1/4决赛中,中国队力压强敌,以小组第一晋级半决赛。半决赛上演惊心动魄一幕,因为俄罗斯奥委会队多名运动员上跑道和美国队阻挡犯规,两队被取消比赛成绩。中国队晋级决赛。中国队决赛的对手为加拿大、意大利和匈牙利队。决赛,中国队派出范可新,曲春雨、任子威和武大靖组成的主力阵容。第一次出发,弯道处就有选手摔倒,比赛不得不重新开始。第二枪顺利出发后,范可新抢到第三,意大利和加拿大",
      eventDate: "2022-02-20 17:34:50"
    },
    {
      id: 130,
      title: "中国17岁选手苏翊鸣,凭借第2轮88.70分的成绩,获得该项目银牌",
      content:
        "北京时间2月7日,北京2022年冬奥会短道速滑男子1000米决赛在首都体育馆展开,中国选手任子威以1:26.768的成绩获得金牌,中国选手李文龙以1:29.917的成绩获得银牌。开赛前,中国三位选手碰了碰胳膊,互相鼓劲。发令枪响起,武大靖排在第一。第二圈时,刘少昂滑到第一位。中国三位选手在中间,武大靖在第三圈时开始领滑。但随后因为冰面上有刀片,比赛因为安全原因暂停。冰面经过修整后,比赛重新开赛。大",
      eventDate: "2022-03-01 22:39:19"
    },
    {
      id: 181,
      title:
        "春雨、范可新、张雨婷、武大靖、任子威组成的中国队以2:37.348的成绩获得金牌。",
      content:
        "在2000米混合团体接力首轮即1/4决赛中,中国队力压强敌,以小组第一晋级半决赛。半决赛上演惊心动魄一幕,因为俄罗斯奥委会队多名运动员上跑道和美国队阻挡犯规,两队被取消比赛成绩。中国队晋级决赛。中国队决赛的对手为加拿大、意大利和匈牙利队。决赛,中国队派出范可新,曲春雨、任子威和武大靖组成的主力阵容。第一次出发,弯道处就有选手摔倒,比赛不得不重新开始。第二枪顺利出发后,范可新抢到第三,意大利和加拿大",
      eventDate: "2022-03-03 17:34:50"
    },
    {
      id: 152,
      title: "中国17岁选手苏翊鸣,凭借第2轮88.70分的成绩,获得该项目银牌",
      content:
        "北京时间2月7日,北京2022年冬奥会短道速滑男子1000米决赛在首都体育馆展开,中国选手任子威以1:26.768的成绩获得金牌,中国选手李文龙以1:29.917的成绩获得银牌。开赛前,中国三位选手碰了碰胳膊,互相鼓劲。发令枪响起,武大靖排在第一。第二圈时,刘少昂滑到第一位。中国三位选手在中间,武大靖在第三圈时开始领滑。但随后因为冰面上有刀片,比赛因为安全原因暂停。冰面经过修整后,比赛重新开赛。大",
      eventDate: "2022-03-14 22:39:19"
    },
    {
      id: 11,
      title: "中国17岁选手苏翊鸣,凭借第2轮88.70分的成绩,获得该项目银牌",
      content:
        "北京时间2月7日,北京2022年冬奥会短道速滑男子1000米决赛在首都体育馆展开,中国选手任子威以1:26.768的成绩获得金牌,中国选手李文龙以1:29.917的成绩获得银牌。开赛前,中国三位选手碰了碰胳膊,互相鼓劲。发令枪响起,武大靖排在第一。第二圈时,刘少昂滑到第一位。中国三位选手在中间,武大靖在第三圈时开始领滑。但随后因为冰面上有刀片,比赛因为安全原因暂停。冰面经过修整后,比赛重新开赛。大",
      eventDate: "2022-03-15 22:39:19"
    },
    {
      id: 3,
      title: "中国17岁选手苏翊鸣,凭借第2轮88.70分的成绩,获得该项目银牌",
      content:
        "北京时间2月7日,北京2022年冬奥会短道速滑男子1000米决赛在首都体育馆展开,中国选手任子威以1:26.768的成绩获得金牌,中国选手李文龙以1:29.917的成绩获得银牌。开赛前,中国三位选手碰了碰胳膊,互相鼓劲。发令枪响起,武大靖排在第一。第二圈时,刘少昂滑到第一位。中国三位选手在中间,武大靖在第三圈时开始领滑。但随后因为冰面上有刀片,比赛因为安全原因暂停。冰面经过修整后,比赛重新开赛。大",
      eventDate: "2022-03-16 22:39:19"
    },
    {
      id: 5,
      title: "中国17岁选手苏翊鸣,凭借第2轮88.70分的成绩,获得该项目银牌",
      content:
        "北京时间2月7日,北京2022年冬奥会短道速滑男子1000米决赛在首都体育馆展开,中国选手任子威以1:26.768的成绩获得金牌,中国选手李文龙以1:29.917的成绩获得银牌。开赛前,中国三位选手碰了碰胳膊,互相鼓劲。发令枪响起,武大靖排在第一。第二圈时,刘少昂滑到第一位。中国三位选手在中间,武大靖在第三圈时开始领滑。但随后因为冰面上有刀片,比赛因为安全原因暂停。冰面经过修整后,比赛重新开赛。大",
      eventDate: "2022-03-17 22:39:19"
    },
    {
      id: 7,
      title: "中国17岁选手苏翊鸣,凭借第2轮88.70分的成绩,获得该项目银牌",
      content:
        "北京时间2月7日,北京2022年冬奥会短道速滑男子1000米决赛在首都体育馆展开,中国选手任子威以1:26.768的成绩获得金牌,中国选手李文龙以1:29.917的成绩获得银牌。开赛前,中国三位选手碰了碰胳膊,互相鼓劲。发令枪响起,武大靖排在第一。第二圈时,刘少昂滑到第一位。中国三位选手在中间,武大靖在第三圈时开始领滑。但随后因为冰面上有刀片,比赛因为安全原因暂停。冰面经过修整后,比赛重新开赛。大",
      eventDate: "2022-03-18 22:39:19"
    },
    {
      id: 2,
      title:
        "春雨、范可新、张雨婷、武大靖、任子威组成的中国队以2:37.348的成绩获得金牌。",
      content:
        "在2000米混合团体接力首轮即1/4决赛中,中国队力压强敌,以小组第一晋级半决赛。半决赛上演惊心动魄一幕,因为俄罗斯奥委会队多名运动员上跑道和美国队阻挡犯规,两队被取消比赛成绩。中国队晋级决赛。中国队决赛的对手为加拿大、意大利和匈牙利队。决赛,中国队派出范可新,曲春雨、任子威和武大靖组成的主力阵容。第一次出发,弯道处就有选手摔倒,比赛不得不重新开始。第二枪顺利出发后,范可新抢到第三,意大利和加拿大",
      eventDate: "2022-04-01 17:34:50"
    },
    {
      id: 29,
      title:
        "春雨、范可新、张雨婷、武大靖、任子威组成的中国队以2:37.348的成绩获得金牌。",
      content:
        "在2000米混合团体接力首轮即1/4决赛中,中国队力压强敌,以小组第一晋级半决赛。半决赛上演惊心动魄一幕,因为俄罗斯奥委会队多名运动员上跑道和美国队阻挡犯规,两队被取消比赛成绩。中国队晋级决赛。中国队决赛的对手为加拿大、意大利和匈牙利队。决赛,中国队派出范可新,曲春雨、任子威和武大靖组成的主力阵容。第一次出发,弯道处就有选手摔倒,比赛不得不重新开始。第二枪顺利出发后,范可新抢到第三,意大利和加拿大",
      eventDate: "2022-04-02 17:34:50"
    },
    {
      id: 183,
      title:
        "春雨、范可新、张雨婷、武大靖、任子威组成的中国队以2:37.348的成绩获得金牌。",
      content:
        "在2000米混合团体接力首轮即1/4决赛中,中国队力压强敌,以小组第一晋级半决赛。半决赛上演惊心动魄一幕,因为俄罗斯奥委会队多名运动员上跑道和美国队阻挡犯规,两队被取消比赛成绩。中国队晋级决赛。中国队决赛的对手为加拿大、意大利和匈牙利队。决赛,中国队派出范可新,曲春雨、任子威和武大靖组成的主力阵容。第一次出发,弯道处就有选手摔倒,比赛不得不重新开始。第二枪顺利出发后,范可新抢到第三,意大利和加拿大",
      eventDate: "2022-04-05 17:34:50"
    },
    {
      id: 30,
      title: "中国17岁选手苏翊鸣,凭借第2轮88.70分的成绩,获得该项目银牌",
      content:
        "北京时间2月7日,北京2022年冬奥会短道速滑男子1000米决赛在首都体育馆展开,中国选手任子威以1:26.768的成绩获得金牌,中国选手李文龙以1:29.917的成绩获得银牌。开赛前,中国三位选手碰了碰胳膊,互相鼓劲。发令枪响起,武大靖排在第一。第二圈时,刘少昂滑到第一位。中国三位选手在中间,武大靖在第三圈时开始领滑。但随后因为冰面上有刀片,比赛因为安全原因暂停。冰面经过修整后,比赛重新开赛。大",
      eventDate: "2022-04-18 22:39:19"
    },
    {
      id: 81,
      title:
        "春雨、范可新、张雨婷、武大靖、任子威组成的中国队以2:37.348的成绩获得金牌。",
      content:
        "在2000米混合团体接力首轮即1/4决赛中,中国队力压强敌,以小组第一晋级半决赛。半决赛上演惊心动魄一幕,因为俄罗斯奥委会队多名运动员上跑道和美国队阻挡犯规,两队被取消比赛成绩。中国队晋级决赛。中国队决赛的对手为加拿大、意大利和匈牙利队。决赛,中国队派出范可新,曲春雨、任子威和武大靖组成的主力阵容。第一次出发,弯道处就有选手摔倒,比赛不得不重新开始。第二枪顺利出发后,范可新抢到第三,意大利和加拿大",
      eventDate: "2022-04-20 17:34:50"
    },
    {
      id: 52,
      title: "中国17岁选手苏翊鸣,凭借第2轮88.70分的成绩,获得该项目银牌",
      content:
        "北京时间2月7日,北京2022年冬奥会短道速滑男子1000米决赛在首都体育馆展开,中国选手任子威以1:26.768的成绩获得金牌,中国选手李文龙以1:29.917的成绩获得银牌。开赛前,中国三位选手碰了碰胳膊,互相鼓劲。发令枪响起,武大靖排在第一。第二圈时,刘少昂滑到第一位。中国三位选手在中间,武大靖在第三圈时开始领滑。但随后因为冰面上有刀片,比赛因为安全原因暂停。冰面经过修整后,比赛重新开赛。大",
      eventDate: "2022-05-18 22:39:19"
    },
    {
      id: 83,
      title:
        "春雨、范可新、张雨婷、武大靖、任子威组成的中国队以2:37.348的成绩获得金牌。",
      content:
        "在2000米混合团体接力首轮即1/4决赛中,中国队力压强敌,以小组第一晋级半决赛。半决赛上演惊心动魄一幕,因为俄罗斯奥委会队多名运动员上跑道和美国队阻挡犯规,两队被取消比赛成绩。中国队晋级决赛。中国队决赛的对手为加拿大、意大利和匈牙利队。决赛,中国队派出范可新,曲春雨、任子威和武大靖组成的主力阵容。第一次出发,弯道处就有选手摔倒,比赛不得不重新开始。第二枪顺利出发后,范可新抢到第三,意大利和加拿大",
      eventDate: "2022-05-24 17:34:50"
    },
    {
      id: 8,
      title:
        "春雨、范可新、张雨婷、武大靖、任子威组成的中国队以2:37.348的成绩获得金牌。",
      content:
        "在2000米混合团体接力首轮即1/4决赛中,中国队力压强敌,以小组第一晋级半决赛。半决赛上演惊心动魄一幕,因为俄罗斯奥委会队多名运动员上跑道和美国队阻挡犯规,两队被取消比赛成绩。中国队晋级决赛。中国队决赛的对手为加拿大、意大利和匈牙利队。决赛,中国队派出范可新,曲春雨、任子威和武大靖组成的主力阵容。第一次出发,弯道处就有选手摔倒,比赛不得不重新开始。第二枪顺利出发后,范可新抢到第三,意大利和加拿大",
      eventDate: "2022-06-01 17:34:50"
    },
    {
      id: 6,
      title:
        "春雨、范可新、张雨婷、武大靖、任子威组成的中国队以2:37.348的成绩获得金牌。",
      content:
        "在2000米混合团体接力首轮即1/4决赛中,中国队力压强敌,以小组第一晋级半决赛。半决赛上演惊心动魄一幕,因为俄罗斯奥委会队多名运动员上跑道和美国队阻挡犯规,两队被取消比赛成绩。中国队晋级决赛。中国队决赛的对手为加拿大、意大利和匈牙利队。决赛,中国队派出范可新,曲春雨、任子威和武大靖组成的主力阵容。第一次出发,弯道处就有选手摔倒,比赛不得不重新开始。第二枪顺利出发后,范可新抢到第三,意大利和加拿大",
      eventDate: "2022-06-03 17:34:50"
    },
    {
      id: 1183,
      title:
        "春雨、范可新、张雨婷、武大靖、任子威组成的中国队以2:37.348的成绩获得金牌。",
      content:
        "在2000米混合团体接力首轮即1/4决赛中,中国队力压强敌,以小组第一晋级半决赛。半决赛上演惊心动魄一幕,因为俄罗斯奥委会队多名运动员上跑道和美国队阻挡犯规,两队被取消比赛成绩。中国队晋级决赛。中国队决赛的对手为加拿大、意大利和匈牙利队。决赛,中国队派出范可新,曲春雨、任子威和武大靖组成的主力阵容。第一次出发,弯道处就有选手摔倒,比赛不得不重新开始。第二枪顺利出发后,范可新抢到第三,意大利和加拿大",
      eventDate: "2023-04-05 17:34:50"
    },
    {
      id: 1130,
      title: "中国17岁选手苏翊鸣,凭借第2轮88.70分的成绩,获得该项目银牌",
      content:
        "北京时间2月7日,北京2022年冬奥会短道速滑男子1000米决赛在首都体育馆展开,中国选手任子威以1:26.768的成绩获得金牌,中国选手李文龙以1:29.917的成绩获得银牌。开赛前,中国三位选手碰了碰胳膊,互相鼓劲。发令枪响起,武大靖排在第一。第二圈时,刘少昂滑到第一位。中国三位选手在中间,武大靖在第三圈时开始领滑。但随后因为冰面上有刀片,比赛因为安全原因暂停。冰面经过修整后,比赛重新开赛。大",
      eventDate: "2023-04-18 22:39:19"
    },
    {
      id: 1181,
      title:
        "春雨、范可新、张雨婷、武大靖、任子威组成的中国队以2:37.348的成绩获得金牌。",
      content:
        "在2000米混合团体接力首轮即1/4决赛中,中国队力压强敌,以小组第一晋级半决赛。半决赛上演惊心动魄一幕,因为俄罗斯奥委会队多名运动员上跑道和美国队阻挡犯规,两队被取消比赛成绩。中国队晋级决赛。中国队决赛的对手为加拿大、意大利和匈牙利队。决赛,中国队派出范可新,曲春雨、任子威和武大靖组成的主力阵容。第一次出发,弯道处就有选手摔倒,比赛不得不重新开始。第二枪顺利出发后,范可新抢到第三,意大利和加拿大",
      eventDate: "2023-04-20 17:34:50"
    },
    {
      id: 1152,
      title: "中国17岁选手苏翊鸣,凭借第2轮88.70分的成绩,获得该项目银牌",
      content:
        "北京时间2月7日,北京2022年冬奥会短道速滑男子1000米决赛在首都体育馆展开,中国选手任子威以1:26.768的成绩获得金牌,中国选手李文龙以1:29.917的成绩获得银牌。开赛前,中国三位选手碰了碰胳膊,互相鼓劲。发令枪响起,武大靖排在第一。第二圈时,刘少昂滑到第一位。中国三位选手在中间,武大靖在第三圈时开始领滑。但随后因为冰面上有刀片,比赛因为安全原因暂停。冰面经过修整后,比赛重新开赛。大",
      eventDate: "2023-05-18 22:39:19"
    },
    {
      id: 1183,
      title:
        "春雨、范可新、张雨婷、武大靖、任子威组成的中国队以2:37.348的成绩获得金牌。",
      content:
        "在2000米混合团体接力首轮即1/4决赛中,中国队力压强敌,以小组第一晋级半决赛。半决赛上演惊心动魄一幕,因为俄罗斯奥委会队多名运动员上跑道和美国队阻挡犯规,两队被取消比赛成绩。中国队晋级决赛。中国队决赛的对手为加拿大、意大利和匈牙利队。决赛,中国队派出范可新,曲春雨、任子威和武大靖组成的主力阵容。第一次出发,弯道处就有选手摔倒,比赛不得不重新开始。第二枪顺利出发后,范可新抢到第三,意大利和加拿大",
      eventDate: "2023-05-24 17:34:50"
    },
    {
      id: 1134,
      title:
        "春雨、范可新、张雨婷、武大靖、任子威组成的中国队以2:37.348的成绩获得金牌。",
      content:
        "在2000米混合团体接力首轮即1/4决赛中,中国队力压强敌,以小组第一晋级半决赛。半决赛上演惊心动魄一幕,因为俄罗斯奥委会队多名运动员上跑道和美国队阻挡犯规,两队被取消比赛成绩。中国队晋级决赛。中国队决赛的对手为加拿大、意大利和匈牙利队。决赛,中国队派出范可新,曲春雨、任子威和武大靖组成的主力阵容。第一次出发,弯道处就有选手摔倒,比赛不得不重新开始。第二枪顺利出发后,范可新抢到第三,意大利和加拿大",
      eventDate: "2023-06-01 17:34:50"
    },
    {
      id: 116,
      title:
        "春雨、范可新、张雨婷、武大靖、任子威组成的中国队以2:37.348的成绩获得金牌。",
      content:
        "在2000米混合团体接力首轮即1/4决赛中,中国队力压强敌,以小组第一晋级半决赛。半决赛上演惊心动魄一幕,因为俄罗斯奥委会队多名运动员上跑道和美国队阻挡犯规,两队被取消比赛成绩。中国队晋级决赛。中国队决赛的对手为加拿大、意大利和匈牙利队。决赛,中国队派出范可新,曲春雨、任子威和武大靖组成的主力阵容。第一次出发,弯道处就有选手摔倒,比赛不得不重新开始。第二枪顺利出发后,范可新抢到第三,意大利和加拿大",
      eventDate: "2023-06-03 17:34:50"
    }
  ];

  export { list };
  1. jsx
import moment from 'moment'
  import React, {useEffect, useState} from 'react'
  import {Tooltip} from 'antd'
  import _ from 'lodash'
  // eslint-disable-next-line import/no-unresolved
  import './time-line.styl'

  const TimeLine = () => {
    const [upData, setUpdata] = useState([])
    const [downData, setDowndata] = useState([])
    const [currentEvent, setcurrentEvent] = useState(0)
    const [dateList, setDateList] = useState({})
    
    useEffect(() => {
      const uData = []
      const dData = []
      const newdatEList = {}
      list.forEach((item, index) => {
        const itemYear = moment(item.eventDate).get('year')
        const str = moment(item.eventDate).format('YYYY-M')
        if (newdatEList[itemYear]) {
          newdatEList[itemYear] = [
            ...newdatEList[itemYear], 
            newdatEList[itemYear].includes(str) ? '0000-00' : str,
          ]
        } else {
          newdatEList[itemYear] = [str]
          // 这一年的第一条数据
          // index % 2 === 0
          
          index && uData.push({CurrentYearNO1: true, id: `upzw${index}`})
          index && dData.push({CurrentYearNO1: true, id: `downzw${index}`})
          // item.CurrentYearNO1 = true
        }
        if (index % 2 === 0) {
          uData.push(item)
        } else {
          dData.push(item)
        }
      })
      
      setUpdata(uData)
      setDowndata(dData)
      setDateList(newdatEList)
    }, [list])

    return ( 
      <div className="eventScreen-footer">
        <div className="main-timeline">
          <div className="FBH FBAC">
            {
              upData.map((item, index) => (item.CurrentYearNO1 ? (<div className="timelinezw FBV FBJE "> </div>) : (
                <div
                  className={currentEvent === item.id ? 'timeline FBV FBJE hand active' : 'timeline FBV FBJE hand'}
                  style={{marginLeft: index === 0 ? '80px' : '0px'}}
                  onClick={() => setcurrentEvent(item.id)}
                >
                  <div className="hand omit2">
                    <Tooltip
                      title={(
                        <div className="toolTip-content">
                          <div className="mb8 fac">{item.title}</div>
                          <div>{item.content}</div>
                        </div>
                      )}
                      overlayClassName="toolTip"
                      color="rgba(73,193,193,1)"
                    >
                      {item.title}
                    </Tooltip>
                  </div>
                  <div>{item.eventDate}</div>
                </div>
              )))
            }
          </div>
          <div className="line FBH">
            {Object.keys(dateList).map(el => (
              <>
                <div className="year">{el}</div>
                {dateList[el].map(item => {
                  const arr = _.split(item, '-')
                  if (arr[1] && arr[1] !== '00') {
                    return (
                      <div className="line-date">
                        {arr[1]}
                        月
                      </div>
                    )
                  } 
                  return <div className="other-box"> </div>
                })}
                <div className="last-box"> </div>
              </>
            ))}
            
          </div>
          <div className="FBH FBAC">
            {
              downData.map((item, index) => (item.CurrentYearNO1 ? (
                <div className="timelinezw FBV FBJE "> </div>
              ) : (
                <div
                  className={currentEvent === item.id ? 'timeline bottom FBV FBJS hand active' : 'timeline bottom FBV FBJS hand'}
                  style={{marginLeft: index === 0 ? '190px' : '0'}}
                  onClick={() => setcurrentEvent(item.id)}
                >
                  <div>{item.eventDate}</div>
                  <div className="hand omit2">
                    <Tooltip
                      title={(
                        <div className="toolTip-content">
                          <div className="mb8 fac">{item.title}</div>
                          <div>{item.content}</div>
                        </div>
                      )}
                      overlayClassName="toolTip"
                      color="rgba(73,193,193,1)"
                    >
                      {item.title}
                    </Tooltip>
                  </div>
                </div>
              )))
            }
          </div>
        </div>
      </div>
    )
  }

  export default TimeLine
  1. styl(stylus)
#root {
    position: absolute;
    top: 0;
    width: 100%;
    height: 100%;
    background: #00383e;
  }

  .omit {
    overflow: hidden;
    text-overflow: ellipsis;
    word-break: keep-all;
    white-space: nowrap;
  }

  for $n in 2 3 4 5 {
    .omit{$n} {
      overflow: hidden;
      text-overflow: ellipsis;
      display: -webkit-box;
      -webkit-line-clamp: $n;
      /* autoprefixer: off */
      -webkit-box-orient: vertical;
    }
  }

  .hand {
    cursor: pointer;
  }

  .FBH, .FBV {
    display: flex;
  }

  .FBV {
    flex-direction: column;
  }

  .FBAS {
    align-items: flex-start;
  }

  .FBAC {
    align-items: center;
  }

  .eventScreen-footer {
    position: absolute;
    bottom: 0;
    width: 100%;
    height: 200px;
    background: rgba(10, 10, 10, 0.8);
    overflow-y: auto;
    color: #fff;
    text-align: center;

    .main-timeline {
      position: relative;
      width: 100%;
      height: 100%;

      .line {
        height: 32px;
        margin: auto 0;
        position: absolute;
        top: calc(50% - 16px);
        left: 0;
        background-image: linear-gradient(180deg, #D8B432 0%, #FDFD59 48%, #AE6B00 100%);

        .year {
          min-width: 80px;
          font-family: PingFang-SC-Heavy;
          font-size: 28px;
          line-height: 32px;
          color: #5F3A00;
          text-align: center;
        }

        .other-box {
          min-width: 110px;
        }

        .line-date {
          min-width: 100px;
          font-family: PingFang-SC-Heavy;
          font-size: 20px;
          color: #5F3A00;
          border-left: #5F3A00 solid 1px;
          padding-left: 8px;
          margin-left: 10px;
          text-align: left;
        }

        .last-box {
          min-width: 110px;
        }
      }

      .timeline {
        min-width: 220px;
        height: 84px;
        padding: 8px;
        position: relative;
        float: left;

        &:before {
          content: '';
          position: absolute;
          left: 50%;
          bottom: -5px;
          width: 6px;
          height: 6px;
          background: linear-gradient(45deg, #FFFFFF, transparent 70%, transparent 100%, #FFFFFF 50%);
          transform: rotate(-45deg);
          transform-origin: left bottom;
          z-index: 10;
        }
      }

      .timelinezw {
        height: 84px;
        min-width: 220px;
        height: 84px;
        position: relative;
        float: left;
      }

      .bottom {
        margin-top: 32px;

        &:before {
          content: '';
          position: absolute;
          top: -11px;
          bottom: 0;
          left: 50%;
          width: 6px;
          height: 6px;
          background: linear-gradient(45deg, #FFFFFF, transparent 70%, transparent 100%, #FFFFFF 50%);
          transform: rotate(135deg);
          transform-origin: left bottom;
          z-index: 10;
        }
      }

      .active {
        background: #005761;
      }
    }
  }

  .toolTip {
    .ant-tooltip-inner {
      padding: 1px;
    }
  }

  .toolTip-content {
    background: #030C02;
    padding: 6px 8px;
  }

  .layer-tooltip {
    position: absolute;
    z-index: 100;
    font-size: 12px;
    padding: 2px 8px 8px;
    background: rgba(23, 109, 202, 1);
    color: #fff;
    min-width: 160px;
    max-height: 240px;
    overflow-y: hidden;
    border: #fff solid 1px;
    border-radius: 5px;

    .title {
      font-size: 18px;
      color: #FFFFFF;
      font-weight: 700;
    }

    .layer-content {
      font-size: 14px;
      color: #FFFFFF;
      line-height: 22px;
      font-weight: 700;
    }
  }

  .layer-toolTip.interactive {
    pointer-events: all;
    background: #fcfcfc;
    color: #444;
    overflow-y: auto;
  }