给封面加一个取景框:object-position 的取舍

不吆 · 2026-11-07

封面被裁,是改版时最容易被忽略的细节。

同一张图,列表里是 480×270 的横条,首页主卡接近 16:9,详情页更宽。竖图放进去,object-fit: cover 只能保住中间一小段——主体的眼睛常常正好被切在边界上。

先看问题

一张 1280×1700 的竖图,放进 876×340 的主卡里,可见区域大约只有原图高度的 20%。默认 object-position: center 永远取正中,于是:

换图能解决,但每换一次都要重新裁一遍,而且同一张图在三个位置的最优裁切并不一样。

方案:存一个焦点,而不是存一张裁好的图

服务端只存一个百分比坐标:

cover_position = "50% 30%"

前端把它直接交给 CSS:

.cover img { object-fit: cover; object-position: 50% 30%; }

后台的写作面板里,封面预览下方有水平/垂直两个滑块,也可以直接点预览图上想要的位置——点哪儿,哪儿就成为焦点。实时预览用的是同一套 background-position 规则,所见即所得。

为什么不在服务端裁

服务端裁切意味着:每换一次版式、每加一个尺寸,都要重新生成一批图。而焦点坐标是与尺寸无关的:同一份数据能同时服务列表、头图、详情页,甚至以后新增的版式。

代价是浏览器要自己裁——但这正是 object-fit 的本职工作,不额外花什么。

顺带解决的性能问题

焦点只管「看见哪一块」,不管「下载多大」。头图原来直接加载 835KB 的原图,改成上传时生成 1280 宽的 WebP 派生档后是 97KB,卡片档 480 宽只有 28KB。

两者配合起来才是完整的:

数据:cover_position  →  决定裁哪里
派生:-hero / -card   →  决定下多大

边界情况

改动不大,但这类「看起来只是样式」的问题,往往要动数据模型才能真的解决。

不吆的博客

BUYAO / NOTES独立写作 · 持续学习

不吆的博客

在代码、设计与生活之间,记录缓慢而具体的思考。

FIND A NOTE

搜索文章

输入关键词,在全部文章中查找。
按 Ctrl / ⌘ K 随时打开Enter 打开首条结果
–
篇文章
–
条回应
–
个标签
RECENT / 新近

最新文章

长文阅读

BUYAO / JOURNAL

回应
PRIVATE DESK

后台登录

发布、编辑、删除需要登录。访客浏览与留言无需登录。
博客后台使用站长账号;刷题学习账号是另一套身份。

密码经后端加盐哈希校验,浏览器不会保存任何可写凭证。
这里登录的是博客后台,请使用站长账号;刷题属于另一套学习账号,请到 刷题登录页。
WRITING DESK

写一篇新文章

新文章
0 = 默认;1、2、3… 越小越靠前

置顶后会出现在首页「编辑精选」,并排在列表最前。

    只保存选中的标签;搜索结果里没有时,可以在菜单底部新建一个。

    未设置封面
    链接地址(slug)
    发布后地址为 /post/<slug>,可被搜索引擎收录。
    0 字 · 约 1 分钟
    正文插图有三种方式:点「插入图片」、直接把图片拖进编辑框、或粘贴截图。
    从飞书/语雀导出的 Markdown:点「导入 Markdown」把 .md 和图片一起选中(也支持含图片的 .zip),或点「导入文件夹」直接选整个导出目录——图片会上传到本站并自动改好链接;外链图片会尝试抓回本地,抓不到的保留原链接。
    如果正文已经贴好了、只有图片是「图片和附件/xxx.png」这种本地路径:点「修复正文图片」,选中同名的图片文件,会原位替换,不会动你的正文。
    文章保存到本站后端数据库(SQLite)。Ctrl/⌘ + S 也可保存;顶栏「备份」可导出全部数据为 JSON 文件。
    ⌘/Ctrl + S 保存

    站点设置

    标签决定文章怎么被分类和筛选。分组会出现在标签页上(如「技术栈」「设计与生活」);图标/封面图会显示在标签卡和筛选条里。