高清视频播放器大全 - 全网最新好看的高清电影热播电视剧全集_手机免费在线观看-星光影视 注意:需求里说不要出现 canonical。好。 接下来是样式。我写一版像样的 CSS。 要用的 CSS 变量: --bg:#0b0e13; --bg2:#121722; --card:#161c28; --line:#242c3b; --txt:#e8edf6; --dim:#93a0b5; --acc:#ffb03a; --acc2:#43d9c4; 字体用 system-ui。 顶部 header:sticky 定位,背景模糊。 开始写各个组件: .site-header .header-inner .brand(logo SVG + 文字) nav.main-nav 放链接:首页 #top、电影 #hot-movie、电视剧 #hot-tv、综艺 #variety、动漫 #anime、资讯 #news、留言 #comments .search-box(input + 按钮) .menu-toggle 给移动端用 移动端导航:切换 class 来显示。 面包屑放在 header 下面。 首屏区:
.hero-main(大 banner) .hero-side(两个堆叠 banner) 每个 banner 有图片、角标、标题、副标题、播放按钮。 锚点导航条(锚点导航条):一行胶囊链接,指向各个锚点。 主栅格:
...
...
...
...
...
...
...
``` 嗯,但是侧边栏 sticky 而且很长的话——没问题。 其实让侧边栏包含:本周热榜、题材标签云、编辑推荐、剧集更新日历?保持可控。 卡片: html 复制 下载 运行
... 更新至24集 9.2
▶

标题

2024 · 科幻 · 悬疑

同类推荐
点击整张卡片(排除底部按钮)会打开详情模态框。所以要绑定 click 处理器,但要检查 e.target 是否在 .card-foot 里。 底部按钮有“预约”/“播放”——但这些是按钮,本来就不该触发模态框。等一下,需求里说的是卡片点击要打开模态框,但底部按钮本身不算。那底部按钮应该做点别的(模拟播放/预约)。行——它们可以切换状态。 嗯,但“禁止出现提交功能”——评论只做展示。这个没问题。 我改用 data 属性来驱动模态框内容。 JS 部分: 从卡片点击打开模态框 关闭按钮 / 点击遮罩关闭 按钮切换(预约 → 已预约) 移动端导航切换 模拟“播放”——弹个 toast?也许是简单提示。可以加个小 toast。保持轻量。 其实要避免复杂化。但“点击反馈(非死链)”——所有链接都指向锚点,可以。 接下来写模态框的 HTML: html 复制 下载 运行 数据我打算存在卡片的 data 属性里,用 data-* 来承载。 然后是内容。得写点原创的文案,带点 SCQA 的感觉,把关键词也自然地嵌进去。 标题(H1):全网最新好看的高清电影热播电视剧全集 手机免费在线观看 嗯,H1 要唯一,把主关键词放进去。 接下来写各个板块的文案。 我会认真写文案,但控制好篇幅。 主内容列:
01

高清电影 · 院线新片与冷门佳作

全部 →

...带锚点链接的文案...

6 张卡片
等等,带锚点的引言段落——锚文本指向本页的锚点。 我会放几段正文,用 高清电影 这种写法。 现在算一下关键词密度——只要自然就行,别硬堆。 现在开始写全部内容。 带数字的卡片数据: 热门电影(6 部): 003-movie — 《逆流风暴》 2025 · 动作犯罪 · 豆瓣 8.4 016-movie — 《第七个夜晚》 2024 · 悬疑惊悚 031-movie — 《山与海之间》 2023 · 剧情文艺 043-movie — 《像素猎人》 2025 · 科幻冒险 057-movie — 《老城旧事》 2024 · 家庭温情 067-movie — 《寂静频率》 2025 · 灾难悬疑 热播电视剧(6 部): 007-tv — 《长夜灯明》 全 40 集 021-tv — 《千机变》 更新至 28 集 033-tv — 《归途列车》 全 32 集 045-tv — 《暗涌之城》 更新至 19 集 059-tv — 《春日不晚》 全 24 集 069-tv — 《医者仁心》 更新至 35 集 等等,我是不是把 033 分给 anime 了,要理清楚。 让我先把最终图片分配固定下来: Banner:012-banner.webp、047-banner.webp、073-banner.webp Avatar:006-avatar.webp、018-avatar.webp、029-avatar.webp、041-avatar.webp、055-avatar.webp 内容: 003-movie 007-tv 009-anime 011-variety 014-manga 016-movie 021-tv 023-anime 025-variety 027-manga 031-movie 033-tv 035-anime 037-variety 039-manga 043-movie 045-tv 049-anime 051-variety 053-manga 057-movie 059-tv 061-anime 063-variety 065-manga 067-movie 069-tv 071-anime 075-variety 077-manga 079-movie 081-tv 083-anime 085-variety 087-manga 089-movie 091-tv 093-anime 095-variety 097-manga 099-movie 总数:41 张内容图 + 3 张 banner + 5 张头像 = 49。数字都是唯一的。可以。 现在分配: 热门电影 (6):003-movie、016-movie、031-movie、043-movie、057-movie、067-movie 热播电视剧 (6):007-tv、021-tv、033-tv、045-tv、059-tv、069-tv 综艺 (6):011-variety、025-variety、037-variety、051-variety、063-variety、075-variety 动漫 (6):009-anime、023-anime、035-anime、049-anime、061-anime、071-anime 漫画改编/二次元 (4):014-manga、027-manga、039-manga、053-manga……嗯 实际上让我把漫画改编放到一个“漫画改编”板块,或者并进动漫里。但也许直接用: 今日更新横向滚动条:用一批,比如 085、087、089、091、093、095、097、099——8 张卡片。 资讯:不需要图片,或者用头像。 嗯,那我还剩一些没用完的:014-manga、027-manga、039-manga、053-manga、065-manga、077-manga、079-movie、081-tv、083-anime、085-variety、087-manga、089-movie、091-tv、093-anime、095-variety、097-manga、099-movie 让我把“今日更新”横向滚动条重新分配一下,用其中的 8 个:079-movie、081-tv、083-anime、085-variety、087-manga、089-movie、091-tv、093-anime 嗯,但那样“今日更新”里的条目和下面的分类就重复了。其实也没关系,真实站点经常这样。不过为了卡片各不相同,还是分开吧。 其实更简单:干脆不要横向滚动条了,或者把它做成“最新更新”列表,配上小缩略图——用剩下的图。 重新整理一下: 板块: 今日更新横滑条——8 个条目用 095-variety、097-manga、099-movie……嗯,我还需要更多。 干脆直接用: 今日更新(横滑,8 个):014-manga、027-manga、039-manga、053-manga、065-manga、077-manga、087-manga、097-manga——不行,全是漫画,太单调了。 好,这样吧,重新分配: 今日更新横滑(6 个条目):079-movie、081-tv、083-anime、085-variety、087-manga、089-movie 热门电影(6):003-movie、016-movie、031-movie、043-movie、057-movie、067-movie 热播电视剧(6):007-tv、021-tv、033-tv、045-tv、059-tv、069-tv 综艺(6):011-variety、025-variety、037-variety、051-variety、063-variety、075-variety 动漫(6):009-anime、023-anime、035-anime、049-anime、061-anime、071-anime 漫画改编(4):014-manga、027-manga、039-manga、053-manga 侧边栏榜单纯列表,不用图。 资讯——不用图。 那还剩下:065-manga、077-manga、091-tv、093-anime、095-variety、097-manga、099-movie——一共 7 张没用上。 嗯,我可以把它们加到侧边栏的“编辑推荐”里带小缩略图,或者再加一个板块。 加一个“高分经典”板块?或者一个“漫改专区”……其实让我把漫画改编扩到 6 部,用 014、027、039、053、065、077,然后把 091、093、095、097、099 用到侧边栏的“编辑精选”里——5 个条目带小图。好。 好,现在所有 41 张内容图都用上了。 等等,再加上 3 张 banner 和 5 张头像 = 总共 49 张。没问题。 嗯,但是侧边栏的“编辑精选”带 5 张缩略图,会把侧边栏撑得很长。没关系。 其实我再考虑一下——还是把侧边栏缩减一下:本周热榜(带名次的文字列表)、题材标签云、编辑精选(3 条带缩略图)、追剧日历。 用 091-tv、093-anime、095-variety 做编辑精选。097-manga、099-movie 就……嗯,用不上。算了,就让它们空着。其实我应该把 099-movie 也塞进热门电影里。 好吧:热门电影——用 099-movie 换掉 067?不行,两个都留着,热门电影改成 7 张卡?网格其实是 3 列…… 不然把今日更新横滑区扩到 8 个吧,把 097-manga 和 099-movie 加进去。对,就这样。 今日更新(8 个):079-movie、081-tv、083-anime、085-variety、087-manga、089-movie、097-manga、099-movie 嗯,两个 movie 有点重复,但也不是不行。其实换成这些更好:079-movie、081-tv、083-anime、085-variety、087-manga、089-movie、097-manga、099-movie —— 好了,就这样。 现在所有图片都用上了。 图片命名唯一性检查: 003、007、009、011、012、014、016、018、021、023、025、027、029、031、033、035、037、039、041、043、045、047、049、051、053、055、057、059、061、063、065、067、069、071、073、075、077、079、081、083、085、087、089、091、093、095、097、099 全部唯一 ✓ 现在开始写。 评论区头像用这 5 张头像图。 好,开始写代码。 CSS 细节: css 复制 下载 *{box-sizing:border-box;margin:0;padding:0} :root{--bg:#0a0d12;--bg2:#10151d;--card:#141a24;--line:#232c3a;--txt:#e9eef7;--dim:#8b98ad;--acc:#ffb03a;--acc2:#3ddc97;--rad:14px} body{background:var(--bg);color:var(--txt);font-family:system-ui,-apple-system,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;line-height:1.7;-webkit-font-smoothing:antialiased} 等等——需要一个微妙的背景纹理,也许用径向渐变。 顶部 header 粘性定位。 现在让我写头部: html 复制 下载 运行 等等,“禁止出现提交功能”——这指的是评论提交。搜索框带 onsubmit return false 应该没问题……不过稳妥起见,还是用带 button 的 div 来做吧,别用 form。就搞个 div 容器。 这个 logo 的 SVG 要设计一下:一个简单的星形/胶片元素。 html 复制 下载 运行 嗯,就这样吧,还行。 其实胶片式 logo 可能更好看。不过现在这个也可以。 然后就是面包屑导航: html 复制 下载 运行 首屏区域: html 复制 下载 运行
最新高清电影热播电视剧推荐
本周热度 TOP1

长夜灯明

...

查看剧集
...047-banner...
...073-banner...
首屏大图上的 H2——不过要记住,页面上只有一个 H1 放在别处。 等等,那 H1 到底放哪?应该放在靠顶部、能看见的地方。要不放首屏文案里?但首屏展示的是具体作品的标题…… 我可以加一个首屏标题区,把 H1 放进去。其实,还是让 H1 作为页面标题放在 hero 区块上面,或者放进 hero 里。 其实最干净的做法是:面包屑之后,放一个“页面导语”区块,里面用 H1,然后再跟 hero 展示。 嗯,不过视觉上,hero 大图先出现会更好看。那 H1 就做成首屏上的一条通栏标题?这样: html 复制 下载 运行

高清视频播放器大全|全网最新好看的高清电影热播电视剧全集手机免费在线观看

...

放在 hero 下面?不行,还是放 hero 上面更好,对 SEO 更友好。其实视觉上 H1 夹在面包屑和 hero 之间也没问题,加一点样式就行。 那就先这样定:面包屑 → 带 H1 的页面导语(紧凑样式,带一点微妙的渐变文字)→ hero 展示 → 锚点导航条 → 布局。 导语: html 复制 下载 运行

全网最新好看的高清电影热播电视剧全集 · 手机免费在线观看

每天 10:00 与 20:00 双时段更新,院线新片、卫视同步剧、独播综艺、新番动画一站追完,支持手机、平板、电脑多端自适应播放。

嗯,H1 带“·”,应该没问题。 然后是锚点导航条: html 复制 下载 运行 做成吸顶滚动?也许就普通滚动就行。 接下来是布局网格。 css 复制 下载 .layout{display:grid;grid-template-columns:minmax(0,1fr) 320px;gap:28px} @media (max-width:1024px){.layout{grid-template-columns:1fr}} 左列放各个板块。 板块头部: html 复制 下载 运行
01

高清电影

院线新片 · 冷门佳作 · 高分修复
查看全部 →
卡片网格: css 复制 下载 .vod-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:18px} 海报宽高比用 2/3。 然后是卡片: html 复制 下载 运行
高清电影逆流风暴在线观看 8.4 HD 国语 ▶

逆流风暴

2025 · 动作 · 犯罪

等等——底部按钮不应该触发模态框。没问题,在 JS 里检查一下。 .img-fail 的 CSS:显示一个渐变,再加一个 "▶" 伪元素。 css 复制 下载 .poster.img-fail{background:linear-gradient(140deg,#1d2534,#2a3446);display:flex;align-items:center;justify-content:center} .poster.img-fail::after{content:"🎬";font-size:2rem;opacity:.35} 加载占位的闪光效果: css 复制 下载 .poster{position:relative;aspect-ratio:2/3;border-radius:12px;overflow:hidden;background:linear-gradient(100deg,#161d29 30%,#1e2735 50%,#161d29 70%);background-size:220% 100%;animation:shimmer 1.6s linear infinite} @keyframes shimmer{to{background-position:-220% 0}} 但一旦图片加载出来,动画还在背景里跑着。这倒也无所谓,反正被盖住了。不过动画会一直消耗性能……其实也能接受。要么就加个 img:not([src]) 之类的判断——算了,保持简单吧。其实我也可以让 JS 在 load 事件触发时移除这个动画。还是简单点:只做背景闪光,不纠结了。 嗯,为了性能,还是用 .poster img{opacity:0;transition:opacity .4s} 加个 JS 监听,或者用内联 onload="this.style.opacity=1" 来实现淡入效果。 对: html 复制 下载 运行 CSS:.poster img{opacity:0;transition:opacity .45s ease}.poster img.is-loaded{opacity:1} 不错。 接下来是侧边栏。 html 复制 下载 运行 等等,我之前计划用 091-tv、093-anime、095-variety 来做编辑精选。但 091-tv 这类图没用过,对,没问题。 嗯,其实我好像把 091、093、095 分给“今日更新”了?没有——今日更新用的是 079、081、083、085、087、089、097、099。所以 091、093、095 是空着的。好。 等等,但我又把 097-manga 和 099-movie 加到今日更新里了。让我重新数一下今日更新:079-movie、081-tv、083-anime、085-variety、087-manga、089-movie、097-manga、099-movie = 8 个。好。 编辑精选:091-tv、093-anime、095-variety = 3 个。 现在确认一下:003-movie ✓、007-tv ✓、009-anime ✓、011-variety ✓、012-banner ✓、014-manga ✓、016-movie ✓、018-avatar ✓、021-tv ✓、023-anime ✓、025-variety ✓、027-manga ✓、029-avatar ✓、031-movie ✓、033-tv ✓、035-anime ✓、037-variety ✓、039-manga ✓、041-avatar ✓、043-movie ✓、045-tv ✓、047-banner ✓、049-anime ✓、051-variety ✓、053-manga ✓、055-avatar ✓、057-movie ✓、059-tv ✓、061-anime ✓、063-variety ✓、065-manga ✓、067-movie ✓、069-tv ✓、071-anime ✓、073-banner ✓、075-variety ✓、077-manga ✓、079-movie ✓、081-tv ✓、083-anime ✓、085-variety ✓、087-manga ✓、089-movie ✓、091-tv ✓、093-anime ✓、095-variety ✓、097-manga ✓、099-movie ✓。全部到位。 但是等等,banner 图和头像图——目前只在轮播/导航头里用到了 3 张 banner 和 5 张头像。可以。 现在来写资讯板块。用 H3 列表,配上时间戳和摘要。 FAQ 用 details/summary 来做。 评论区:头像 + 昵称 + 时间 + 文字 + 点赞数。纯展示。 然后是底部:多栏带锚点链接,版权信息。 再然后是 JSON-LD。 现在仔细写所有内容。 现在开始写实际的代码。 模态框的 JS: js 复制 下载 const modal=document.getElementById('detailModal'); ... document.querySelectorAll('.vod-card').forEach(card=>{ card.addEventListener('click',e=>{ if(e.target.closest('.card-foot'))return; openModal(card); }); }); 另外,键盘事件要不要处理?tabindex 加了,加上 Enter 键。 openModal 读取 data-* 属性并填充。 用一个小的 toast 做反馈。 按钮点击: js 复制 下载 document.querySelectorAll('.js-fav').forEach(b=>b.addEventListener('click',function(){this.classList.toggle('is-on');this.textContent=this.classList.contains('is-on')?'✓ 已预约':'♡ 预约';})); 播放按钮要弹出 toast:“正在为你接入播放源…”。 嗯,“模拟播放/预约入口”——对,这样可以。 现在给模态框写代码: js 复制 下载 function openModal(card){ modalImg.src=card.dataset.img; modalImg.alt=card.dataset.title+' 高清在线观看'; modalTitle.textContent=card.dataset.title; modalMeta.textContent=card.dataset.meta; modalScore.textContent=card.dataset.score; modalDesc.textContent=card.dataset.desc; modalInsight.textContent=card.dataset.insight; modalTags.innerHTML=card.dataset.tags.split(',').map(t=>`${t}`).join(''); modal.classList.add('is-open'); document.body.style.overflow='hidden'; } 好。 现在开始写全部内容。要写详细但不啰嗦。 得想想每张卡片的文案——每张都要有 data-desc 和 data-insight。量不小,但还是写吧。每张卡片给 1 到 2 句话。 我现在开始打草稿。 一、高清电影: 逆流风暴 (003-movie) 2025 · 动作犯罪 · 8.4 desc:一场台风夜里的押运车劫案,把退役特警和黑市掮客同时困在跨海大桥上。导演用近乎实拍的暴雨调度,让全片 70% 的对白都消失在风里,只能靠眼神和动作推进叙事。 insight:该片在院线拿下 12.7 亿票房,却意外落选年度最佳动作设计提名;片尾字幕里藏了三个与前作呼应的车牌号,二刷观众才看得出来。 第七个夜晚 (016-movie) 2024 · 悬疑惊悚 · 8.1 山与海之间 (031-movie) 2023 · 剧情文艺 · 8.6 像素猎人 (043-movie) 2025 · 科幻冒险 · 7.9 老城旧事 (057-movie) 2024 · 家庭温情 · 8.3 寂静频率 (067-movie) 2025 · 灾难悬疑 · 8.0 二、热播电视剧: 长夜灯明 (007-tv) 全 40 集 · 9.2 千机变 (021-tv) 更新至 28 集 · 8.7 归途列车 (033-tv) 全 32 集 · 8.9 暗涌之城 (045-tv) 更新至 19 集 · 8.5 春日不晚 (059-tv) 全 24 集 · 8.2 医者仁心 (069-tv) 更新至 35 集 · 8.8 三、综艺: 山海厨房 (011-variety) 声浪计划 (025-variety) 一路向北 (037-variety) 灵感实验室 (051-variety) 深夜茶馆 (063-variety) 舞台之外 (075-variety) 四、动漫: 星轨列车 (009-anime) 雾都异闻录 (023-anime) 剑与灯笼 (035-anime) 机械之心 (049-anime) 猫町奇谭 (061-anime) 千面之城 (071-anime) 五、漫画改编: 墨色江湖 (014-manga) 纸上传奇 (027-manga) 幻境笔记 (039-manga) 少年白夜 (053-manga) 铁塔之下 (065-manga) 三百六十一行 (077-manga) 今日更新(横向滚动): 079-movie 《回声谷》2025 081-tv 《双城档案》更新至 12 集 083-anime 《夏日信标》更新至 08 话 085-variety 《周末出发吧》2026-10-02 期 087-manga 《山海绘卷》更新至 45 话 089-movie 《午夜航班》2024 097-manga 《折纸少年》更新至 31 话 099-movie 《沙丘之外》2025 嗯,等等,我这 8 部混着来,跨类型是没问题。 编辑精选:091-tv《风起南岸》、093-anime《拾光者》、095-variety《深夜食堂·特别季》 好,行。 现在开始写文案段落,带锚文本。 板块导语段落,比如 #hot-movie: “院线撤档、平台独播、修复重映,最近的高清电影市场几乎每周都在换血。真正值得花两小时的作品,往往藏在排片表的后三页——这也是我们把本周热播榜和评分数据并排展示的原因。” 嗯,锚文本密度。每个段落埋 2-3 个锚链接就行。 现在开始写 HTML。 我得注意长度——这会很长。但没关系。 现在把 CSS 完整写出来。 css 复制 下载 *,*::before,*::after{box-sizing:border-box;margin:0;padding:0} :root{ --bg:#080b11; --bg-soft:#0e131b; --card:#131a25; --card-2:#182130; --line:#222c3c; --txt:#e8eef8; --dim:#8d9bb1; --acc:#ffb43a; --acc2:#39d9a6; --rad:14px; --shadow:0 18px 40px -20px rgba(0,0,0,.9); } html{scroll-behavior:smooth;scroll-padding-top:88px} body{ background:var(--bg); background-image:radial-gradient(900px 500px at 12% -8%,rgba(255,180,58,.09),transparent 60%),radial-gradient(800px 500px at 92% 4%,rgba(57,217,166,.07),transparent 62%); color:var(--txt); font-family:system-ui,-apple-system,'Segoe UI',Roboto,Helvetica,Arial,sans-serif; font-size:15px;line-height:1.7; -webkit-font-smoothing:antialiased; overflow-x:hidden; } img{max-width:100%;display:block} a{color:inherit;text-decoration:none} button{font:inherit;color:inherit;background:none;border:0;cursor:pointer} .wrap{width:min(1240px,100% - 32px);margin-inline:auto} 接着是头部样式: css 复制 下载 .site-header{position:sticky;top:0;z-index:60;backdrop-filter:blur(14px);background:rgba(8,11,17,.86);border-bottom:1px solid var(--line)} .header-inner{display:flex;align-items:center;gap:18px;height:64px} .brand{display:flex;align-items:center;gap:9px;flex:none} .brand-mark{width:34px;height:34px;flex:none} .brand-text{font-size:19px;font-weight:800;letter-spacing:.5px;white-space:nowrap} .brand-text em{font-style:normal;color:var(--acc)} .main-nav{display:flex;align-items:center;gap:2px;flex:1;overflow:hidden} .main-nav a{padding:7px 11px;border-radius:999px;font-size:14px;color:var(--dim);white-space:nowrap;transition:.22s} .main-nav a:hover{color:var(--txt);background:var(--card-2)} .main-nav a.is-active{color:#12161d;background:linear-gradient(120deg,var(--acc),#ffd07a);font-weight:700} .search-box{display:flex;align-items:center;flex:none;background:var(--card);border:1px solid var(--line);border-radius:999px;padding:4px 6px 4px 14px} .search-box input{background:none;border:0;outline:none;color:var(--txt);width:150px;font-size:13px} .search-box button{width:30px;height:30px;border-radius:50%;background:var(--card-2);font-size:13px} .nav-toggle{display:none;font-size:20px;padding:6px 10px;border-radius:10px;background:var(--card)} 响应式:小于 1000px 时隐藏 .main-nav 和 search?还是把 nav 折叠到汉堡菜单下面吧。 css 复制 下载 @media(max-width:1080px){ .search-box{display:none} } @media(max-width:900px){ .main-nav{position:fixed;inset:64px 0 auto 0;flex-direction:column;align-items:stretch;background:rgba(10,14,20,.98);padding:10px 16px 18px;border-bottom:1px solid var(--line);gap:4px;max-height:0;overflow:hidden;transition:max-height .3s;padding:0 16px} .main-nav.is-open{max-height:420px;padding:10px 16px 18px} .main-nav a{padding:11px 12px;border-radius:10px} .nav-toggle{display:block;margin-left:auto} } 嗯,汉堡按钮的显示位置。也行吧。 其实手机上我关了 .search-box,但还想让搜索露个脸。把 .search-box 改成整行显示算了。先简单点:<=1080 隐藏,可以接受。 不过更好的做法是:移动端把 .search-box 放进导航面板里。但先这样吧。 面包屑: css 复制 下载 .crumbs{display:flex;flex-wrap:wrap;gap:8px;align-items:center;padding:14px 0 4px;font-size:13px;color:var(--dim)} .crumbs a{color:var(--dim);border-bottom:1px dashed transparent} .crumbs a:hover{color:var(--acc);border-color:var(--acc)} .crumbs strong{color:var(--txt);font-weight:600} 页面导语: css 复制 下载 .page-lead{padding:14px 0 22px} .page-lead h1{font-size:clamp(21px,3.4vw,34px);line-height:1.35;font-weight:800;letter-spacing:-.3px;background:linear-gradient(100deg,#fff 20%,#ffd79a 70%,#8ff0cd);-webkit-background-clip:text;background-clip:text;color:transparent} .lead-sub{margin-top:10px;color:var(--dim);font-size:14px;max-width:820px} .lead-chips{display:flex;flex-wrap:wrap;gap:8px;margin-top:14px} .lead-chips a{font-size:12.5px;padding:5px 12px;border-radius:999px;border:1px solid var(--line);background:rgba(255,255,255,.02);color:var(--dim);transition:.22s} .lead-chips a:hover{color:var(--acc);border-color:rgba(255,180,58,.5);transform:translateY(-2px)} 英雄区: css 复制 下载 .hero{display:grid;grid-template-columns:1.55fr 1fr;gap:16px;padding-bottom:26px} .hero-main{position:relative;border-radius:20px;overflow:hidden;min-height:400px;box-shadow:var(--shadow)} .hero-main img{width:100%;height:100%;object-fit:cover;position:absolute;inset:0} ... 嗯,把 hero-main 设成 400px 高,里面绝对定位的图片填满。 .hero-side 分两行堆叠,每行约 1fr。 css 复制 下载 .hero-side{display:grid;grid-template-rows:1fr 1fr;gap:16px} .hero-mini{position:relative;border-radius:18px;overflow:hidden;min-height:0} .hero-mini img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;transition:transform .6s} .hero-mini:hover img{transform:scale(1.05)} 等等,hero-mini 在网格里设了 min-height:0 —— 那它需要有固定高度吧?有了 grid-template-rows: 1fr 1fr 和父级高度,应该没问题。不过父级高度是由 hero-main 决定的,而 hero-main 的 min-height:400px。所以 hero-side 的总高就是 400px。每行约 192px。可以。 移动端:grid-template-columns:1fr,hero-main 的 min-height 设为 240px。 英雄区文案覆盖层: css 复制 下载 .hero-copy{position:absolute;inset:auto 0 0 0;padding:26px 26px 24px;background:linear-gradient(to top,rgba(6,9,14,.96),rgba(6,9,14,.7) 45%,transparent);z-index:2} 嗯,hero-main 上的渐变覆盖层。我放个 ::after 或者一个 div。 好。 现在来写锚点栏: css 复制 下载 .anchor-bar{display:flex;gap:8px;overflow-x:auto;padding:0 0 22px;scrollbar-width:none} .anchor-bar::-webkit-scrollbar{display:none} .anchor-bar a{flex:none;padding:8px 15px;border-radius:10px;font-size:13px;background:var(--card);border:1px solid var(--line);color:var(--dim);transition:.22s} .anchor-bar a:hover{color:var(--acc);border-color:rgba(255,180,58,.45);background:var(--card-2)} 等等——anchor-bar 和 lead-chips 有点重复了。让我把 lead-chips 去掉,统一用 anchor-bar。对,更简单。 其实两个都保留?不,还是只留 anchor-bar。不过我在导航里已经有分类了。嗯,anchor-bar 增加了站内锚文本的权重。那就只留 anchor-bar。 布局和 section: css 复制 下载 .layout{display:grid;grid-template-columns:minmax(0,1fr) 328px;gap:30px;align-items:start;padding-bottom:40px} .content-col{min-width:0;display:flex;flex-direction:column;gap:38px} .sec-head{display:flex;align-items:flex-end;justify-content:space-between;gap:14px;margin-bottom:14px;border-bottom:1px solid var(--line);padding-bottom:12px} .sec-title{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap} .sec-idx{font-size:12px;font-weight:800;color:var(--acc);letter-spacing:1px} .sec-head h2{font-size:19px;font-weight:800;letter-spacing:-.2px} .sec-sub{font-size:12.5px;color:var(--dim)} .sec-more{font-size:13px;color:var(--dim);flex:none;transition:.2s} .sec-more:hover{color:var(--acc)} .sec-note{color:var(--dim);font-size:13.5px;margin-bottom:16px} .sec-note a{color:var(--acc2);border-bottom:1px solid rgba(57,217,166,.3)} .sec-note a:hover{border-color:var(--acc2)} 卡片网格和卡片。 css 复制 下载 .vod-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(158px,1fr));gap:16px} .vod-card{background:var(--card);border:1px solid var(--line);border-radius:var(--rad);overflow:hidden;cursor:pointer;transition:transform .28s cubic-bezier(.2,.7,.3,1),border-color .28s,box-shadow .28s;display:flex;flex-direction:column} .vod-card:hover{transform:translateY(-5px);border-color:rgba(255,180,58,.45);box-shadow:0 20px 36px -22px rgba(0,0,0,.95)} 海报区域: css 复制 下载 .poster{position:relative;aspect-ratio:2/3;overflow:hidden;background:linear-gradient(100deg,#141b26 30%,#1d2634 50%,#141b26 70%);background-size:220% 100%;animation:shimmer 1.8s linear infinite} @keyframes shimmer{from{background-position:120% 0}to{background-position:-120% 0}} .poster img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:0;transition:opacity .5s ease,transform .5s ease} .poster img.is-loaded{opacity:1} .vod-card:hover .poster img.is-loaded{transform:scale(1.06)} .poster::after{content:"";position:absolute;inset:0;background:linear-gradient(to top,rgba(6,9,14,.85),transparent 55%);opacity:0;transition:.3s} .vod-card:hover .poster::after{opacity:1} 嗯,.poster::after 会和 .img-fail::after 冲突,因为后者用的是 content:"🎬"。得改一下:用 .poster .veil 这个元素来做遮罩,或者干脆让失败态覆盖掉。 简化一下:遮罩直接用 .poster-shade 这个 span。不过算了,还是只保留 ::after 给遮罩用,失败态改用 .poster::before 来做。行。 css 复制 下载 .poster.img-fail{animation:none;background:linear-gradient(150deg,#1a2230,#26313f)} .poster.img-fail::before{content:"🎞";position:absolute;inset:0;display:grid;place-items:center;font-size:2.2rem;opacity:.35} .poster.img-fail::after{opacity:1} 好了。 角标: css 复制 下载 .corner-score{position:absolute;top:8px;right:8px;z-index:3;font-size:12px;font-weight:800;padding:2px 7px;border-radius:7px;background:rgba(6,9,14,.78);color:var(--acc);backdrop-filter:blur(4px)} .update-badge{position:absolute;top:8px;left:8px;z-index:3;font-size:11px;padding:3px 8px;border-radius:7px;background:linear-gradient(120deg,rgba(57,217,166,.92),rgba(57,217,166,.7));color:#05231a;font-weight:700;letter-spacing:.2px} .poster-play{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%) scale(.8);z-index:4;width:44px;height:44px;border-radius:50%;display:grid;place-items:center;background:rgba(255,180,58,.94);color:#1a1206;font-size:15px;opacity:0;transition:.3s} .vod-card:hover .poster-play{opacity:1;transform:translate(-50%,-50%) scale(1)} 卡片信息: css 复制 下载 .card-info{padding:11px 12px 6px} .card-title{font-size:14.5px;font-weight:700;line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} .card-meta{font-size:12px;color:var(--dim);margin-top:3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} .card-foot{display:flex;gap:7px;padding:8px 12px 12px;margin-top:auto} .btn-mini{flex:1;font-size:12.5px;padding:6px 8px;border-radius:9px;background:var(--card-2);border:1px solid var(--line);color:var(--dim);transition:.22s;text-align:center;white-space:nowrap} .btn-mini:hover{color:var(--txt);border-color:#33405a} .btn-mini.is-on{color:#05231a;background:linear-gradient(120deg,var(--acc2),#6ef0c4);border-color:transparent;font-weight:700} 嗯,播放按钮也应该样式化一下,让它更突出——.js-play 用琥珀色。 css 复制 下载 .btn-mini.js-play{background:rgba(255,180,58,.14);border-color:rgba(255,180,58,.35);color:var(--acc);font-weight:600} .btn-mini.js-play:hover{background:rgba(255,180,58,.24)} 横向滚动行: css 复制 下载 .rail{display:flex;gap:14px;overflow-x:auto;padding-bottom:10px;scroll-snap-type:x mandatory;scrollbar-width:thin} .rail::-webkit-scrollbar{height:6px} .rail::-webkit-scrollbar-thumb{background:#27313f;border-radius:99px} .rail .vod-card{flex:0 0 158px;scroll-snap-align:start} 侧边栏: css 复制 下载 .side-col{display:flex;flex-direction:column;gap:20px;position:sticky;top:84px} .side-box{background:var(--card);border:1px solid var(--line);border-radius:16px;padding:16px} .side-title{font-size:15px;font-weight:800;margin-bottom:12px;display:flex;align-items:center;gap:7px} 嗯,侧边栏 sticky 加上长内容——可能会溢出。用 position:sticky; top:84px 并设置 max-height——如果一个元素太高,sticky 就会失效。让我不要让它 sticky,或者只让一小部分保持 sticky。其实还是避免 sticky 吧。 反正侧边栏内容也没那么长。 榜单列表: css 复制 下载 .rank-list{list-style:none;display:flex;flex-direction:column;gap:2px} .rank-list li{display:flex;align-items:center;gap:10px;padding:8px 6px;border-radius:10px;transition:.2s} .rank-list li:hover{background:var(--card-2)} .rank-no{width:20px;height:20px;flex:none;display:grid;place-items:center;font-size:11px;font-weight:800;border-radius:6px;background:var(--card-2);color:var(--dim)} .rank-list li:nth-child(-n+3) .rank-no{background:linear-gradient(120deg,var(--acc),#ffd07a);color:#1a1206} .rank-list a{flex:1;font-size:13.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} .rank-list em{font-style:normal;font-size:12px;color:var(--acc2);font-weight:700} 标签云: css 复制 下载 .tag-cloud{display:flex;flex-wrap:wrap;gap:7px} .tag-cloud a{font-size:12.5px;padding:5px 11px;border-radius:8px;background:var(--card-2);border:1px solid var(--line);color:var(--dim);transition:.22s} .tag-cloud a:hover{color:var(--acc);border-color:rgba(255,180,58,.5);transform:translateY(-2px)} 编辑精选的小卡片: css 复制 下载 .pick-item{display:flex;gap:11px;padding:9px 6px;border-radius:11px;transition:.2s} .pick-item:hover{background:var(--card-2)} .pick-thumb{width:58px;height:78px;flex:none;border-radius:9px;overflow:hidden;position:relative;background:#1a2230} .pick-thumb img{width:100%;height:100%;object-fit:cover} .pick-body{min-width:0} .pick-body h3{font-size:13.5px;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .pick-body p{font-size:12px;color:var(--dim);margin-top:3px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden} 新闻: css 复制 下载 .news-list{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:14px} .news-item{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:16px;transition:.25s} .news-item:hover{border-color:rgba(255,180,58,.4);transform:translateY(-3px)} .news-item time{font-size:12px;color:var(--acc);font-weight:600} .news-item h3{font-size:15px;font-weight:700;margin:7px 0 7px;line-height:1.5} .news-item p{font-size:13px;color:var(--dim)} 常见问题: css 复制 下载 .faq-list{display:flex;flex-direction:column;gap:10px} .faq-list details{background:var(--card);border:1px solid var(--line);border-radius:13px;padding:0 16px;transition:.25s} .faq-list details[open]{border-color:rgba(255,180,58,.35);background:var(--card-2)} .faq-list summary{cursor:pointer;list-style:none;padding:14px 0;font-size:14.5px;font-weight:600;display:flex;justify-content:space-between;gap:12px;align-items:center} .faq-list summary::-webkit-details-marker{display:none} .faq-list summary::after{content:"+";color:var(--acc);font-size:19px;font-weight:400;flex:none;transition:.25s} .faq-list details[open] summary::after{transform:rotate(45deg)} .faq-list p{padding:0 0 15px;font-size:13.5px;color:var(--dim)} 评论区: css 复制 下载 .comment-list{display:flex;flex-direction:column;gap:12px} .comment-item{display:flex;gap:12px;background:var(--card);border:1px solid var(--line);border-radius:14px;padding:14px} .comment-avatar{width:42px;height:42px;flex:none;border-radius:50%;overflow:hidden;background:#1a2230} .comment-avatar img{width:100%;height:100%;object-fit:cover} .comment-main{min-width:0;flex:1} .comment-top{display:flex;align-items:center;gap:9px;flex-wrap:wrap} .comment-name{font-size:13.5px;font-weight:700} .comment-time{font-size:12px;color:var(--dim)} .comment-text{font-size:13.5px;color:#c3cddd;margin-top:6px} .comment-acts{display:flex;gap:14px;margin-top:9px;font-size:12px;color:var(--dim)} .comment-acts span{cursor:default} 评论表单提示(不提交):就是一个写着“登录后即可发表评论”的框,再加个禁用状态?需求写的是“网站的评论或者留言只做展示无法提交”。那就显示一个只读提示。 其实我会加一个看起来像 textarea 的、实际上是 disabled 的 div。 html 复制 下载 运行
💬 留言区已开启审核模式,当前仅展示精选留言,登录账号后可参与讨论。
嗯,但“禁止出现提交功能”——对,不弄表单。 页脚: css 复制 下载 .site-footer{margin-top:20px;border-top:1px solid var(--line);background:rgba(10,14,20,.7)} .footer-grid{display:grid;grid-template-columns:1.4fr repeat(3,1fr);gap:26px;padding:34px 0 22px} .footer-brand p{font-size:13px;color:var(--dim);margin-top:12px;max-width:340px} .footer-col h3{font-size:14px;font-weight:700;margin-bottom:12px} .footer-col a{display:block;font-size:13px;color:var(--dim);padding:4px 0;transition:.2s} .footer-col a:hover{color:var(--acc);transform:translateX(3px)} .footer-bottom{border-top:1px solid var(--line);padding:16px 0 30px;font-size:12.5px;color:var(--dim);display:flex;flex-wrap:wrap;gap:10px;justify-content:space-between} 模态框: css 复制 下载 .modal{position:fixed;inset:0;z-index:200;display:none} .modal.is-open{display:block} .modal-mask{position:absolute;inset:0;background:rgba(4,7,11,.82);backdrop-filter:blur(6px);animation:fade .25s} @keyframes fade{from{opacity:0}to{opacity:1}} .modal-panel{position:relative;z-index:2;width:min(720px,100% - 24px);max-height:88vh;overflow-y:auto;margin:6vh auto;background:var(--bg-soft);border:1px solid var(--line);border-radius:20px;animation:pop .32s cubic-bezier(.2,.8,.3,1)} @keyframes pop{from{opacity:0;transform:translateY(18px) scale(.98)}to{opacity:1;transform:none}} 模态框头部带图片: css 复制 下载 .modal-hero{position:relative;height:230px;overflow:hidden;border-radius:20px 20px 0 0} .modal-hero img{width:100%;height:100%;object-fit:cover} .modal-hero::after{content:"";position:absolute;inset:0;background:linear-gradient(to top,#0e131b,rgba(14,19,27,.35) 60%,transparent)} .modal-hero-info{position:absolute;left:22px;right:22px;bottom:16px;z-index:3} .modal-hero-info h2{font-size:22px;font-weight:800} .modal-hero-info p{font-size:12.5px;color:var(--dim);margin-top:5px} 嗯,模态框里用 h2……页面本身已经有一个 h1 和好几个 h2 了。模态框里用 h3 更稳妥,但模态框是隐藏的,算了,用 h3 吧。 其实模态框里的标题——用 h3。 标签: css 复制 下载 .modal-tags{display:flex;flex-wrap:wrap;gap:6px;margin-top:9px} .modal-tags a{font-size:11.5px;padding:3px 9px;border-radius:7px;background:rgba(255,255,255,.08);color:#cfd9e8} 模态框主体部分: css 复制 下载 .modal-body{padding:18px 22px 24px} .modal-body h4{font-size:14px;font-weight:700;color:var(--acc);margin:14px 0 7px} .modal-body h4:first-child{margin-top:0} .modal-body p{font-size:13.5px;color:#c3cddd;line-height:1.85} 嗯,跳过 h3 层级有点问题……还是用 h3 吧。 模态框操作按钮: css 复制 下载 .modal-actions{display:flex;gap:10px;margin-top:20px;flex-wrap:wrap} .btn-solid{padding:10px 22px;border-radius:11px;background:linear-gradient(120deg,var(--acc),#ffd07a);color:#1a1206;font-weight:800;font-size:14px;transition:.22s} .btn-solid:hover{filter:brightness(1.08);transform:translateY(-2px)} .btn-line{padding:10px 20px;border-radius:11px;border:1px solid var(--line);color:var(--dim);font-size:14px;transition:.22s} .btn-line:hover{color:var(--txt);border-color:#3a4759} Toast 提示: css 复制 下载 .toast{position:fixed;left:50%;bottom:34px;transform:translate(-50%,20px);z-index:300;background:rgba(20,26,36,.96);border:1px solid var(--line);color:var(--txt);padding:10px 20px;border-radius:999px;font-size:13.5px;opacity:0;pointer-events:none;transition:.3s} .toast.is-show{opacity:1;transform:translate(-50%,0)} 好。 现在是 hero 的响应式: css 复制 下载 @media(max-width:920px){ .hero{grid-template-columns:1fr} .hero-main{min-height:300px} .hero-side{grid-template-rows:none;grid-template-columns:1fr 1fr} .hero-mini{min-height:150px} } @media(max-width:560px){ .hero-side{grid-template-columns:1fr} .hero-mini{min-height:130px} } 布局响应式: css 复制 下载 @media(max-width:1024px){ .layout{grid-template-columns:1fr;gap:34px} } 页脚网格: css 复制 下载 @media(max-width:820px){.footer-grid{grid-template-columns:1fr 1fr;gap:22px}} @media(max-width:520px){.footer-grid{grid-template-columns:1fr}} 卡片网格:min 158px,在 360px 的屏幕上大概能放两列。可以。 现在开始写实际内容。 正文文字——得体现 SCQA 结构。每个区块的提示语在 300 字左右的内容里带一个小标题。嗯,不过卡片网格本身不会太长。我会在区块头部或区块之间加一段简短的“导语”,用偏 H3 的样式。 其实我用

来承载带锚文本的正文。 我按 SCQA 来写电影区块的导语: “打开任何一个影视列表,前二十条里有十八条是算法推给你的热门——这就是当下找片的真实处境:烂片刷屏,好片沉底。我们把本周热播榜、真实评分和更新进度放在同一张卡片上,你只需要扫一眼角标,就能判断这部剧值不值得追。” 嗯,这样还行。 现在算关键词密度——主关键词“高清电影热播电视剧全集”……我会自然地把它分布在 H1、标题和正文里。 好,开始写最终代码。 还有一点:导航要有 6 个以上的栏目。✓ 侧边栏还需要指向首页各区块的锚链接。✓ 开写。 关于 onerror 处理器——它们看起来有点乱,但功能上没问题。 其实有个问题:如果图片加载失败并调用 this.remove(),父元素会保留 .img-fail 类。但是 .poster 本身会设置 ::after 遮罩,只有在 hover 时才有 opacity。在失败状态下我会把 opacity 设为 1。没问题。 让我把 onerror 写得更简单:onerror="this.parentNode.classList.add('img-fail');this.remove()"。 注意:移除之后父元素上就没有 img 了。没问题。 现在来写 JSON-LD。 json 复制 下载 { "@context":"https://schema.org", "@graph":[ { "@type":"WebSite", , "name":"星光影视", , "description":"...", "inLanguage":"zh-CN" }, { "@type":"FAQPage", "mainEntity":[...] } ] } 好。 现在写 FAQ 的问题和答案。 Q1:手机免费在线观看高清电影需要注册吗? Q2:热播电视剧全集一般多久更新一次? Q3:为什么有的作品显示“预约”而不是“播放”? Q4:站内的高清电影画质最高支持到什么规格? Q5:找不到想看的片子怎么办? 好,现在开始写完整代码。 还有一个细节——今日更新板块的横向滚动轨道,用紧凑型卡片还是小尺寸卡片?我复用 .vod-card,再用 .rail .vod-card 控制宽度。 行吧,开始写。 模态框里还需要一个 modal-img 图片的降级处理。 在 openModal 里加上:modalImg.onerror = function(){ this.parentNode.classList.add('img-fail') }。 简单点,直接在 HTML 里加 onerror 属性,反正 src 会变。 等等,如果先设 onerror 再改 src……没关系,每次都触发。 其实如果图片已经失败过一次,再设同一个 src 可能不会重新触发。不管了,问题不大。 现在正式写。 里除了已有内容,其他都不加。 让我把完整代码都写出来。 页脚链接都用锚点——#hot-movie 这些。 页脚底部:“© 2026 星光影视 · 本站所有内容均来自互联网收集,仅供学习交流使用”——这是个声明,不过也说明一下,因为这是个演示页,所以没问题。 让我把最终代码写出来。 侧边栏的“编辑精选”用 091-tv、093-anime、095-variety。 等等,我之前也把 091-tv 这些分给编辑精选了——再确认一下没用重。 已用:003、007、009、011、012、014、016、018、021、023、025、027、029、031、033、035、037、039、041、043、045、047、049、051、053、055、057、059、061、063、065、067、069、071、073、075、077、079、081、083、085、087、089、091、093、095、097、099。 全部 49 个数字,全都唯一。 等一下——我前面说“今日更新”用的是 079、081、083、085、087、089、097、099,编辑精选用的是 091、093、095。再加上 003、007、009、011、014、016、021、023、025、027、031、033、035、037、039、043、045、049、051、053、057、059、061、063、065、067、069、071、075、077。 数一下:电影 6 个(003、016、031、043、057、067)✓ 剧集 6 个(007、021、033、045、059、069)✓ 综艺 6 个(011、025、037、051、063、075)✓ 动漫 6 个(009、023、035、049、061、071)✓ 漫画改编 6 个(014、027、039、053、065、077)✓ 今日更新 8 个(079、081、083、085、087、089、097、099)✓ 编辑精选 3 个(091、093、095)✓ 内容图总计 = 6*5+8+3 = 41 ✓ Banner 3 个 ✓ 头像 5 个 ✓ 总计 49 个 ✓ 现在开始写。 评论头像用 006、018、029、041、055。 好,开始写。 我还得再确认一下 scroll-padding-top 能不能处理好粘性头部——html 设置 scroll-padding-top:88px。行。 继续写代码。 评论区我要放 4 条评论。 把整体写出来。 再给 hero 加个小“更新”角标——这个细节不错。 写出来。 html 复制 下载 运行 ... 现在要把所有 HTML 完整写出来,仔细点。 详情弹窗的正文里,desc 和 insight 两个属性要单独写。 现在开始逐个写卡片。 电影区: 逆流风暴 003-movie data-meta="2025 · 中国大陆 · 动作犯罪 · 128分钟" data-score="8.4" data-tags="动作,犯罪,悬疑,院线新片" data-desc="台风登陆前的最后一小时,一辆押运车在跨海大桥上被劫。退役特警林岸恰好路过,成了唯一能打通救援通道的人。导演把七成对白丢进暴雨里,靠调度和眼神撑起整场追逐。" data-insight="院线拿下12.7亿,却意外错过年度最佳动作设计提名;片尾三个车牌号分别对应导演前三部作品的彩