You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Statamic Antlers中获取图片焦点X/Y坐标(无需插件)

解决Statamic图片焦点坐标提取并应用到Tailwind布局的问题

我开发的网站基于Statamic CMS(Antlers模板)、Tailwind.css和AlpineJS,其中一个页面的replicator字段区域展示标题、描述和数量可变的图片,图片已经实现指定的动态网格布局。当前问题是图片裁剪默认以中心为焦点,但我已在CMS中手动设置每张图片的焦点,希望不添加插件的情况下提取这些焦点的X和Y坐标,项目已引入AlpineJS可用于实现方案。

现有代码

模板代码

{{ elements sort="order" }}
<div>
    <h2 class="text-white text-4xl lg:text-6xl font-bold text-left my-4">{{ title }}</h2>
    <div class="max-w-[1100px] text-white text-lg lg:text-2xl font-normal">
        {{ description }}
    </div>
    <div class="case__gallery flex flex-wrap my-8">
        {{ images }}
            <div class="p-4 flex-auto image-container">
                <img src="{{ url }}" alt="{{ alt }}" class="object-cover object-center w-full h-full">
            </div>
        {{ /images }}
    </div>
</div>
{{ /elements }}

额外CSS

@media (min-width: 768px) { 
    .case__gallery {
        .image-container {
            @apply w-full;
        }
        .image-container:nth-of-type(5n+1), 
        .image-container:nth-of-type(5n+5) { 
           @apply w-2/3;
        }
        
        .image-container:nth-of-type(5n+2), 
        .image-container:nth-of-type(5n+4) { 
           @apply w-1/3;
        }
        .image-container:nth-of-type(5n+3) { 
           @apply w-full;
        }
    }
}

已尝试的代码

{{ elements sort="order" }}
<div>
    <h2 class="text-white text-4xl lg:text-6xl font-bold text-left my-4 px-5 lg:px-0">{{ title }}</h2>
    <div class="max-w-[1100px] text-white text-lg lg:text-2xl font-normal">
        {{ description }}
    </div>
    <div class="case__gallery flex flex-row flex-wrap my-8">
        {{ images }}
            <div class="p-4 image-container"> <!-- 额外的DIV容器 -->
                <img class="w-full" src="{{ glide:url fit='crop_focal' }}" alt="{{ alt }}"> <!-- 移除img标签的内边距样式 -->
            </div>
        {{ /images }}
    </div>
</div>
{{ /elements }}

解决方案

Statamic的图片字段内置存储了焦点坐标,可通过{{ focal_point }}变量直接访问,返回格式为X-Y的百分比字符串(例如30-70代表X轴30%、Y轴70%)。结合AlpineJS可以解析该值并动态设置object-position样式,替代默认的object-center,实现按CMS设置的焦点裁剪:

修改后的模板代码

{{ elements sort="order" }}
<div>
    <h2 class="text-white text-4xl lg:text-6xl font-bold text-left my-4">{{ title }}</h2>
    <div class="max-w-[1100px] text-white text-lg lg:text-2xl font-normal">
        {{ description }}
    </div>
    <div class="case__gallery flex flex-wrap my-8">
        {{ images }}
            <div class="p-4 flex-auto image-container">
                <img 
                    src="{{ url }}" 
                    alt="{{ alt }}" 
                    class="object-cover w-full h-full"
                    x-data="{ focal: '{{ focal_point ?: '50-50' }}' }"
                    :style="{ 'object-position': `${focal.split('-')[0]}% ${focal.split('-')[1]}%` }"
                >
            </div>
        {{ /images }}
    </div>
</div>
{{ /elements }}

关键说明

  • {{ focal_point }}:Statamic原生变量,直接读取CMS中设置的图片焦点坐标,未设置焦点时用?: '50-50'默认值保持中心裁剪。
  • AlpineJS的x-data:将焦点坐标字符串传入组件数据。
  • 动态style绑定:通过split('-')拆分坐标字符串,转换为object-position的百分比值,让图片按设置的焦点区域裁剪,完全适配现有动态网格布局。

这种方案无需额外插件,利用Statamic内置变量和AlpineJS的动态样式绑定即可实现需求,避免通过Glide生成裁剪图片的方式破坏原有布局逻辑。

内容的提问来源于stack exchange,提问作者Kuba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 07:55:58