前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库CSS :target pseudo-class URL hash
CSS层叠与选择器

target 伪类是怎么根据 URL 的 hash 来匹配元素的?

:target 匹配 id 等于当前 URL 片段(hash)的那个元素。比如 URL 是 page.html#section2,页面上 id="section2" 的元素就匹配 :target。同一时刻最多只有一个元素匹配。

前端进阶之旅 · 一题精讲更新于 2026.09.29
CSS#层叠与选择器
先看核心答案读代码示例
理解线索

target 的触发和消失

  1. 触发方式点击 <a href="#id"> 或直接修改 URL 的 hash
  2. 匹配规则页面上 id 值等于 hash(去掉 #)的元素匹配
  3. 消失条件hash 变成空或指向另一个 id 时,原元素不再匹配

:target 只看 URL 的 hash 部分。用 JavaScript 的 history.pushState 改变路径不会触发它,必须真正改变 hash。

核心回答

先记住这个答案

:target 伪类匹配 id 属性值等于当前 URL 片段标识符(hash)的元素。当 URL 是 example.com/page#faq 时,页面上 id="faq" 的元素匹配 :target。点击页面内的锚点链接 <a href="#faq"> 会改变 URL 的 hash,自动触发 :target 匹配。同一时刻最多只有一个元素匹配,hash 变了或清空了,原来匹配的元素就不再匹配。

  • 匹配 id 等于 URL hash 的元素
  • 同一时刻最多一个元素匹配
  • 点击锚点链接会自动触发
  • 可以做纯 CSS 选项卡

最常见的用法:锚点导航高亮

长页面的目录导航会用锚点链接跳到对应章节。用户跳过去之后,:target 可以给目标章节加一个高亮样式,帮助用户确认「到了正确的位置」。

高亮当前定位的章节CSS
/* 目标章节加黄色背景和左边框 */
section:target {
  background-color: #fffde7;
  border-left: 4px solid #ffc107;
  padding-left: 12px;
}

/* 平滑滚动到目标 */
html {
  scroll-behavior: smooth;
}

用户点击目录里的链接后,页面滚动到对应章节,同时这个章节背景变成浅黄色。再点击另一个链接时,黄色从旧章节消失,出现在新章节上。配合 scroll-behavior: smooth 还能让滚动过程有动画效果。

纯 CSS 选项卡

:target 的一个经典技巧是做不需要 JavaScript 的选项卡。每个选项卡面板是一个带 id 的元素,默认隐藏。用户点击对应的锚点链接后,URL 的 hash 变化,目标面板匹配 :target,就显示出来。

三个面板切换CSS
/* 所有面板默认隐藏 */
.tab-panel {
  display: none;
}

/* 匹配 :target 的面板显示 */
.tab-panel:target {
  display: block;
}

HTML 结构是 <a href="#panel1"> 对应 <div id="panel1" class="tab-panel">。点击不同的链接就切换不同面板。这种做法的好处是完全不需要 JavaScript,而且 URL 里带着 hash,刷新页面也能恢复到正确的选项卡。 不过也有局限:页面刚加载时如果 URL 没有 hash,所有面板都不显示。通常的解决办法是让第一个面板默认显示,用 :target ~ .default-panel 这类选择器来控制。

回答前,多想一步

容易答错的地方

以为 pushState 能触发 target
JavaScript 的 history.pushState 和 history.replaceState 可以改变 URL,但不会触发 :target 的重新计算。只有真正改变 hash(通过点击锚点链接或设置 location.hash)才会让 :target 更新。
以为多个同 id 的元素都会匹配
id 在同一页面内应该是唯一的。如果有多个元素写了相同的 id,:target 只匹配 DOM 中第一个出现的那个,其他的不会生效。而且重复 id 本身就是无效的 HTML。
试着用自己的话回答

面试官还会怎么问?

target 和 scroll-margin-top 有什么关系?

页面有固定头部(position: fixed)时,锚点跳转会让目标内容被头部遮住。给匹配 :target 的元素加 scroll-margin-top 可以解决这个问题。比如 section:target { scroll-margin-top: 80px; } 会让浏览器多滚动 80px,留出头部的空间。

怎么在 URL 没有 hash 时也让 target 有默认值?

CSS 本身做不到。:target 只在有 hash 且匹配到元素时才生效。一个变通方法是在页面加载时用 JavaScript 设置一个默认的 hash。或者在 CSS 里不依赖 :target 做默认显示,只用 :target 做覆盖。

SPA 里 target 还能用吗?

单页应用通常用路由管理 URL,hash 模式的路由(#/about)中 hash 是路由路径,不是元素 id,:target 不会匹配。如果用 history 模式路由,hash 部分可以单独用于页面内锚点,:target 就能正常工作。

从一道题,走向一组知识

把知识连起来

层叠与选择器

before 和 after 伪元素的 content 属性能设置哪些值?

:target 配合 ::before 可以给当前定位的章节自动添加视觉指示符,两者经常一起使用。

层叠与选择器

selection 伪元素能自定义哪些样式?有哪些限制?

::selection 和 :target 都是给用户正在关注的内容加样式,一个是选中文字,一个是定位章节。

参考资料

  • CSS:层叠与选择器参考资料

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 最常见的用法:锚点导航高亮
  3. 纯 CSS 选项卡
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑