- 目标的唯一性: 只有当移动端标签栏的CSS选择器在页面中精确匹配唯一元素时,才能准确滚动到指定位置。
- 两步验证法: 先通过检查工具获取容器ID,并在保存链接前于控制台(Console)中确认其匹配数量为1。
- 长期稳定性: Shopify在JSON模板中动态生成分区ID。对于核心滚动目标,使用Custom Liquid添加固定的自定义ID最为稳妥。
快速回答
打开正式上线的商城首页,右键点击目标分区并选择“检查”(Inspect)。找到ID以 shopify-section- 开头的外层容器,在ID前加上 #,然后在控制台执行 $$('#该ID').length。如果返回值是1,该选择器即为一个可靠的滚动目标。
在配置移动端底部标签栏或导航菜单时,商家经常会遇到要求输入“CSS选择器”的设置项。因为浏览器是通过在页面的DOM树中查找匹配节点来执行滚动动作的,输入错误或非唯一的选择器会导致页面跳转到错误位置甚至毫无反应。在正式保存前利用开发者工具进行验证,能确保移动端导航始终精准可靠。
选择器、分区ID与锚点:标签栏链接真正需要什么
在向导航设置中填写代码之前,有必要分清三个容易混淆的技术概念:CSS选择器、HTML分区ID与锚点链接。菜单应用和主题配置对这些字段的要求各不相同,输入错误的格式会导致链接失效。
CSS选择器(CSS Selector)是样式表和脚本用来定位一个或多个HTML元素的表达式。常见的如 #reviews(精确定位ID为 reviews 的元素)或 .featured-collection(定位包含该类名的任何元素)。依据MDN Web Docs关于id属性的规范,id 属性在整个HTML文档中必须是唯一的。Section Store的技术指南也印证了这一点:一个ID仅属于一个元素,因此总能准确落到目标位置。
而锚点链接(Anchor Link)则是包含片段标识符的完整或相对URL,例如 /#reviews。浏览器读取地址栏中的井号 #,并自动平滑滚动至具有对应ID的元素位置。如果导航应用提供了专用的“CSS选择器”输入框,它需要的是选择器表达式(如 #reviews),而不是完整的网页网址。若需要配置常规的URL锚点链接,请参阅我们关于移动标签栏锚点链接的配套指南。
引导移动端购物者直达首页的核心内容板块,是移动端标签栏架构设计的核心要点。下表清晰展示了各格式的实际差异:
| 格式类型 | 适用场景 | 语法示例 | 关键技术规则 |
|---|---|---|---|
| CSS选择器 | 导航应用中专门要求填写选择器的设置框 | #reviews 或 #shopify-section-template--custom |
在当前页面中必须严格匹配唯一元素 |
| 分区ID | HTML源码中分区标签上的标记属性 | id="reviews"(不包含井号 #) |
在整个HTML文档中必须全局唯一 |
| 锚点链接 | 常规URL链接字段及浏览器地址栏 | /#reviews 或 https://store.cn/#reviews |
写成带 # 片段的 URL,并不是选择器 |
第1步:在实际运行的首页上检查分区
为了获取真实有效的选择器,请以普通顾客的视角在浏览器中打开商城首页,切勿在Shopify主题编辑器内进行检查。线上页面才是顾客实际加载的页面,因此是查看真实标记最稳妥的地方。
打开新的浏览器标签页,进入已上线的商店首页,滑动到想要定位的分区(如客户评价、常见问题解答或精选商品)。在标题或背景空白处右键点击,选择“检查”(Inspect)。
也可以使用键盘快捷键调出开发者工具:
- macOS: 按下
Cmd + Option + C(Chrome DevTools Open) - Windows: 按下
Ctrl + Shift + C(Chrome DevTools Open)
打开元素检查器的快捷键:
macOS: Cmd + Option + C
Windows: Ctrl + Shift + C
读取shopify-section外层容器
当Elements面板打开后,检查器会高亮显示你点击的具体文字或图片标签。要建立可靠的整体滚动目标,必须在DOM树中向上查找包裹整个分区的容器。
- 在 Elements 面板中,将鼠标沿着父级标签向上移动。
- 找到包裹整个分区的外层容器(通常为
<div>标签)。 - 找到它的
id属性。在Shopify店铺中,该容器ID通常以shopify-section-开头。
正如官方Shopify Section对象技术文档所述,通过JSON模板加载的分区ID是由Shopify动态生成的。ID 可能类似 shopify-section-template--18492048593__featured_collection,但你的 ID 会不同,请直接从自己的页面复制。
<!-- Shopify分区包装容器示例 -->
<div id="shopify-section-template--18492048593__reviews" class="shopify-section">
<!-- 分区内容在此渲染 -->
</div>
将属性转换为选择器(ID用 #,类用 .)
定位到容器行后,将其HTML属性转换为标准的CSS选择器语法:
- 使用
id属性值:在前面加上#,如#shopify-section-template--18492048593__reviews - 使用
class属性值:在前面加上.,如.featured-reviews-grid - 若元素有多个由空格分隔的类名,用点号依次连接:
div.shopify-section.reviews-container
Chrome DevTools还提供了一键复制功能:在Elements树中右键点击高亮的外层节点,选择 Copy,然后点击 Copy JS Path(Chrome DevTools DOM)。剪贴板中将生成如下代码:
document.querySelector("#shopify-section-template--18492048593__reviews")
提取双引号内的字符串,该内容即为候选选择器。在将其填入导航栏之前,必须核验其唯一性。
第2步:确认选择器精确匹配唯一元素
许多店主容易误以为只要是从开发者工具复制出来的选择器就能直接使用。然而,如果选择器匹配了多个分区,或者在移动端尺寸下无任何匹配,底部标签栏就会失常。
UpCharge的技术文档强调,在指定页面位置时必须寻找唯一的类或ID。借助浏览器自带的开发工具,这项检查很快就能完成。
在Elements面板中搜索 (Ctrl/Cmd+F)
最迅速的初步排查是直接在DOM树中搜索。Chrome DevTools DOM文档指出,用户可以通过字符串、CSS选择器或XPath在DOM树中执行查找。
- 点击 Elements 面板内部任意位置。
- 按下
Ctrl + F(Windows) 或Cmd + F(macOS) 调出底部的搜索条。 - 粘贴包含
#的候选选择器(例如#shopify-section-template--18492048593__reviews)。 - 观察搜索框右侧的结果计数器(例如
1 of 1)。
Elements面板搜索核查:
表达式: #shopify-section-template--18492048593__reviews
目标结果: 1 of 1
若计数器显示 1 of 1,说明该选择器指向DOM树中唯一的节点。
在控制台(Console)中统计匹配数
为了从脚本运行层面获得确定性的验证,请切换至DevTools的 Console 选项卡。
根据Chrome DevTools Console Utilities API,辅助工具函数 $$(selector) 会返回匹配指定CSS选择器的全部元素数组。也可以使用标准Web API方法 document.querySelectorAll(selector)(MDN querySelectorAll)。
在Console命令行中输入以下任一命令并回车:
$$('#shopify-section-template--18492048593__reviews').length
document.querySelectorAll('#shopify-section-template--18492048593__reviews').length
根据返回的数值判定状态:
| 匹配数量 | 技术含义 | 对标签栏滚动的影响 | 应对措施 |
|---|---|---|---|
| 0 | 没有元素与该选择器匹配 | 根据MDN querySelector,无匹配将返回 null,标签不会滚动。 |
检查拼写是否错误,排查分区是否被隐藏,或重新检查容器节点。 |
| 1 | 精确匹配一个元素 | 目标明确稳定,浏览器脚本可准确执行平滑定位。 | 符合要求,可直接用于配置标签栏链接。 |
| 2个及以上 | 多个元素共用该选择器 | querySelector 始终只抓取DOM中的第一个匹配元素(MDN querySelector)。 |
进一步细化选择器层级,或通过步骤3设置独立的自定义ID。 |
务必在模拟移动设备状态下重复此检查。点击DevTools顶部的 Toggle device toolbar 图标。部分Shopify主题会针对桌面端和移动端输出两套独立分区,可能导致选择器在移动端消失或重复。

概念示意图:在控制台中验证匹配项数量,确保选择器精准匹配唯一元素。
第3步:选择不受主题编辑影响的持久选择器
虽然带有 shopify-section- 前缀的自动生成ID适合快速测试,但在长期运营中依赖它存在维护隐患。
在Shopify Online Store架构中,JSON模板内分区的ID由系统动态分配(Shopify Section Object)。主题开发商Fluorescent明确指出了这一局限:“Shopify dynamically generates ids for sections but these ids are not stable.”(Shopify为分区动态生成ID,但这些ID并不稳定)。由于这些 ID 并不稳定,依赖它们的标签链接可能在调整布局后失效,因此每次修改后都应重新检查。
同时应避免使用如 div:nth-child(4) > div.grid > div:first-child 这类多层级的脆弱类名链。版面结构变动都可能使选择器失效。
稳健方案:通过Custom Liquid添加自定义ID
要获得一个在主题更新和排版修改中永久有效的选择器,可在主题自定义后台设置一个专属的静态ID:
- 在Shopify后台中进入 在线商店 > 模板。
- 复制正在运行的主题以建立安全备份。
- 点击工作主题的 自定义 按钮。
- 在首页分区布局列表中,定位到目标分区上方,点击 添加分区 或 添加块。
- 选择 Custom Liquid(部分主题名为自定义HTML)。
- 输入带有自定ID的轻量HTML锚点代码:
<div id="reviews"></div>
ID名称请使用小写英文和短横线(例如 customer-reviews、faq-section 或 best-sellers)。按照MDN id属性参考规范,该ID在当前页面中必须具备唯一性。
| 策略对比 | 自动生成的分区ID | Custom Liquid自定义ID (<div id="...">) |
|---|---|---|
| 语法示例 | #shopify-section-template--18492048593__reviews |
#reviews |
| 配置成本 | 无(从开发者工具直接复制) | 需要在分区上方插入一个微型Custom Liquid块 |
| 跨编辑稳定性 | 脆弱;重建或替换分区时ID容易发生变动 | 只要保留该区块,ID 就保持不变 |
| 可读性 | 字符串冗长复杂,难以记忆与识别 | 简短直观,在店铺维护文档中清晰易懂 |
| 推荐用途 | 临时调试与快速原型验证 | 正式上线的商城移动端导航栏 |
下方来自EcomGraduates的视频教程直观展示了如何在Shopify主题中检查分区并设置自定义锚点ID:
棘手情况:无明确ID、嵌套分区、移动端独占与特殊字符
在某些特殊的Shopify店铺配置下,标准选择器的抓取可能会遇到阻碍。采取结构化的应对方法可避免链接断裂。
分区外层没有明确的ID
某些定制开发的分区或第三方页面构建器生成的模块未在外层容器输出标准ID。此时与其拼接一长串脆弱的类名(样式更新时极易损坏),不如采用步骤3的Custom Liquid方案。在分区上方嵌入 <div id="your-id"></div> 即可生成明确的定位锚点,完全无需改动主题底层的模板文件。
嵌套分区与应用块
若要滚动到原生分区内部的应用块(如嵌入在商品网格内的评价组件),直接定位该应用的内层容器可能无法滚动到预期位置,请务必实际测试。建议定位外层的 shopify-section 容器,或将自定义锚点标签放置于分区上方。
移动端独占或桌面端独占分区
不少商家会为移动端和桌面端配置不同的横幅分区。如果桌面端分区带有ID,而移动端使用了另一套未关联的模块,标签栏在手机上就会失效。务必在DevTools的设备模拟模式下检查店铺,并将选择器指向手机上真实渲染的容器。
包含特殊字符与CSS转义规则
根据MDN querySelector技术规范,如果类名或ID不是合法的CSS标识符(例如以数字开头,或含有冒号、点号、问号等),必须通过 CSS.escape() 进行转义。诸如 123-reviews 这类ID在原生CSS中必须进行转义处理。
为防止在导航应用中出现语法解析错误,请彻底避免使用奇特字符。自定义ID仅采用小写英文字母、数字和连字符,在链接输入框中也不要填入任何引号或括号。
将选择器设为标签栏的滚动目标
确认选择器仅对应唯一元素后,即可将其填入移动标签栏的配置项中。
首先查阅导航应用或主题设置的说明文档,核实该链接框接收的是带有井号的完整URL(如 /#reviews),还是纯粹的CSS选择器表达式(如 #reviews)。
如果应用提供了专门的CSS选择器字段:
- 粘贴在步骤2中确认无误的选择器(如
#reviews或#shopify-section-template--custom)。 - 确保语法格式完全符合应用的要求规范。
- 保存菜单配置。
需要注意的是,浏览器的滚动逻辑仅针对当前打开的活跃页面生效。如果访客在浏览商品详情页或商品系列页时点击了配置有页面内选择器的标签,查询结果将返回 null(MDN querySelector),屏幕不会产生任何滚动。请始终从首页开始进行点击测试。
同时,将创建的ID记录在店铺的开发备忘录中,防止团队其他成员在后续整理版面时误删Custom Liquid锚点代码。
故障排查:标签不滚动、被标题栏遮挡或跳错位置
如果标签栏的滚动表现在手机上不尽如人意,请按照以下几项进行排查:
标签点击后完全不滚动
在正式运行的首页上打开控制台,再次执行 $$('#你的选择器').length。若结果为 0,说明该元素未在当前页面渲染、近期发布主题时分区ID已改变,或者选择器存在拼写错误。根据MDN文档,无法匹配的选择器会返回 null 并终止滚动动作(MDN querySelector)。
标签跳转到了错误的位置
如果点击标签后页面跳到了顶部或底部,而非预期的分区,通常是因为该选择器匹配到了多个元素。当存在多个匹配节点时,querySelector 会默认选取DOM中出现的首个元素(MDN querySelector)。使用控制台排查重复项,并更换为独立的Custom Liquid自定义ID。
分区标题被吸顶(Sticky)头部遮挡
在默认情况下,浏览器的滚动算法会将目标元素的上边缘与屏幕视口的最顶端对齐。如果店铺启用了固定或吸顶的导航标题栏,该标题栏就会直接遮住分区的文字标题。
根据MDN scrollIntoView技术文档,可以通过CSS的 scroll-margin-top 属性定义合理的偏移量:“To define a custom spacing, use scroll-margin-top or scroll-margin-bottom. This is often useful when there’s a fixed header on the page.”(如需定义自定义间距,请使用scroll-margin-top或scroll-margin-bottom。在页面存在固定头部时这非常实用)。
在DevTools中测出吸顶头部的实际像素高度,并在主题自定义CSS中为目标分区设置对应的间距:
/* 为移动端吸顶头部留出避让间距 */
#reviews {
/* Replace 80px with your own header height */
scroll-margin-top: 80px;
}
侧边抽屉菜单(Drawer)遮挡屏幕
如果底部标签栏与侧边抽屉菜单并存,在抽屉展开状态下点击标签可能引起界面冲突。遵循移动端抽屉菜单设计准则,可保证在触发外部链接时抽屉蒙层能够自动关闭。
图片延迟加载(Lazy-load)导致停止位置发生偏移
若目标分区上方包含大尺寸的轮播图片,延迟加载机制可能会在滚动动画结束后才重新撑开页面高度,使视口产生上下位移。请在整页图片完全加载完毕后再行测试。

概念示意图:通过CSS scroll-margin-top属性解决固定头部遮挡分区标题的问题。
权衡取舍:何时不宜使用选择器滚动
虽然定位到页内分区能提供顺畅的单页交互体验,但这并不意味着它是所有电商结构的灵丹妙药。
需要独立页面的大篇幅内容
如果链接指向的是庞大的商品目录、详尽的政策或深入的客服解答,把它们塞进首页的一个分区会让内容更难被找到和分享。独立的商品系列页面或政策页面各自拥有专属 URL,标签可以直接链接过去,而无需依赖页内滚动。
标签栏过度拥挤引起认知负荷
移动端底部标签栏的定位是用大拇指在商城的核心板块之间快速切换。如果给底部标签分配过多用于首页内部滚动的按钮,会使操作栏臃肿混乱,并在顾客深入浏览目录时失去导航意义。正如我们在超越汉堡菜单的导航体系中所阐述的,底部标签应严格留给最高频的核心目的地。
主题依赖度与后续维护成本
任何依赖主题自动生成代码的选择器,在更换或升级模板时都需要重新核验。当原版主题自带的菜单功能遇到维护瓶颈时,商家有必要审视主题原生菜单的局限性,评估采用专门的导航工具是否更具长远价值。
Navi+的适用场景
Navi+通过其Tab Bar(底部标签栏)与Mobile Menu(移动端菜单)组件为Shopify商家提供专业的导航控制能力。每个菜单项都配备了独立的 Link To 字段,不仅支持标准网址,还兼容各种功能性交互语法。
对于需要在首页平滑滚动到指定分区的商家,Navi+支持 scroll:OnPage(#section-id) 语法,该功能在官方帮助中心中被明确定义为“通过CSS选择器滚动到分区”(Navi+ 链接类型说明)。该功能适用于Business及Elite套餐。
配置时,填入在步骤2中验证过的唯一匹配选择器即可。由于页面内滚动机制直接作用于当前打开页面的DOM,目标分区必须存在于访客正在浏览的网页上。请始终在真实手机上从首页开始进行点击测试。
如果你正在使用 Navi+ Tab Bar,只需将测试好的选择器以 scroll:OnPage(#你的ID) 的格式粘贴到标签的 Link To 字段中,然后直接在手机上从首页进行点击测试。Navi+ 帮助中心提供了所有支持的链接类型的完整列表。
操作核对清单
参考以下7项核对步骤完成分区选择器的设置与上线:
- 在电脑浏览器中打开正式运行的商城首页(不在主题编辑器内)。
- 右键点击目标分区,选择“检查”,找到 ID 以
shopify-section-开头的外层容器。 - 记录容器的ID并在其前面添加
#组成候选选择器。 - 在DevTools的Console中执行
$$('#你的选择器').length,确认返回值严格等于1。 - 切换至移动端仿真视图,确保该选择器在手机尺寸下同样存在且保持唯一。
- 如需追求长期稳定,在目标分区正上方添加包含
<div id="你的ID"></div>的Custom Liquid块。 - 将确认后的选择器配置到标签栏设置中,若标题被吸顶栏遮挡则配置
scroll-margin-top,并在真实手机上进行测试。
常见问题解答 (FAQ)
在Shopify后台的哪里可以查看分区ID?
分区ID不会显示在Shopify的常规管理后台中。若要查看分区ID,请在浏览器中打开已上线的商店前台,右键点击该分区,选择“检查”,并在外层 shopify-section 容器上读取其 id 属性(Shopify Section Object、MDN querySelectorAll)。
为什么分区的选择器突然失效了?
Shopify会自动为JSON模板中的分区生成动态ID,当重新编辑版面或重建分区时,这些ID可能会发生变更(Shopify Section Object、Fluorescent)。通过Custom Liquid块设置静态自定义ID能保证长期的稳定性。
如何确定我的选择器只对应一个元素?
在开发者工具的Console选项卡中输入 $$(selector).length 或 document.querySelectorAll(selector).length(Chrome DevTools Console Utilities、Chrome DevTools DOM)。返回数字1即证明该选择器在当前页面中具有唯一性。
可以直接使用DevTools中的“Copy selector”吗?
Chrome的“Copy selector”或“Copy JS Path”可用于初期测试,但生成的深层选择器链在主题改版时极易失效。最稳妥的方式是将其精简为分区特有的唯一ID。
如果选择器匹配到了多个分区会发生什么?
当选择器对应多个元素时,JavaScript中的 querySelector 方法只会抓取DOM中按顺序出现的第一个元素(MDN querySelector)。这会导致点击标签后错误跳转到上方无关的分区。
为什么滚动后分区标题被吸顶头部遮挡?
浏览器默认会将目标元素的上边界与屏幕视口最顶端对齐。若店铺拥有固定或吸顶的头部栏,该栏目便会遮盖住标题。为目标分区设置CSS属性 scroll-margin-top 即可建立所需的避让距离(MDN scrollIntoView)。
参考来源
- Shopify Developer Documentation: Section Liquid Object — JSON模板中分区ID动态生成的官方机制说明。
- Fluorescent Documentation: Custom Liquid Developer Guide — 分区ID动态特性解析及自定义锚点实施指南。
- MDN Web Docs: HTML id 全局属性 — 规范整个文档中ID属性唯一性的技术标准。
- MDN Web Docs: Document.querySelector() — 优先匹配规则、未匹配null返回及选择器字符转义规则。
- MDN Web Docs: Document.querySelectorAll() — 选择器匹配验证中的静态NodeList集合原理。
- MDN Web Docs: Element.scrollIntoView() — 视口对齐机制及通过scroll-margin-top设置间距的标准。
- Chrome for Developers: Chrome DevTools DOM Inspection — DOM树搜索能力与节点表达式复制说明。
- Chrome for Developers: Console Utilities API — 选择器查询辅助函数
$$(selector)的应用规范。 - Chrome for Developers: Open Chrome DevTools — 各操作系统开启开发者检查模式的快捷键。
- Section Store Help: Custom Placement: Finding a CSS Selector — 关于元素ID唯一性与精准定位的建议。
- UpCharge Help Center: Selector Settings Guide — 商家寻找唯一类名与ID的实操指导。
- Navi+ Help Center: Navigation Item Link Types — Business及Elite套餐下
scroll:OnPage(#section-id)的官方语法规范。
探索更多主题
本指南链接到一系列专题文章——逐一深入了解。