横向时间轴
初始版的效果
plus版本
初始版的实现
-
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', }]
-
实现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
-
样式
.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; } } }
-
效果
plus版本实现
- 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 };
- 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
- 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; }