更新至24集
9.2
更新至24集
9.2
...带锚点链接的文案...
...
每天 10:00 与 20:00 双时段更新,院线新片、卫视同步剧、独播综艺、新番动画一站追完,支持手机、平板、电脑多端自适应播放。
8.4
HD 国语
▶
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
复制
下载
运行
来承载带锚文本的正文。 我按 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亿,却意外错过年度最佳动作设计提名;片尾三个车牌号分别对应导演前三部作品的彩