不用外部字体。 现在仔细写 CSS。 设计变量: text 复制 下载 :root{ --ink:#12101a; --ink-2:#1b1826; --rose:#ef5f7e; --rose-soft:#ffb3c6; --gold:#e8c07d; --cream:#f7f3ee; --muted:#9c94a8; } 主体背景:深色,带一层淡淡的径向渐变。 顶部导航吸顶。 先把区块布局定下来: text 复制 下载
...
...
...
轮播/主视觉
平台热搜榜
经典佳片
-- 不过其实主布局还是用两栏网格吧 ...
嗯,需求里提到侧边栏,那就做一个 main 网格,左边是内容区,右边是 aside 侧栏。 但主视觉和平台热搜可以做成全宽的。布局改成这样: text 复制 下载
...
这样侧栏就是粘性定位。 等下,短剧/动漫专区要不要做成全宽?先留在内容列里吧。 现在来细化内容。得写得有原创感。 关键页面文案: H1:韩国爱情片深度观影指南:从经典纯爱到当代都市心动 嗯,H1 里主关键词只出现一次,这样没问题。 接下来写实际内容。 主视觉轮播:三张 banner 图配标题文字。用 CSS 滚动吸附或者简单堆叠。就简单做——一个 hero 大图加侧边两张小图?或者用纯 CSS 的滚动吸附轮播,横向滚动,不用 JS。就做横向吸附滚动加 scroll-snap —— 触摸端手感不错。不过“轮播”本身需要 JS 才能自动播放,滚动吸附也行吧,我加几条小圆点。 其实更简单——做一张主打的 hero 大图,加一张次要卡片。但轮播更经典。就用水平 scroll-snap 轮播,三张 slide,每张 100% 宽度,配合 overflow-x:auto。 平台热搜榜:用网格排六个平台卡片——腾讯视频、爱奇艺、红果短剧、小红书、抖音、快手。每个卡片有图标(emoji 或内联 SVG)、平台名、三条带排名徽章的热搜条目。要不要加个“热门”/“新”角标。 经典佳片:卡片网格,每张卡片带图片、标题、年份、标签、评分和底部按钮“播放/预约”。点击卡片打开弹窗。 先写大概 8 部电影吧——原创名字肯定不行,得用真实的韩国爱情片: 《假如爱有天意》2003 《我脑中的橡皮擦》2004 《触不到的恋人》2000 《八月照相馆》1998 《建筑学概论》2012 《狼少年》2012 《现在去见你》2018 《分手的决心》2022 这些是真实电影,但简介得我原创写。 弹窗内容:完整简介、导演、演员、我的原创短评。 演员幕后:关于导演风格和演员的文章——用 H3 拆小块。 短剧与动漫:用卡片展示红果短剧和动漫条目。 相关资讯:3 到 4 条新闻条目,带日期。 常见问题:5 个问答,用 details/summary 或者纯静态手风琴。用
做原生折叠——没有 JS,没有外部库。不错。 评论:展示已存在的评论,带头像,不提供提交表单。也许放一个禁用的输入框,加个提示。需求说“评论/留言只做展示无法提交”——所以只展示,不放表单。 其实也许可以显示一个带 textarea 的表单,但用 disabled/只读并加个提示。嗯,“禁止出现提交功能”——不用表单,就纯展示评论列表,再加一条“登录后参与讨论”的提示。 稳妥一点:只展示评论列表,不加表单。 侧边栏:热门榜单,用锚点链接指向对应板块;标签云链接到锚点;平台热度 mini 榜单。 现在开始写 HTML。 图片占位 / 懒加载:loading="lazy" 加上 onerror 回退?onerror 用内联 JS——允许(不是外部资源)。但“禁止出现提交功能”只针对表单。内联 onerror 可以。不过为了代码干净,我可以在文档里挂一个全局错误处理: js 复制 下载 document.addEventListener('error', function(e){ if(e.target.tagName==='IMG'){ e.target.classList.add('img-fallback'); e.target.style.background='...' } }, true); 用捕获阶段处理图片加载错误。可以。 加载骨架:CSS 背景渐变加动画,在图片加载完成前显示。可以加 img { background: linear-gradient(...) }。 不用 IntersectionObserver 也行,简单点。 点击卡片打开模态框——需要用 JS 来实现。写个小型 JS 弹窗系统,把数据存在 data 属性里。 做法是:每张卡片都用 data 属性挂上详情数据,点击时填充模态框。 卡片用 data-title、data-year、data-cast、data-desc、data-score、data-img、data-tags。 现在开始写代码吧。 模态框 HTML: html 复制 下载 运行
✕
立即播放
看影迷短评
这些链接都指向页内锚点——没问题,不跳外链。 然后是动画和微交互: 卡片悬停时上浮 + 图片缩放 播放按钮悬停时旋转/发光 角标脉冲 榜单条目悬停时位移 我把这部分仔细写一下。 CSS 骨架: css 复制 下载 *{margin:0;padding:0;box-sizing:border-box} html{scroll-behavior:smooth;scroll-padding-top:96px} body{font-family:system-ui,-apple-system,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;background:#12101a;color:#eae6f0;line-height:1.7;-webkit-font-smoothing:antialiased} img{display:block;max-width:100%;height:auto} a{color:inherit;text-decoration:none} 好,现在开始搭整体结构。 顶部滚动条: html 复制 下载 运行
🔥 热榜
《现在去见你》重映票房破...
...
用 CSS 动画让 ticker-move 横向滚动。 导航栏: html 复制 下载 运行
韩
韩影恋人
Korean Romance Cinema
首映焦点
平台热搜
经典佳片
幕后观察
短剧动漫
相关资讯
常见问题
影迷留言
☰
移动端:导航栏折叠,通过 JS 切换 .open 类。 面包屑: html 复制 下载 运行
首页
›
韩国爱情片
›
经典榜单
现在做主视觉轮播。图片用 /upload/vod/066-banner.webp 这些。 html 复制 下载 运行
本周首映
韩国爱情片|...
...
查看片单
幕后解析
...
因为是水平 scroll-snap,hero-rail 要设置 display:flex; overflow-x:auto; scroll-snap-type:x mandatory;,每个 slide 用 flex:0 0 100%; scroll-snap-align:start; 但桌面端这样会显得太高。桌面端限制一下高度,用 aspect-ratio 来控。其实每张 slide 设个 min-height: 380px 就行了。 嗯,横向滑动区域在桌面端滚动条会有点怪,但还能接受。加个 scrollbar 隐藏吧。 备选方案是让 hero 直接做成静态布局,但需求里提到了轮播图。所以还是保留 scroll-snap 轮播。 OK。 现在逐个写板块。 平台热搜榜(#platform-hot): html 复制 下载 运行
全网平台热搜 · 韩式心动实时榜
聚合腾讯视频、爱奇艺、红果短剧、小红书、抖音、快手六大平台当日热度
🐧
腾讯视频
剧集
1
《现在去见你》重映版上线
9821万
...
...
6 张卡片。 经典佳片(#classic):带数据属性的卡片网格。 我准备写 8 张卡。 每张卡的结构: html 复制 下载 运行
4K修复
9.2
▶
假如爱有天意
2003 · 韩国 · 纯爱
...
影评
幕后
等一下,需求说:“点击整个卡片区域(图片、标题区域,但不包括底部按钮)时,弹出一个模态框”。所以底部按钮是链接,不会触发模态框。好。 图片上那个 ▶ 按钮也是个按钮——点它应该也打开模态框,所以它得是个按钮,但不能被当成底部按钮……其实点它正好可以触发模态框,没问题。 嗯,不过这个
放在卡片里,旁边有
链接——没关系。 接下来是卡片点击的 JS: js 复制 下载 document.querySelectorAll('.film-card').forEach(card=>{ card.addEventListener('click', e=>{ if(e.target.closest('.film-foot')) return; openModal(card.dataset); }); }); 这样点底部区域就不触发。 但底部区域里的
也一样,因为它们在 .film-foot 里面——对,没错。 幕后观察(#behind):放几段原创分析文章。 内容大概这样: H2:韩国爱情片为何总让人心动:导演风格与幕后故事拆解 H3:一、慢镜与留白:韩式纯爱片的影像语法 H3:二、演员的“眼神演技”养成记 H3:三、被奖项遗漏的遗珠 每一段都带 2 到 3 个指向本页锚点的锚文本链接。 再加一个数据条,放独家数据——比如“票房对比”这种。 短剧与动漫(#short-drama):卡片用红果短剧和动漫的条目,图片用 variety、anime、manga、tv 这些词。 相关资讯(#news):列表条目带日期。 常见问题(#faq):用
。 评论(#comments):评论卡片配头像。 然后是 JSON-LD。 写 FAQ 问答: 韩国爱情片哪些最经典? 韩国爱情电影在哪里可以看正版? 韩式纯爱片和都市爱情片有什么区别? 为什么韩国爱情片容易催泪? 2024 年有哪些值得看的韩国爱情电视剧? JSON-LD 里也要放同样的内容。 好了,现在开始写全部代码。 配色再想一下: bg: #100e17 panel: #191622 panel2: #211d2e accent: #f0567a (rose) accent2: #f5c26b (gold) text: #ece8f3 muted: #9a92ab border: rgba(255,255,255,.07) 加点微妙的渐变和纹理。 开写。 CSS 细节: css 复制 下载 :root{ --bg:#100e17; --panel:#191622; --panel-2:#221d30; --rose:#f0567a; --rose-dim:#a83a58; --gold:#f5c26b; --txt:#ece8f3; --muted:#9a92ab; --line:rgba(255,255,255,.08); --radius:16px; } body 背景: css 复制 下载 body{ background: radial-gradient(900px 500px at 12% -5%, rgba(240,86,122,.16), transparent 60%), radial-gradient(700px 480px at 92% 8%, rgba(245,194,107,.10), transparent 60%), var(--bg); } 顶栏: css 复制 下载 .ticker{display:flex;align-items:center;gap:10px;background:linear-gradient(90deg,#2a1622,#1a1524);border-bottom:1px solid var(--line);padding:0 16px;height:38px;overflow:hidden;font-size:12.5px} .ticker-label{flex:none;color:var(--gold);font-weight:700;letter-spacing:.06em} .ticker-track{flex:1;overflow:hidden;position:relative;height:38px} .ticker-move{display:inline-flex;gap:36px;white-space:nowrap;position:absolute;top:50%;transform:translateY(-50%);animation:marquee 32s linear infinite;will-change:transform} @keyframes marquee{from{transform:translate(0,-50%)}to{transform:translate(-50%,-50%)}} 嗯,要做到无缝循环,内容得复制两遍。复制一份就行。 其实简单点:直接 transform: translateX(0) → translateX(-50%),里面放两份内容就行。 行。 导航栏: css 复制 下载 .site-head{position:sticky;top:0;z-index:60;backdrop-filter:blur(14px);background:rgba(16,14,23,.86);border-bottom:1px solid var(--line)} .head-inner{max-width:1240px;margin:0 auto;display:flex;align-items:center;gap:18px;padding:10px 18px} 品牌标识: css 复制 下载 .brand{display:flex;align-items:center;gap:10px;flex:none} .brand-mark{width:38px;height:38px;border-radius:12px;display:grid;place-items:center;background:linear-gradient(135deg,var(--rose),#8b3ad1);color:#fff;font-weight:800;font-size:17px;box-shadow:0 6px 18px rgba(240,86,122,.35)} .brand-text strong{display:block;font-size:16px;letter-spacing:.04em} .brand-text em{display:block;font-size:10px;color:var(--muted);font-style:normal;letter-spacing:.16em;text-transform:uppercase} 导航列表: css 复制 下载 .nav-list{margin-left:auto;display:flex;gap:4px;flex-wrap:wrap} .nav-list a{padding:7px 12px;border-radius:999px;font-size:13.5px;color:#c9c2d8;transition:.25s} .nav-list a:hover{background:rgba(240,86,122,.14);color:#fff;transform:translateY(-1px)} 移动端汉堡按钮隐藏,桌面端显示。 好,接下来是主体容器: css 复制 下载 .shell{max-width:1240px;margin:0 auto;padding:0 18px} 主内容区两栏: css 复制 下载 .layout{display:grid;grid-template-columns:minmax(0,1fr) 320px;gap:28px;align-items:start} 媒体查询 max-width 1024px 时变成单栏。 侧边栏在桌面端吸顶: css 复制 下载 .side-col{position:sticky;top:88px;display:flex;flex-direction:column;gap:18px} 好。 各个板块的头部统一用: css 复制 下载 .block{margin-top:38px} .block-head{display:flex;align-items:flex-end;gap:14px;flex-wrap:wrap;margin-bottom:18px;border-left:4px solid var(--rose);padding-left:12px} .block-head h2{font-size:20px;letter-spacing:.02em} .block-sub{font-size:12.5px;color:var(--muted)} 嗯,flex-end 布局可能有点别扭,还是改成块级排版吧。 再定一下: css 复制 下载 .block-head{border-left:4px solid var(--rose);padding-left:12px;margin-bottom:18px} .block-head h2{font-size:21px;font-weight:800} .block-sub{font-size:12.5px;color:var(--muted);margin-top:4px} 好。 电影卡片网格: css 复制 下载 .film-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:18px} 卡片: css 复制 下载 .film-card{background:linear-gradient(180deg,var(--panel),#151221);border:1px solid var(--line);border-radius:var(--radius);overflow:hidden;cursor:pointer;transition:transform .35s cubic-bezier(.2,.8,.3,1),box-shadow .35s,border-color .35s;display:flex;flex-direction:column;position:relative} .film-card:hover{transform:translateY(-6px);border-color:rgba(240,86,122,.42);box-shadow:0 18px 38px -16px rgba(240,86,122,.5)} 海报: css 复制 下载 .film-poster{position:relative;aspect-ratio:16/10;overflow:hidden;background:linear-gradient(110deg,#221d30 8%,#2c2438 18%,#221d30 33%);background-size:200% 100%;animation:shine 1.6s linear infinite} @keyframes shine{to{background-position:-200% 0}} 图片加载完成后,动画其实还在跑,只不过被图片盖住了。还行。 css 复制 下载 .film-poster img{width:100%;height:100%;object-fit:cover;transition:transform .55s ease,opacity .4s} .film-card:hover .film-poster img{transform:scale(1.08)} 角标: css 复制 下载 .update-badge{position:absolute;top:10px;left:10px;background:linear-gradient(90deg,#f0567a,#ff8a5c);color:#fff;font-size:10.5px;padding:3px 8px;border-radius:999px;font-weight:700;letter-spacing:.04em;box-shadow:0 4px 12px rgba(240,86,122,.45)} 嗯,“更新角标”这个脉冲效果: css 复制 下载 .update-badge::after{content:'';position:absolute;inset:0;border-radius:999px;border:1px solid rgba(255,255,255,.5);animation:pulse 2s infinite} @keyframes pulse{0%{opacity:.9;transform:scale(1)}100%{opacity:0;transform:scale(1.5)}} 得分: css 复制 下载 .film-score{position:absolute;right:10px;top:10px;background:rgba(10,8,16,.72);backdrop-filter:blur(6px);color:var(--gold);font-size:12.5px;font-weight:800;padding:3px 9px;border-radius:8px;border:1px solid rgba(245,194,107,.3)} 播放按钮: css 复制 下载 .film-play{position:absolute;right:10px;bottom:10px;width:36px;height:36px;border-radius:50%;border:none;cursor:pointer;background:rgba(240,86,122,.92);color:#fff;font-size:13px;display:grid;place-items:center;opacity:0;transform:scale(.7);transition:.3s} .film-card:hover .film-play{opacity:1;transform:scale(1)} .film-play:hover{background:#fff;color:var(--rose);transform:scale(1.12) !important} !important 可能不太优雅,但先这样吧。 嗯,其实 .film-card:hover .film-play 的优先级…….film-play:hover 是 (0,2,0),.film-card:hover .film-play 是 (0,3,0),所以需要 !important 或者加个更具体的选择器。那改成: css 复制 下载 .film-card:hover .film-play:hover{background:#fff;color:var(--rose);transform:scale(1.14)} 这样就避开了 !important,挺好。 信息区: css 复制 下载 .film-info{padding:12px 13px 6px;flex:1} .film-info h3{font-size:15.5px;font-weight:700;margin-bottom:3px} .film-meta{font-size:11.5px;color:var(--muted);letter-spacing:.03em} .film-line{font-size:12.5px;color:#b6aec4;margin-top:7px;line-height:1.6;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden} 底部操作区: css 复制 下载 .film-foot{display:flex;gap:8px;padding:10px 13px 13px} .mini-btn{flex:1;text-align:center;font-size:12px;padding:6px 0;border-radius:9px;background:rgba(240,86,122,.16);color:#ff9fb5;border:1px solid rgba(240,86,122,.28);transition:.25s} .mini-btn:hover{background:rgba(240,86,122,.32);color:#fff} .mini-btn.ghost{background:rgba(255,255,255,.05);color:#bdb5cb;border-color:var(--line)} .mini-btn.ghost:hover{background:rgba(255,255,255,.12);color:#fff} 好。 平台卡片: css 复制 下载 .platform-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(258px,1fr));gap:16px} .plat-card{background:linear-gradient(160deg,#1d1929,#161320);border:1px solid var(--line);border-radius:14px;padding:14px;transition:.3s} .plat-card:hover{border-color:rgba(245,194,107,.35);transform:translateY(-3px)} .plat-head{display:flex;align-items:center;gap:9px;padding-bottom:10px;border-bottom:1px dashed rgba(255,255,255,.09);margin-bottom:10px} .plat-ico{width:28px;height:28px;border-radius:9px;display:grid;place-items:center;background:rgba(255,255,255,.06);font-size:15px} .plat-head h3{font-size:14px;font-weight:700;flex:1} .plat-tag{font-size:10px;padding:2px 7px;border-radius:6px;background:rgba(240,86,122,.16);color:#ff9fb5} .plat-list li{display:flex;align-items:center;gap:8px;padding:6px 0;font-size:12.5px;border-bottom:1px solid rgba(255,255,255,.04)} .plat-list li:last-child{border-bottom:none} .rk{width:18px;height:18px;flex:none;border-radius:5px;display:grid;place-items:center;font-size:10.5px;font-weight:800;background:rgba(255,255,255,.08);color:#b7afc6} .rk1{background:linear-gradient(135deg,#f0567a,#ff8a5c);color:#fff} .rk2{background:linear-gradient(135deg,#f5a623,#f5c26b);color:#3a2500} .rk3{background:linear-gradient(135deg,#7a5cff,#a48bff);color:#fff} .plat-list a{color:#d3cce0;transition:.2s;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} .plat-list a:hover{color:var(--rose)} .heat{font-style:normal;color:var(--muted);font-size:11px;flex:none} 等等,我把 li 设成 flex,里面有几个子元素:rk、a、heat。那 a 设了 flex:1 之后就会占满剩余空间,没问题。 好。 现在开始写内容——我得特别注意原文要求的“原创度”和 SCQA 结构,不能直接照搬豆瓣或者 IMDb 的简介。所有文案都得自己重新组织。 先把电影数据和模态框简介都过一遍。 假如爱有天意 / 2003 / 9.2 简介:“郭在容用一条项链串起两代人的暗恋。前半段是乡间河畔的笨拙书信,后半段是雨夜军靴踩过的泥泞。孙艺珍一人分饰母女两角,把同样的羞怯演出了两种温度。全片最动人的不是重逢,而是那件被雨淋透的衬衫——它替角色说出了所有不敢开口的话。” 主演:导演:郭在容 / 主演:孙艺珍、曹承佑、赵寅成 我脑中的橡皮擦 / 2004 / 9.0 简介:“郑雨盛把痞气收进西装,孙艺珍把记忆一寸寸交还给遗忘。影片前半段是便利店里的碳酸饮料,后半段是同一扇门被反复推开却认不出的人。导演李宰汉刻意把色调从暖橙推向冷蓝,让观众和男主一起,目送爱人在眼前变成陌生人。” 触不到的恋人 / 2000 / 8.6 简介:“一个信箱,两年时差。全片没有拥抱,只有海和字迹。李政宰在沙滩上写下“等你”,全智贤在两年后的雪里读到。韩国爱情片里少见的克制样本,把思念拍成了潮汐,来去都有准点。” 八月照相馆 / 1998 / 8.8 简介:“许秦豪的处女作,把一个将死之人拍得毫无悲情。韩石圭饰演的照相馆老板每天擦镜头、洗胶片、给顾客修掉脸上的痘。爱情来得极慢,走得也极轻。结尾那张被留在橱窗里的照片,是韩国爱情片最早的“留白”示范。” 建筑学概论 / 2012 / 8.3 简介:“李勇周用一栋济州岛的海边房子,拆解了初恋的物理学:距离越近,引力越大,但墙体也越薄。前半段是大学教室里的录音带,后半段是四十岁男人蹲在工地抽烟。秀智的沉默和严泰雄的犹豫,让那句“我喜欢过你”迟到了十五年。” 狼少年 / 2012 / 8.5 简介:“赵成熙把奇幻外壳套在纯爱骨头上。宋仲基全程只有一句台词,却靠眼神完成了一场跨越半个世纪的等待。朴宝英的两次回头,一次是少女的恐惧,一次是老妇的愧疚。影片后半段的雪夜,是韩国爱情片里最安静的告别。” 现在去见你 / 2018 / 8.7 简介:“李章焄改编自市川拓司的小说,却把雨季拍成了韩国特有的闷热。苏志燮沉默地修着钟表,孙艺珍从雨中走来,带着一个注定要消失的答案。全片最好的设计是那本手绘日记——它让“预知结局”这件事,反而变成了勇气的来源。” 分手的决心 / 2022 / 8.1 简介:“朴赞郁把爱情片拍成了悬疑片,又把悬疑片拍成了爱情片。汤唯的韩语台词始终带着口音,恰恰是这份不流畅,让刑警