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

相关推荐
2501_944525543 小时前
Flutter for OpenHarmony 个人理财管理App实战 - 预算详情页面
android·开发语言·前端·javascript·flutter·ecmascript
摘星编程3 小时前
React Native + OpenHarmony:自定义useFormik表单处理
javascript·react native·react.js
YMWM_3 小时前
不同局域网下登录ubuntu主机
linux·运维·ubuntu
pas1364 小时前
39-mini-vue 实现解析 text 功能
前端·javascript·vue.js
2601_949833394 小时前
flutter_for_openharmony口腔护理app实战+我的实现
开发语言·javascript·flutter
大模型玩家七七5 小时前
混合检索不是折中,而是工程理性
android·java·javascript·数据库·人工智能·深度学习
雨季6665 小时前
Flutter 三端应用实战:OpenHarmony 简易“可展开任务详情卡片”交互模式深度解析
开发语言·前端·javascript·flutter·ui·交互
陶甜也5 小时前
Vue.js 多项目同端口部署实战:上下文路径配置指南
前端·javascript·vue.js·nginx
雨季6665 小时前
Flutter 三端应用实战:OpenHarmony 简易文本字符计数器开发指南
开发语言·javascript·flutter
蓁蓁啊6 小时前
CMake无法检测外部库变化的问题
java·javascript·c++·物联网