蜂鸟影院 - 高清电影电视剧在线观看_蜂鸟影院首页推荐与热播榜单 ... 然后是内嵌样式。 仔细写 CSS。 css 复制 下载 *{margin:0;padding:0;box-sizing:border-box} :root{ --bg:#050f0d; --bg2:#0a1a16; --panel:#0d221c; --line:rgba(22,224,161,.14); --green:#16e0a1; --amber:#ffd166; --coral:#ff7a6b; --violet:#a98bff; --txt:#e6f5f0; --mut:#7fa89c; } html{scroll-behavior:smooth;scroll-padding-top:78px} 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} 背景装饰用 body::before 里的径向渐变来做。 头部: css 复制 下载 .site-head{position:sticky;top:0;z-index:60;background:rgba(5,15,13,.86);backdrop-filter:blur(14px);border-bottom:1px solid var(--line)} 导航行用 flex 布局,Logo 那边放一个内联 SVG 蜂鸟。 蜂鸟 SVG——简化路径。我画个大概的: svg 复制 下载 运行 配一个渐变 defs。 可以。 导航链接:首页、热映榜、电影、剧集、短剧、动漫、综艺、影评、留言。 移动端:横向滚动的导航行。不做汉堡菜单,直接横向滚动就够了,最简单也稳妥。 现在看 Hero 区域: html 复制 下载 运行

蜂鸟影院 · 每日 09:00 更新

蜂鸟影院:把热搜榜单里的好片,一次看明白

...

3 张横幅图片叠放
主视觉舞台:不对称的叠放效果——一张大的 banner 加两张小的悬浮卡片,带一点旋转。 其实还是让 banner 保持响应式比较好:.stage { display:grid; grid-template-columns: 1.4fr 1fr; } 嗯,但在移动端可能会很麻烦。还是这样做: .hero-stage { position:relative; } .banner-main { 圆角,aspect-ratio 16/10 } .banner-mini 绝对定位在底部左侧,带旋转。 移动端就改成静态块。其实更简单:用网格布局放三张 banner,主图跨行跨列,小屏幕时折叠成堆叠。用 CSS grid areas 来做吧。 css 复制 下载 .hero-stage{display:grid;grid-template-columns:1fr 1fr;grid-template-rows:auto auto;gap:12px} .banner-main{grid-column:1/-1;...} 嗯,这样是挺好,但主图占满整行之后,两张迷你图就并排了。那也没问题,干净。 实际上要想看起来更有“运营感”,可以加一个轮播伪元素——编号角标什么的。好。 接下来是热映榜区块 #hot,用一个横向排行榜列表,带数字和海报缩略图。 然后是各个分类区块。6 个分类:热门电影(#movie)、热播剧集(#tv)、短剧速看(#short)、动漫番剧(#anime)、综艺现场(#variety)、纪录人文(#doc)。 每个区块:H2 + 标签行 + 卡片网格。 卡片结构: html 复制 下载 运行
... 更新至12集 8.9

片名

2025 · 悬疑 / 犯罪

...
等等——需求是:点击整个卡片区域(图片、标题区域,但不包括底部按钮)会打开模态框。所以卡片的点击处理器要排除底部的按钮。 我打算给 .film-card 绑 click,用 e.target.closest('.film-foot') 检查是否点在底部区域,是的话就直接返回。 底部的 play-btn 链接到锚点,没问题。 模态框:一个固定遮罩层,里面放详情面板。通过 data-title 等属性填充内容。 然后是侧边栏。实际上为了更贴合中文网站的运营习惯,可以做一个双栏布局:主栏 + aside。 整体结构是: 面包屑导航 主视觉 主网格:[主内容栏] [aside 侧边栏] 主内容栏里:热映榜、分类…… 侧边栏:本周人气榜、标签云、短评、资讯 嗯,但需求说侧边栏要用锚链接指向首页作品区。好吧。 其实还是换个更不常规的布局:把热映榜做成全宽的横向滚动条带,然后双栏放在下面。 干脆这样: 顶部导航 面包屑导航 主视觉 #hot 热映榜(全宽横向滚动) 两栏布局:[主内容:分类板块 #movie #tv #short #anime #variety #doc] [侧边栏:#rank 榜单、标签、资讯预览] #reviews 深度影评(全宽,3 列) #news 相关资讯(全宽,4 列) 嗯,其实资讯已经放进侧边栏了——那把资讯改成全宽区块,侧边栏放榜单和标签云,就这样。 #faq #comment 评论区 页脚 JSON-LD 和脚本 等等——点击卡片打开详情窗口,这个弹窗要写好。好。 还有“模拟播放/预约入口”——播放按钮、预约按钮。 “更新角标”——更新徽标。 “悬浮微动效”——悬浮动画。 “加载占位”——骨架屏加载动画。 开始写吧。 CSS 细节: css 复制 下载 .wrap{width:min(1240px,100% - 32px);margin-inline:auto} 页头: css 复制 下载 .site-head{position:sticky;top:0;z-index:80;background:rgba(5,15,13,.9);backdrop-filter:blur(16px);border-bottom:1px solid var(--line)} .head-row{display:flex;align-items:center;gap:18px;padding:10px 0} .brand{display:flex;align-items:center;gap:10px;text-decoration:none;color:var(--txt);flex:0 0 auto} .brand b{font-size:19px;letter-spacing:.5px} .brand small{display:block;font-size:10px;color:var(--mut);letter-spacing:2px} .nav-scroll{flex:1;overflow-x:auto;scrollbar-width:none} .nav-scroll::-webkit-scrollbar{display:none} .nav-list{display:flex;gap:6px;list-style:none;white-space:nowrap} .nav-list a{display:block;padding:7px 12px;border-radius:999px;color:#b9d6cd;text-decoration:none;font-size:14px;transition:.2s} .nav-list a:hover{background:rgba(22,224,161,.12);color:var(--green)} .head-cta{...} 移动端隐藏 head-cta,品牌名缩小。 面包屑导航: css 复制 下载 .crumb{font-size:13px;color:var(--mut);padding:14px 0} .crumb a{color:#9ec9bb;text-decoration:none} 主视觉区: css 复制 下载 .hero{display:grid;grid-template-columns:1.05fr .95fr;gap:28px;padding:26px 0 40px;align-items:center} @media(max-width:900px){.hero{grid-template-columns:1fr}} H1 用 clamp 调字号。 主视觉舞台的横幅: css 复制 下载 .hero-stage{display:grid;grid-template-columns:1fr 1fr;gap:12px} .stage-img{position:relative;border-radius:16px;overflow:hidden;background:linear-gradient(110deg,#0d221c,#123a2e,#0d221c);background-size:200% 100%;animation:shimmer 1.6s linear infinite} 嗯,shimmer 动画如果一直跑着其实也还行,但加上 img 加载完成后再停掉就更好了。 简化一下:.thumb 默认有一个柔和的渐变背景;图片铺满整个区域;如果失败,.thumb.ph::after 显示一个 🎬 emoji。 现在逐个写各个板块。 分类的头部行: html 复制 下载 运行

热门电影 · 本周点播增速榜

等等,H2 必须放在板块内部,ID 放在板块上。让
里面包含

。把 scroll-padding-top 设成 80 就行。 标签用锚点链接指向 #movie——不过如果所有标签都指向同一个 #movie 就有点冗余。没关系,反正需求里写了:分类标签全部做成本页筛选锚点链接。让它们都指向各自的板块锚点吧。 卡片网格: css 复制 下载 .cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(168px,1fr));gap:16px} 移动端最小 140px 即可。 卡片样式: css 复制 下载 .film-card{background:var(--panel);border:1px solid var(--line);border-radius:14px;overflow:hidden;cursor:pointer;transition:transform .25s,box-shadow .25s,border-color .25s;position:relative} .film-card:hover{transform:translateY(-6px);box-shadow:0 18px 40px -18px rgba(22,224,161,.5);border-color:rgba(22,224,161,.45)} 缩略图 aspect-ratio:3/4。 角标定位用绝对定位。 好,现在开始写内容。需要原创的中国电影/剧集标题。用虚构的名字来避免版权问题——其实用虚构名字也完全可以。 虚构标题: 电影:《雾港十三号》《夜航西飞》?嗯,那是真实存在的书名。用:《雾港拾荒者》《第七个雨季》《铁皮月亮》《潮汐接线员》《沉默的蓝鲸》 剧集:《长夜列车》《回南天档案》《玻璃城往事》《雪线以上》《双生回声》 短剧:《三分钟恋人》《闪婚后我成了首富》《回到98年》《总裁的替身日记》《重生之逆风翻盘》 嗯,短剧标题确实可以玩点这种套路的。 动漫:《星海拾荒人》《墨色剑心》《机械花火》《雾山小妖》 综艺:《周末放大镜》《声浪计划》《厨房大冒险》 纪录:《海岸线纪事》《手艺中国》嗯…… 干脆统一成一组虚构的片名吧。 然后是每张卡片的数据。得给模态框准备描述——简短,但要有点原创感。 好,规划一下数量:每个分类大概 4-6 张卡片。总共大概 28 张卡片。这得做不少工作,但没问题。 先整理一下图片分配: Banners(3 张):066-banner.webp、013-banner.webp、087-banner.webp 热门电影(#movie)——6 张: /upload/vod/034-movie.webp — 雾港拾荒者 — 8.7 /upload/vod/005-movie.webp — 第七个雨季 — 8.4 /upload/vod/064-movie.webp — 铁皮月亮 — 9.1 /upload/vod/039-movie.webp — 潮汐接线员 — 8.2 /upload/vod/026-movie.webp — 沉默的蓝鲸 — 8.9 /upload/vod/002-movie.webp — 破晓之前 — 7.9 剧集(#tv)——6 张: /upload/vod/057-tv.webp — 长夜列车 — 9.0 /upload/vod/046-tv.webp — 回南天档案 — 8.6 /upload/vod/011-tv.webp — 玻璃城往事 — 8.3 /upload/vod/077-tv.webp — 雪线以上 — 8.8 /upload/vod/089-tv.webp — 双生回声 — 8.1 /upload/vod/023-tv.webp — 灯下故人 — 8.5 短剧(#short)——4 张(用 tv 或 movie 词?规则说普通内容用 tv/movie/variety/anime/manga 之一。短剧就用 movie 或 tv 都行): /upload/vod/049-tv.webp — 三分钟恋人 /upload/vod/058-movie.webp — 闪婚之后 /upload/vod/015-tv.webp — 回到九八年 /upload/vod/070-movie.webp — 逆风翻盘 动漫(#anime)——4 张: /upload/vod/092-anime.webp — 星海拾荒人 /upload/vod/083-anime.webp — 墨色剑心 /upload/vod/052-anime.webp — 机械花火 /upload/vod/068-anime.webp — 雾山小妖 综艺(#variety)——4 张: /upload/vod/018-variety.webp — 周末放大镜 /upload/vod/027-variety.webp — 声浪计划 /upload/vod/044-variety.webp — 厨房大冒险 /upload/vod/081-variety.webp — 城市漫游者 纪录(#doc)——4 张(用 manga?还是用 movie?其实纪录片……词表是 tv/movie/variety/anime/manga。那就用 variety 或者 manga 吧): /upload/vod/095-manga.webp — 海岸线纪事 /upload/vod/071-manga.webp — 手艺人间 /upload/vod/036-variety.webp — 极地邮差 /upload/vod/062-manga.webp — 一座城的二十四小时 等等,095-manga 和 071-manga 已经用过了……不,只在纪录里用过。检查一下唯一性。 已用数字: 066、013、087(banner) 088、021、045、073、009(头像) 034、005、064、039、026、002(movie) 057、046、011、077、089、023(tv) 049、058、015、070(short) 092、083、052、068(anime) 018、027、044、081(variety) 095、071、036、062(doc) 全部不重复 ✓ 热榜——我会复用已有的图片。 然后是评论区头像:088、021、045、073、009。 好。 现在开始写实际代码。会很长,但继续。 模态框实现: html 复制 下载 运行 JS 从卡片的 dataset 里填充。 注意:弹窗里模态框的链接会关闭模态框并跳转锚点。没问题。 现在写 JS: js 复制 下载 (function(){ var modal=document.getElementById('detailModal'); ... document.querySelectorAll('.film-card').forEach(function(card){ card.addEventListener('click',function(e){ if(e.target.closest('.film-foot')) return; if(e.target.closest('a')) { /* 允许锚点跳转 */ } ... }); }); })(); 嗯,卡片里的标题本来就是锚点链接,也会触发跳转。需求写的是点击卡片区域(图片、标题区)要打开模态框,但要是锚点也跳转……干脆直接 preventDefault 算了。 js 复制 下载 card.addEventListener('click', function(e){ if(e.target.closest('.film-foot')) return; e.preventDefault(); open(card); }); 因为卡片本身不是链接,只有里面嵌了 a 标签,所以 preventDefault 能拦住内层的链接,问题不大。 接下来是图片加载回退: js 复制 下载 document.querySelectorAll('img[data-ph]').forEach(function(img){ img.addEventListener('error', function(){ img.style.visibility='hidden'; var host=img.parentNode; host.classList.add('ph'); if(!host.querySelector('.ph-ico')){ var s=document.createElement('span'); s.className='ph-ico'; s.textContent='🎬'; host.appendChild(s); } }); if(img.complete && img.naturalWidth===0){ /* 触发错误 */ } }); 嗯,这个有点绕。干脆用内联 onerror 属性好了,简单可靠: onerror="this.style.opacity='0';this.parentNode.classList.add('ph')" 然后在 CSS 里写 .thumb.ph::after{content:'🎬';...}。 但同一个父元素既可能是 .thumb,也可能有其他类名。算了,我直接统一让父元素都带上 .thumb 这个类。 实际上那些放在 .thumb 里的图片,父元素就是 .thumb。没问题。 CSS 这样写: css 复制 下载 .thumb.ph::before{content:'🎬';position:absolute;inset:0;display:grid;place-items:center;font-size:30px;opacity:.5} 但 shimmer 背景本来就已经在 .thumb 上了。反正 .thumb.ph 就是这样处理。 等一下,用 ::before 在 inset:0 配 display:grid——得确保 .thumb 本身是 position:relative 才行。 好了。 现在处理“加载占位”——.thumb 这个容器加一个动画渐变: css 复制 下载 .thumb{position:relative;overflow:hidden;background:linear-gradient(100deg,#0d221c 20%,#143b2f 40%,#0d221c 60%);background-size:200% 100%;animation:sk 1.8s linear infinite} @keyframes sk{to{background-position:-200% 0}} 图片加载后,反正图片会把它盖住。行吧,不过动画会一直跑,性能上是有点小浪费。可以接受,或者用 animation-play-state 来控制。先这样吧。 其实更好:如果旁边有 img 加载了,动画自然就被遮住了,就这样吧。 现在开始写内容。 区块标题——尽量少用 h2,但语义要清晰。 H1:蜂鸟影院:把热搜榜单里的好片一次看明白 开始写。 先起草一下正文的 SCQA 部分。放在「深度影评 #reviews」区块,或者单独做个导语区块。 SCQA 要包含在正文里。加一个带小标题的「精选影评」区块。 对,按 SCQA 要求来:「每 300 字设小标题」。 好,现在把整块写出来。 还要注意“关键词密度 2%-5%”——在可见文本里合理多次自然出现「蜂鸟影院」。 开始写 HTML。 html 复制 下载 运行 蜂鸟影院 - 高清电影电视剧在线观看_蜂鸟影院热播榜单与深度影评 ... 现在写 CSS——写完整一点。 认真把整段写出来。 我写的时候会小心,让标签都正确闭合。 字体方面没问题。 页头 logo SVG 用渐变 defs,需要唯一的 id。 继续写。 html 复制 下载 运行
嗯,head-cta 也许可以做成一个实心按钮。 现在开始写 hero 区域。 html 复制 下载 运行

蜂鸟影院 · 每日 09:00 补片

蜂鸟影院:把热搜榜单里的好片,一次看明白

……

  • 38,402在架片库
  • 12题材频道
  • 4.9观众满意度
蜂鸟影院本周主推热映影片横幅
本周主推 · 雾港拾荒者
独家片源
蜂鸟影院热播剧集专题横幅
剧集专题
蜂鸟影院动漫番剧专题横幅
番剧更新
... 注意:hero-stage 的 grid 是两列——主图横跨两列,两张小图并排。 好。 现在写 #hot 区块——横向滚动的榜单。 html 复制 下载 运行

01蜂鸟影院热映榜 · 今日搜索飙升

按站内真实检索量排序,每小时刷新一次

  1. 1 雾港拾荒者 雾港拾荒者 悬疑 ↑ 312%
  2. ...
横向滚动条:display:flex;overflow-x:auto。 然后是主两栏布局。 html 复制 下载 运行
...
...
...
...
...
...
每个分类区块: html 复制 下载 运行

02热门电影 · 观众点播增速榜

近 7 天站内点播环比增速 TOP,含新片与经典修复

...film-card...
等等,sec-idx 的编号——还是保持递增吧:01 给热映榜,然后 02 到 07 给分类,08 给影评,09 给资讯,10 给 FAQ,11 给留言。其实编号可以不用那么严格,先这么排着。 嗯,其实编号也可以不加。但它们确实能增加一点编辑感。就保持吧。 侧边栏: 本周人气榜(带锚点链接的榜单) 题材标签云 编辑部的短评 搜索热词 让我来设计侧边栏。 html 复制 下载 运行 注意:aside 里用 h2,在语义上是没问题的。 然后是全宽的影评区、资讯区、FAQ、评论区。 影评区用 SCQA 结构:先来一段引言,然后是几篇文章卡片。 让我来写: html 复制 下载 运行

08深度影评 · 为什么这部片值得你两小时

拒绝搬运简介,只写编辑部看片笔记

...
嗯,SCQA 应该放进正文里。我就在影评区放一块完整的 SCQA 正文。 再想想:做一个导语式区块,把 SCQA 在 #reviews 里完整走一遍: 情境:周六晚上十点,你打开三个平台…… 冲突:烂片太多…… 问题:怎么精准找到经典佳片? 答案:蜂鸟影院的推荐体系…… 然后用 H3 小标题。好。 相关资讯用 4 张卡片。 FAQ 用 details/summary 或者静态列表。用
方便展开收起——对无障碍和 SEO 都友好。 评论区:展示留言,用头像、昵称、时间、内容。再加一个提示“留言仅作展示”的说明,以及一个禁用的输入框?需求是:“网站的评论或者留言只做展示无法提交”。所以就展示内容,加一个静态表单区,按钮禁用。其实“禁止出现提交功能”——不能有提交功能。那我就只展示消息,可能再加个虚线占位框写“登录后留言”——不,还是别加表单,避免多余。就一个说明文字。其实为了好看一点,可以加一个假的输入区域,设成 disabled 然后带提示。嗯,算了,有风险。就纯展示加一句提示吧。 其实就加个只读的展示框,配上 placeholder,再禁用……还是不行。简单点:评论列表 + 一句“留言区仅展示已审核内容”。 好。 页脚:多列链接,全部指向锚点。版权信息。 页脚再加个 logos。 JSON-LD。 现在把整个东西仔细写出来。 CSS 变量就按前面定的来。 开始写完整 CSS。 css 复制 下载 *{margin:0;padding:0;box-sizing:border-box} html{scroll-behavior:smooth;scroll-padding-top:86px} body{ background:#050f0d; color:#e6f5f0; font-family:system-ui,-apple-system,'Segoe UI',Roboto,Helvetica,Arial,sans-serif; line-height:1.7; -webkit-font-smoothing:antialiased; overflow-x:hidden; } body::before{ content:''; position:fixed;inset:0;z-index:-1;pointer-events:none; background: radial-gradient(680px 420px at 12% -6%,rgba(22,224,161,.16),transparent 65%), radial-gradient(560px 380px at 92% 4%,rgba(169,139,255,.13),transparent 62%), radial-gradient(700px 500px at 50% 108%,rgba(255,209,102,.09),transparent 68%); } a{color:inherit} img{display:block;max-width:100%} button{font:inherit;cursor:pointer;border:0;background:none;color:inherit} .wrap{width:min(1260px,100% - 32px);margin-inline:auto} 头部那些一会儿再补上。 @media 断点:900px、720px、520px。 现在先把整个东西按顺序写出来。 我得小心处理 sec-head 加 tag-row 这一块。 卡片网格:repeat(auto-fill,minmax(160px,1fr)) —— 在 360px 宽度下就是 2 列,没问题。 侧边栏布局: css 复制 下载 .layout{display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:28px;align-items:start;padding-bottom:20px} @media(max-width:980px){.layout{grid-template-columns:1fr}} 侧边栏在移动端就放到下面——这样也行。 再让侧边栏在桌面端吸顶:.side-col{position:sticky;top:96px} —— 但里面有多个卡片的话,滚动时吸顶会怪怪的。干脆放弃吸顶,或者套一个带 max-height 的容器?算了,就普通静态流吧。 其实每个侧边栏卡片单独吸顶的话……还是算了。 现在开始写卡片 HTML。 html 复制 下载 运行
雾港拾荒者 海报 热映 8.7

雾港拾荒者

2025 · 悬疑 / 犯罪

HD 正片
等一下——需求是“点击整个卡片区域(图片、标题区域,但不包括底部按钮)”——所以 .film-foot 是排除在外的。好。 play-btn 的点击应该做点事——也许打开模态框?或者就只是一个点击反馈。让我把它弄成触发一个 toast“播放器加载中”。嗯,更简单点:它也打开模态框……但这样又违背了排除规则。 让我给播放按钮加一个小的 toast 提示:“正在为你准备播放源…”。这样就够了,不需要做假的播放器。其实,让“播放”按钮打开模态框也可以?不行。还是用 toast 吧。 加一个 toast 元素。 html 复制 下载 运行
CSS 是 .toast{position:fixed;left:50%;bottom:32px;transform:translate(-50%,20px);opacity:0;transition:.3s;...},再加一个 .toast.show{opacity:1;transform:translate(-50%,0)}。 好。 还有“预约入口”——可以加到某些卡片上,比如“预约”按钮,给未上映内容用。在 .film-foot 里加一个小 .reserve-btn。干脆混着来:部分卡片放预约而不是播放。 行,现在开始写所有卡片。大概要写 28 张,有点长,但没关系。 其实——为了减少体积,每个分类或许 4 张卡片就够了?还是保持 6 个分类 × 4 张 = 24 张,再加热映榜 8 项。就这样吧:电影 6 张、剧集 6 张、短剧 4 张、动漫 4 张、综艺 4 张、纪录 4 张 = 28 张卡片。行吧,写出来。 不过说实话,每个分类缩减到 4 张能省不少时间,电影和剧集保持 6 张。算了,就按计划来。 嗯,这样写会很长,不过我还扛得住。 现在把描述写短一点。 电影: 雾港拾荒者 — 2025 · 悬疑/犯罪 · 8.7 — “码头拾荒人捡到一盘被海水泡烂的录像带,十年前那场纵火案的真相随潮水退去浮出水面。全片 68% 的镜头在真实渔港夜间实拍,雨声全部现场收音。” 第七个雨季 — 2024 · 剧情/家庭 · 8.4 — “南方小城连续下了七年雨,母女三人在潮湿的屋子里各自守着不能说出口的秘密。导演用 36 个长镜头拼出一整年的梅雨季。” 铁皮月亮 — 2025 · 科幻/文艺 · 9.1 — “月球轨道电站报废后,最后一名检修员靠一台老式收音机确认自己还活着。全片只有两个演员,却拿下年度最佳美术。” 潮汐接线员 — 2024 · 悬疑/惊悚 · 8.2 — “海岛信号站的值班员每晚都会接到同一个陌生号码,电话那头的海浪声比她窗外的早了三秒。” 沉默的蓝鲸 — 2025 · 纪录剧情 · 8.9 — “一支捕鲸船改装成的科研船,在北大西洋航行了 217 天。船上 14 个人,没有一个会说对方的母语。” 破晓之前 — 2023 · 犯罪/黑色 · 7.9 — “一场持续六小时的银行劫案,镜头从未离开过街对面的面包店。” 剧集: 长夜列车 — 2025 · 悬疑/群像 · 9.0 — “一列开往北方的夜车,八节车厢,八段互不相识的人生。每集一个视角,最后一集才告诉你列车究竟有没有到站。” 回南天档案 — 2024 · 悬疑/年代 · 8.6 — “南方潮湿的回南天里,档案室管理员发现 1998 年的一批卷宗被人为抽走了三页。” 玻璃城往事 — 2024 · 都市/情感 · 8.3 — “三线城市的玻璃厂倒闭后,三个年轻人用十年时间把厂区改造成了一座剧场。” 雪线以上 — 2025 · 冒险/剧情 · 8.8 — “海拔 4800 米的护路队,一年有七个月见不到外人。剧组全程高原实拍,演员没有替身。” 双生回声 — 2023 · 科幻/悬疑 · 8.1 — “同一座城市的两个时间线,两个人在同一个夜晚拨出了同一通电话。” 灯下故人 — 2024 · 年代/家庭 · 8.5 — “老裁缝铺的最后一年,师傅和徒弟为了三十七件没做完的旗袍吵了一整季。” 短剧: 三分钟恋人 — 2025 · 都市/甜宠 · 7.6 — “每集三分钟,男女主的相遇永远在地铁关门的那一瞬。” 闪婚之后 — 2024 · 都市/逆袭 · 7.2 — “民政局门口的一次冲动,换来一整个季度的鸡飞狗跳。” 回到九八年 — 2025 · 穿越/家庭 · 7.8 — “睡一觉醒来回到 1998 年的县城,第一件事是去把父亲那辆二八大杠擦干净。” 逆风翻盘 — 2024 · 职场/励志 · 7.4 — “被裁员的第 47 天,她把出租屋改成了直播间。” 动漫: 星海拾荒人 — 2025 · 科幻/冒险 · 8.9 — “废弃空间站的残骸带里,少年靠捡零件攒出了人生第一艘飞船。” 墨色剑心 — 2024 · 武侠/热血 · 8.7 — “水墨风格的招式设计,每一帧都能截下来当壁纸。” 机械花火 — 2025 · 机甲/成长 · 8.4 — “会修机器人的女孩,和一台不肯退役的老机甲。” 雾山小妖 — 2023 · 奇幻/治愈 · 8.6 — “山里的小妖下山买酱油,路上遇见了七个想留它吃饭的人。” 综艺: 周末放大镜 — 2025 · 观察/真人秀 · 8.0 — “把镜头交给观众,每期由一个普通人决定节目组今天拍什么。” 声浪计划 — 2024 · 音乐/竞演 · 8.3 — “不设导师席,所有评分来自现场三百名观众的即时心率。” 厨房大冒险 — 2025 · 美食/竞技 · 7.9 — “抽到什么食材就得做什么菜,最后一期抽到的是一整只骆驼。” 城市漫游者 — 2024 · 旅行/纪实 · 8.5 — “每期只给一张公交卡,嘉宾必须在末班车前走完一座城。” 纪录: 海岸线纪事 — 2025 · 自然/人文 · 9.2 — “沿着 18000 公里海岸线,记录 12 个靠海吃海的普通家庭。” 手艺人间 — 2024 · 人文/非遗 · 9.0 — “拍了四年,跟拍了 26 位手艺人,其中 3 位在片子播出前已经离世。” 极地邮差 — 2025 · 自然/冒险 · 8.8 — “南极科考站的邮差,一年要送出去四千多封手写信。” 一座城的二十四小时 — 2023 · 城市/群像 · 8.7 — “同一个机位,连续拍了 365 天,剪成 24 小时。” 好,这些内容够原创了。 现在来处理热映榜的条目——复用几个片名。 热映榜条目: 雾港拾荒者(034-movie)↑312% 长夜列车(057-tv)↑268% 星海拾荒人(092-anime)↑241% 铁皮月亮(064-movie)↑198% 雪线以上(077-tv)↑175% 海岸线纪事(095-manga)↑152% 声浪计划(027-variety)↑136% 回到九八年(015-tv)↑121% 好,图片用的都是已经分配好的。 侧边栏人气榜,可以复用一下。 好,现在把整段代码写出来。 再补充一点:资讯模块。放 4 张卡片,每张带标题、日期和摘要。 资讯条目: “蜂鸟影院 4 月片单更新:12 部经典修复版上线” “短剧为什么越来越短?我们统计了 300 部片头时长” “悬疑片的高分密码:从雾港拾荒者看现场收音” “番剧更新日历上线,蜂鸟影院支持按周提醒” 好。 FAQ 条目: 蜂鸟影院的片源多久更新一次? 为什么有些影片标注“预约”而不是“播放”? 蜂鸟影院支持手机端观看吗? 站内评分是怎么算出来的? 可以在留言板求片吗? JSON-LD 的 FAQPage 要和这些对应。 现在来写。 JSON-LD 里需要转义引号吗?JSON 放在 script 标签里,用正常的双引号就行。 好,开始写完整的。 关于“禁止出现多余的标点符号”——我理解为不要乱加杂七杂八的符号。中文文本里的常规标点没问题。 现在把最终代码写出来。 再写一个模态框的 HTML。 模态框 CSS: css 复制 下载 .modal-mask{position:fixed;inset:0;z-index:200;display:none;align-items:center;justify-content:center;padding:16px;background:rgba(3,10,8,.82);backdrop-filter:blur(6px)} .modal-mask.open{display:flex} .modal-card{position:relative;width:min(760px,100%);max-height:88vh;overflow-y:auto;background:#0b1d18;border:1px solid rgba(22,224,161,.28);border-radius:18px;display:grid;grid-template-columns:240px 1fr;gap:0} @media(max-width:640px){.modal-card{grid-template-columns:1fr}} 海报那一列在移动端可能会显得太大,所以移动端可以设个 max-height 或者直接隐藏。就移动端用 grid-template-columns:1fr,海报用 aspect-ratio:16/9 加 object-fit:cover。 我来处理一下: css 复制 下载 .modal-poster{background:#0d221c} .modal-poster img{width:100%;height:100%;object-fit:cover;display:block} @media(max-width:640px){.modal-poster{aspect-ratio:16/9}.modal-poster img{height:auto;aspect-ratio:16/9}} 行。 关闭按钮绝对定位在右上角。 好了,现在全部写出来。 有个注意点:onerror 内联处理器会不会有引号问题?用这个: onerror="this.style.opacity='0';this.parentNode.classList.add('ph')" 在 HTML 属性里用单引号——这样没问题。 但要注意父元素是不是 .thumb。如果是的话,就行。 在 rank-strip 里,缩略图的父元素是 .rank-thumb——我这里用 parentNode.classList.add('ph')。这样它就会变成 .rank-thumb.ph。需要给 .ph::before 也写样式。我把 .ph 样式写成通用一点的: css 复制 下载 .ph{position:relative;background:linear-gradient(100deg,#0d221c,#143b2f,#0d221c);background-size:200% 100%;animation:sk 1.8s linear infinite} .ph::after{content:'🎬';position:absolute;inset:0;display:grid;place-items:center;font-size:26px;opacity:.45} 等等,这里用了 ::after,但 .thumb 的 badge 子元素会显示在上层……不过没关系,因为 ::after 是放在最后面的。 嗯,实际上 .thumb 的子元素在 ::after 后面?伪元素 ::after 会生成在最后一个子元素之后,所以它会在最上层。它会盖住 badge——没关系,它只是个 emoji,而且这种情况只出现在图片加载失败的时候。 好吧,z-index 的问题不用管了,能接受。 用 .ph::before 代替 ::after,这样它就会出现在子元素下面——但父元素没有设置 z-index 的话,子元素反正也会堆叠在上面。用 ::before 吧。 好。 现在 @keyframes sk 定义一次就行。 .thumb 本身已经有 shimmer 背景了,所以它不需要再加 .ph 类。 我干脆给所有缩略图容器都加上 shimmer 背景好了。 好,继续写。 另外移动端要做卡片网格:grid-template-columns:repeat(auto-fill,minmax(148px,1fr))。 现在开始写最终答案。 数一下导航项——11 个,移动端横向滚动。 好,全部写出来。 页脚里的 head-cta 要隐藏,或者再缩小一点。 写吧。 另外页脚导航的锚点链接要列出来: 热门电影 #movie 热播剧集 #tv 短剧速看 #short 动漫番剧 #anime 综艺现场 #variety 纪录人文 #doc 深度影评 #reviews 相关资讯 #news 常见问题 #faq 留言板 #comment 再加上版权信息。 好,继续写。 现在仔细写 JS: js 复制 下载 (function(){ var mask = document.getElementById('detailModal'); var mImg = document.getElementById('modalImg'); var mTitle = document.getElementById('modalTitle'); var mMeta = document.getElementById('modalMeta'); var mTags = document.getElementById('modalTags'); var mDesc = document.getElementById('modalDesc'); var lastFocus = null; function openModal(card){ lastFocus = card; mImg.src = card.querySelector('.thumb img').getAttribute('src'); mImg.alt = card.dataset.title + ' 详情海报'; mTitle.textContent = card.dataset.title; mMeta.textContent = card.dataset.meta; mDesc.textContent = card.dataset.desc; mTags.innerHTML = ''; (card.dataset.tags || '').split(',').forEach(function(t){ if(!t) return; var s = document.createElement('span'); s.textContent = t; mTags.appendChild(s); }); mask.classList.add('open'); mask.setAttribute('aria-hidden','false'); document.body.style.overflow = 'hidden'; } function closeModal(){ mask.classList.remove('open'); mask.setAttribute('aria-hidden','true'); document.body.style.overflow = ''; if(lastFocus) lastFocus.focus(); } ... })(); 卡片需要加 tabindex 和键盘支持。给 .film-card 加 tabindex="0" 和 role="button" —— 不过它们里面还有按钮,属于嵌套交互元素,问题不大。 嗯,28 张卡片每个都要加 tabindex="0" —— 每个卡片都要带,算了,还是加上吧。 其实更简单:不加 tabindex,但 click 处理照常能跑。为了可访问性我还是加一下——算了,先跳过减少代码量,不,还是加吧。行,加。 算了,还是不加 tabindex 了,让里面的链接保持可点击就行。反正点击处理器会统一接管。嗯,不过如果里面没有可聚焦的元素……其实也没有链接。算了,还是加 tabindex="0" 和键盘回车处理吧。OK。 其实更简单点:反正 click 处理器覆盖所有情况,我直接在卡片容器上用事件委托好了。 js 复制 下载 document.addEventListener('click', function(e){ var card = e.target.closest('.film-card'); if(!card) return; if(e.target.closest('.film-foot')) return; e.preventDefault(); openModal(card); }); 好,这样就不用给每张卡片单独绑监听器了。 键盘支持:在 document 上加 keydown 处理,监听回车键。 然后播放按钮的 toast 也用事件委托: js 复制 下载 document.addEventListener('click', function(e){ var btn = e.target.closest('.play-btn'); if(btn){ e.preventDefault(); showToast('正在为「' + ... + '」匹配最佳播放源…'); } }); 嗯,需要拿到片名。btn.closest('.film-card').dataset.title 就行。 等等,如果播放按钮在 .film-card 里面,上面那个卡片点击处理器会不会也触发?会的——事件在 document 层冒泡,两个处理器都会跑。第一个会提前返回(因为 e.target.closest('.film-foot') 匹配到,直接 return),然后 toast 那个处理器再执行。顺序上:两个都在 document 上。没问题。 不过要小心:e.preventDefault() 写在卡片处理器里——它会先返回,所以不会执行到 preventDefault。好。 其实等等:播放按钮是个