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

如何获取可滚动图片列表当前展示图并高亮对应缩略图(Smarty环境)

问题需求

我有一个可滚动图片列表,想要确定当前屏幕中展示的是哪张图片,目标是为当前图片对应的缩略图添加聚焦高亮效果。我使用的是Smarty模板引擎,原有实现代码如下:

{if $images}
<div class="galleryHolder left">
    <div class="thumbsHolder left">
        <div class="pos-sticky">
            {section name=i loop=$images}
            <a href="/files/{$images[i].file}" data-fancybox="gallery" class="thumb">
                <picture>
                    <source srcset="/files/webp/tntn/{$images[i].file_webp} 1x" type="image/webp">
                    <source srcset="/files/tntn/{$images[i].file} 1x" type="image/jpeg">
                    <img class="thumbImg" src="/files/tntn/{$images[i].file}" alt="{if $images[i].name}{$images[i].name}{else}{$row.name}{/if}">
                </picture>
            </a>
            {/section}
        </div>
    </div>
    <div class="imagesHolder right">
        {section name=i loop=$images}
        <a href="/files/{$images[i].file}" data-fancybox="gallery" class="full">
            <picture>
                <source srcset="/files/webp/{$images[i].file_webp} 1x" type="image/webp">
                <source srcset="/files/{$images[i].file} 1x" type="image/jpeg">
                <img class="fullImg" src="/files/{$images[i].file}" alt="{if $images[i].name}{$images[i].name}{else}{$row.name}{/if}">
            </picture>
        </a>
        {/section}
    </div>
</div>
{/if}
解决方案

1. 调整模板代码,添加索引关联

给缩略图和大图元素都加上同序列的data-index属性,建立两者的对应关系,修改后的模板代码如下:

{if $images}
<div class="galleryHolder left">
    <div class="thumbsHolder left">
        <div class="pos-sticky">
            {section name=i loop=$images}
            <!-- 增加data-index属性绑定索引 -->
            <a href="/files/{$images[i].file}" data-fancybox="gallery" class="thumb" data-index="{$smarty.section.i.index}">
                <picture>
                    <source srcset="/files/webp/tntn/{$images[i].file_webp} 1x" type="image/webp">
                    <source srcset="/files/tntn/{$images[i].file} 1x" type="image/jpeg">
                    <img class="thumbImg" src="/files/tntn/{$images[i].file}" alt="{if $images[i].name}{$images[i].name}{else}{$row.name}{/if}">
                </picture>
            </a>
            {/section}
        </div>
    </div>
    <div class="imagesHolder right">
        {section name=i loop=$images}
        <!-- 增加data-index属性绑定索引 -->
        <a href="/files/{$images[i].file}" data-fancybox="gallery" class="full" data-index="{$smarty.section.i.index}">
            <picture>
                <source srcset="/files/webp/{$images[i].file_webp} 1x" type="image/webp">
                <source srcset="/files/{$images[i].file} 1x" type="image/jpeg">
                <img class="fullImg" src="/files/{$images[i].file}" alt="{if $images[i].name}{$images[i].name}{else}{$row.name}{/if}">
            </picture>
        </a>
        {/section}
    </div>
</div>
{/if}

2. 添加CSS高亮样式

自定义缩略图激活状态的样式,可根据需求调整:

.thumb {
  /* 原有样式不变,加过渡效果更顺滑 */
  transition: all 0.2s ease;
  border: 2px solid transparent;
  opacity: 0.7;
}
.thumb.active {
  /* 高亮样式 */
  border-color: #2563eb;
  opacity: 1;
}

3. 编写JS逻辑检测视口元素

使用IntersectionObserver检测当前进入视口的大图,性能远优于监听scroll事件,代码如下:

// 等待DOM加载完成
document.addEventListener('DOMContentLoaded', () => {
  // 获取所有大图元素
  const fullImages = document.querySelectorAll('.full');
  // 获取所有缩略图元素
  const thumbs = document.querySelectorAll('.thumb');
  
  // 交集观察者配置
  const observerOptions = {
    root: null, // 以视口为根
    rootMargin: '0px',
    threshold: 0.6 // 大图60%进入视口就判定为当前展示图
  };

  // 观察者回调
  const observerCallback = (entries) => {
    entries.forEach(entry => {
      if (entry.isIntersecting) {
        // 获取当前展示图的索引
        const activeIndex = entry.target.dataset.index;
        // 先清除所有缩略图的激活状态
        thumbs.forEach(thumb => thumb.classList.remove('active'));
        // 给对应索引的缩略图加激活状态
        document.querySelector(`.thumb[data-index="${activeIndex}"]`).classList.add('active');
      }
    });
  };

  // 初始化观察者
  const observer = new IntersectionObserver(observerCallback, observerOptions);
  // 给所有大图绑定观察者
  fullImages.forEach(img => observer.observe(img));
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 14:39:03