114、【Ubuntu】【Hugo】搭建私人博客:搜索样式(二)

【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除

背景

上篇 blog
【Ubuntu】【Hugo】搭建私人博客:搜索样式(一)

分析了 fastsearch.js 里最后的 activeToggle 功能,以及 CSS 样式 search.css 的部分内容,下面继续

搭建私人博客

上篇 blog 提到了 :active 伪类主要是鼠标(或触控)交互触发的,和键盘导航无关,下面再详细说下这里的点

首先,键盘导航不会触发 :active,当用方向键 ↑↓ 选中某一项时,JS 会给 <li> 搜索结果列表项添加一个 class,比如 .focus,触发自定义的 CSS 样式,比如

javascript 复制代码
#searchResults .focus {
    transform: scale(0.98);
    border: 2px solid var(--tertiary);
}

但不会触发 :active,因为没有鼠标或者触控那种按下的动作,只是单纯的键盘导航

所以总结一下

  • :active:给鼠标或者触控用户用的点击反馈
  • .focus:给键盘用户用的高亮状态

另外,再对比下常用的三种交互方式

操作方式 CSS 状态 视觉效果
鼠标点击(按住不松开) :active(自动赋予状态) 缩小 98%(瞬间反馈)
键盘选中(方向键) .focus(要用 JS 手动添加) 缩小 + 边框(持续高亮)
鼠标悬停 :hover(自动赋予状态) 可以赋予 CSS 样式,比如变色

这是现代 Web 开发中区分不同交互模式的典型做法,是无障碍(Accessibility)和用户体验的最佳实践,比如鼠标用户看到按下时缩小的动效,就知道点击生效了,而键盘用户看到边框高亮,就知道当前选中的是哪一项,这些交互体验不同,但都清晰,可操作

OK,既然对比到了 .focus 属性,就顺便先说下这部分

这里是键盘导航的高亮样式,当某个搜索结果项被键盘选中(通过方向键)时,之前介绍的 fastsearch.js 会给这个 <li> 列表项加上 class="focus",这个样式的视觉效果:

  • 同样缩小到 98%,和 :active 一致
  • 加上 --teritary 颜色的边框,明确只是当前选中项

OK,下面看最后一个样式,也是最关键的,透明全屏点击层 <a href ...>

这个 <a> 在之前 fastsearch.js 介绍过,是空的,透明的,但是能覆盖整个 <li> 列表项区域

其关键点就在于这里的 position: absolute,这个配置项会让 <a> 覆盖整个父容器,但父容器是哪一个元素?这就涉及到上篇 blog 提到的 position: relative 配置了

在 CSS 中,一个 position: absolute 的元素,会相当于最近的,非 static 定位的祖先元素进行定位,而默认情况下,所有元素的 position 都是 static 静态定位的,不能作为 absolute 的定位参考

如果 <li> 没有 position: relative 的话,结构像这样

html 复制代码
<li>               <!-- 默认 position: static -->
  <header>标题</header>
  <a href="..."></a> <!-- position: absolute -->
</li>

那么 <a href...> 会一直往上找,直到找到 <body><html>,或者某个元素有 position: relative/absolute/fixed 属性的,结果就是 <a> 可能覆盖整个页面,或者定位错乱

而现在 <li>position: relative 属性,那么 <a href...>top: 0left: 0width: 100%height: 100% 就是相对这个 <li> 列表项的,<a> 会完美地覆盖当前这一项,不多也不少,也就是说,这个 <a> 是空的,透明的,但也能覆盖整个 <li> 区域,所以效果就是下面这样

此时用户点击 <li> 的任何位置都能触发跳转(因为 <a> 是可点击的),这是一种常见技巧,可以让整个卡片可点击,而不仅限于于文字

另外,#searchResult 中的属性 outline: none 表示移除默认焦点轮廓(配合 fastsearch.js.focus 类做自定义高亮)


OK,本篇先到这里,如有疑问,欢迎评论区留言讨论,祝各位功力大涨,技术更上一层楼!!!更多内容见下篇 blog
【Ubuntu】【Hugo】搭建私人博客:搜索功能配置

相关推荐
张元清4 小时前
useEffect 之外:专门处理异步、深比较和 SSR 的 Effect Hook
前端·javascript·面试
XinZong5 小时前
OpenClaw 中最经典的 6 款skill,真正能进工作流的 skills
javascript·后端
XinZong5 小时前
2026 AI社交深度评测:InStreet 与 ClawReach 核心差异解析
javascript
Bug-制造者6 小时前
【Vue3 实战】全局错误处理体系搭建:实现业务与错误彻底解耦
前端·javascript·vue.js
竹林8186 小时前
从ethers.js迁移到Viem:我在DeFi Dashboard项目中踩过的坑与最终方案
javascript
zithern_juejin6 小时前
ES6——Promise
javascript
桜吹雪7 小时前
所有智能体架构(1):反思 (Reflection)
javascript·人工智能
ZC跨境爬虫8 小时前
跟着 MDN 学 HTML day_61:(构建反馈表单的结构化挑战)
前端·javascript·ui·html·音视频
豹哥学前端9 小时前
JavaScript 异步编程完全指南:从回调地狱到 async/await,一次通关
前端·javascript·面试
kyriewen9 小时前
面试官让我手写Promise,我打开Cursor三秒生成,他愣了两秒说“你过了”
前端·javascript·面试