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】搭建私人博客:搜索功能配置

相关推荐
kyriewen11 小时前
别再对着 TypeScript 报错发呆了:我把 10 个最常见的红色波浪线翻译成了人话
前端·javascript·typescript
free3512 小时前
从 0 实现一个 Tiny JavaScript VM:项目架构拆解
javascript
徐小夕14 小时前
我们开源了一款“框架无关”的思维导图编辑器,3分钟集成到任意系统
前端·javascript·github
PBitW14 小时前
GPT训练我的第三天,明白了应该咋说满分回答!😕😕😕
前端·javascript·面试
像我这样帅的人丶你还14 小时前
Java 后端详解(四):分页与搜索
java·javascript·后端
labixiong14 小时前
还原一个完整符合规范的 Promise(二)
前端·javascript
To_OC15 小时前
万字解析《JS 语言精粹》之第五章:继承 5 大核心精髓(JS 原型核心)
前端·javascript·代码规范
裕波16 小时前
AI 正在重写应用开发。Vue 与 Vite,给出新的答案。
javascript·vue.js
kyriewen18 小时前
折腾了半年 AI 编程工作流,最后发现效率瓶颈是桌上那块屏幕
前端·javascript·ai编程
张元清20 小时前
React useDebounce Hook:给状态和回调做防抖(2026)
javascript·react.js