用data-season-end控制提示显示时机,页面加载时读取该属性值并与当前日期比较,today >= seasonend时触发提示;新赛季月份需通过new date(endyear, endmonth + 1, 1)安全计算,避免跨月跨年错误;提示条用css transition实现opacity和transform淡入滑入动画,不阻塞lcp;关闭状态存localstorage(键为season_banner_closed_年月),支持用户免打扰。

用 data-season-end 控制提示显示时机
赛季重置提示不是靠 JS 定时轮询,而是基于服务器下发的赛季截止时间做静态判断。页面加载时读取一个 data-season-end 属性(比如 <div id="season-banner" data-season-end="2024-05-31"></div>),再用 JS 比对当前日期。这样避免客户端时间不准导致误显/漏显。
关键点:
-
data-season-end必须由后端渲染注入,不能写死在 HTML 里 - JS 中用
new Date().toISOString().slice(0, 10)获取标准格式日期("2024-05-28"),避免toLocaleDateString因时区/语言环境不同出错 - 比较逻辑要包含“当天即为最后一天”,即
today >= seasonEnd才触发提示,否则 5 月 31 日当天不会显示“即将结束”
“新赛季X月开启”文案动态生成逻辑
不要硬编码“6月”或拼接字符串。赛季起始月应从 data-season-end 推算:解析该日期,加一个月,再取 getMonth() + 1(注意 JavaScript 的 getMonth() 是 0 起始)。
常见错误:
- 直接
month + 1不处理 12 月 → 13 月,必须用new Date(endYear, endMonth + 1, 1)构造再取值 - 忽略跨年:2024-12-31 结束,新赛季是 2025-01-01,月份是 1,但年份变了——文案是否需要显示年份?需按产品需求决定,多数排行榜只写“1月”,不写“2025年1月”
- 文案中“X月”的 X 必须补零?不需要,中文语境下“6月”比“06月”自然,直接
nextMonth数字即可
CSS 实现淡入+滑入动画且不阻塞首屏
提示条默认设 opacity: 0; transform: translateY(-10px);,JS 判断需显示后才加类 active,由 CSS 过渡实现入场效果。重点不是动效多炫,而是不让它影响 LCP(最大内容绘制)。
实操建议:
- 把提示条 DOM 放在
顶部,但用position: fixed; top: 0; width: 100%;覆盖,不影响文档流布局计算 - CSS transition 只写
opacity和transform,这两项是合成属性,不触发布局重排 - JS 中用
element.classList.add("active")触发动画,别用style.opacity = 1直接改内联样式,否则无法触发 transition
用户关闭后如何记住状态并避免重复打扰
用 localStorage 存一个带赛季标识的键,比如 season_banner_closed_202405(取 data-season-end 的年月拼接)。下次加载先检查该 key 是否存在,存在则跳过显示。
注意边界:
- 用户手动清缓存 or 隐私模式下
localStorage为空,提示会再次出现——这是预期行为,无需强求“永久关闭” - 不要用
cookie,增加请求头体积,且服务端无需感知该状态 - 关闭按钮点击后,除了设 localStorage,还要立即
element.remove()或element.style.display = "none",避免 JS 仍尝试操作已隐藏元素
data-season-end="2024-05-31" 是 UTC 时间还是北京时间?必须和后端约定清楚,并在 JS 解析前统一转成本地可比格式——否则海外用户可能提前一整天看到提示。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











