CSS无法执行搜索,但可通过data-search属性与[attribute*="value"]选择器实现无JS实时过滤;需预处理值为小写、去标点,并用JS动态更新style标签内容,配合display:none正确隐藏元素。
CSS 本身不能“执行搜索”,但可以配合属性和属性选择器,实现无 JS 的实时过滤显隐 —— 前提是数据已静态存在于 HTML 中。
为什么用
而不是
完全匹配(
)要求输入值与属性值一字不差,对用户极不友好;而包含匹配(
)支持模糊查找,比如输入
可同时命中
、
、
(若其
含
)。但注意:
区分大小写,且会匹配子串(如
会误中
),实际使用中建议统一转小写并控制字段内容干净。
推荐在 HTML 中预处理
值为小写、去标点、空格替换为连字符等,例如:
而非
避免在
中塞入长文本或 HTML 内容,否则
易产生意外匹配
不支持正则、不支持多词 AND/OR,纯靠浏览器原生解析,无法做权重排序或高亮
如何动态更新
规则
浏览器不会自动监听
值变化并重写 CSS 规则。所以必须用极简 JS 注入新样式块,或切换预置的 class。最轻量做法是操作
标签内容:
务必对
做
和
,否则空格或大小写会导致匹配失败
直接拼接字符串进
是最快方式,但需确保
不含双引号或反斜杠(生产环境应做简单转义)
若输入为空,应重置为
,否则所有项持续隐藏
vs
的实际影响
用
是正确选择 —— 它真正从渲染流中移除元素,不影响布局、不占空间、不触发重排(reflow);而
仅隐藏视觉,仍占据位置、仍可被 focus、仍参与 tab 键导航,对筛选场景完全不合适。
使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
下载
立即学习
“
前端免费学习笔记(深入)
”;
若列表项有 margin/padding,用
后相邻项会自然贴合,无需额外清除间隙
屏幕阅读器默认忽略
元素,符合“已过滤即不可见”的语义
不要试图用
替代,它既不释放空间,也不阻止交互,还可能被误读为加载态
容易被忽略的兼容性与结构陷阱
这套方案看似简单,但上线前必须验证三件事:HTML 结构是否扁平、CSS 优先级是否被覆盖、
是否真的存在于每个目标元素上。
这类嵌套结构下,
依然生效,但若父容器本身有
或
,隐藏子项可能导致父容器尺寸异常(如高度塌陷),此时需给父容器设
或用
若已有其他 CSS 规则设置了
,会强行覆盖
,必须检查 computed styles 排查冲突
常见疏漏:忘了给每个
添加
属性,或拼错属性名(比如写成
),导致过滤完全失效,且无任何报错提示
data-search[data-search*="xxx"][data-search="xxx"]=*=shshanghaishenzhenbeijingdata-searchsh*=anbananadata-searchdata-search="shanghai"data-search="上海"data-search*=:not([data-search*="..."])const style = document.getElementById('filter-style');
const input = document.getElementById('search-input');
input.addEventListener('input', () => {
const val = input.value.trim().toLowerCase();
style.textContent = `.item:not([data-search*="${val}"]) { display: none; }`;
});valtrim()toLowerCase()style.textContentval.item { display: block; }display: nonevisibility: hiddendisplay: nonevisibility: hiddendisplay: nonedisplay: noneopacity: 0data-search.list .item.item:not([data-search*="x"]) { display: none; }display: flexgridmin-heightheight: fit-contentdisplay: block !importantdisplay: none.itemdata-searchdata-serach