如何实现卡片搜索无结果时准确显示“未找到卡片”提示

如何实现卡片搜索无结果时准确显示“未找到卡片”提示

本文旨在解决动态卡片搜索中“未找到卡片”提示显示不准确的问题。通过优化javascript逻辑,我们展示了一种更健壮的方法:首先隐藏所有卡片,然后根据搜索条件过滤并仅显示匹配的卡片,最后根据匹配结果的数量精确控制“无内容”提示的可见性,确保用户体验的准确性和流畅性。

动态卡片搜索中“无结果”提示的实现与优化

在网页开发中,实现带有搜索功能的卡片布局是常见的需求。用户输入搜索关键词后,页面应动态显示匹配的卡片,并在没有匹配结果时提供友好的提示。然而,不恰当的逻辑可能导致“无结果”提示过早或错误地出现。本教程将详细探讨如何使用HTML、CSS和JavaScript构建一个健壮的卡片搜索功能,并特别关注“无结果”提示的正确显示。

初始问题分析

原始的JavaScript代码在处理搜索逻辑时存在一个常见误区。它在遍历卡片时,一旦遇到不匹配的卡片就立即将“无内容”提示设置为可见。这意味着,即使后续还有匹配的卡片,或者在搜索过程中仍有卡片可见,这个提示也可能被错误地显示出来。

function myFunction() {  var input, filter, cards, cardContainer, noContent, title, i, cardExist;  input = document.getElementById("myFilter");  noContent = document.getElementById("no-content");  filter = input.value.toUpperCase();  cardContainer = document.getElementById("myItems");  cards = cardContainer.getElementsByClassName("blog-card");  noContent.style.display = "none"; // 每次搜索开始时隐藏提示  for (i = 0; i  -1) {      cards[i].style.display = "block";    } else {      cards[i].style.display = "none";      // 错误:在这里直接显示 noContent 可能导致误判      noContent.style.display = "flex";     }  }}

上述代码的问题在于 noContent.style.display = “flex”; 语句被放置在 else 分支内。这意味着只要有一张卡片不匹配,”no-content” 元素就会被显示。如果搜索结果中包含多张卡片,但其中只有一张不匹配,”no-content” 元素也会被错误地显示出来,从而误导用户。

优化后的解决方案

为了确保“无结果”提示仅在确实没有任何卡片匹配搜索条件时才显示,我们需要调整逻辑,采用“先处理所有卡片,再统一判断结果”的策略。

1. HTML 结构

首先,确保你的HTML结构包含一个搜索输入框、一个卡片容器以及一个用于显示“无内容”提示的元素。

Auto Repair

Dentist

there are no more blog post with this term

注意: no-content 元素在初始状态下应设置为 display: none; 或使用 hidden 属性,以确保它在页面加载时不会显示。

2. CSS 样式

为了美观和功能性,需要为卡片、搜索框和“无内容”提示定义相应的CSS样式。no-content 类的样式确保它在显示时能够居中并具有良好的可读性。

@import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@500&family=Open+Sans:wght@700&display=swap');/* 搜索输入框样式 */.input-container {  display: flex;  justify-content: center;  width: 100%;}.input-container .search-imput {  margin: 20px;  width: 50%;  height: 40px;  border-radius: 30px;  border: 2px solid #6F77E9;}::placeholder {  color: #161663;  font-weight: bold;  text-align: center;  font-size: 1em;}/* 卡片容器和卡片样式 */.card-container {  display: flex;  flex-wrap: wrap;  justify-content: center;  flex-direction: row;  margin: 50px;  /* width: 100%px;  此处应为 width: 100%; 或删除 px */}.blog-card {  width: 490px;  height: 470px;  margin: 15px;  border-radius: 20px;  box-shadow: 0px 0px 4px 0px rgba(22, 22, 99, 0.30);}/* ... 其他卡片内部元素样式 ... *//* 无内容提示样式 */.no-content {  width: 100vw;  height: 50vh;  display: flex; /* 默认设置为 flex,通过 JS 控制显示/隐藏 */  justify-content: center;  align-items: center;}.no-content h1 {  font-size: 20px;  padding: 0px 20px;  font-family: 'Montserrat', sans-serif;  color: #161663;}

3. JavaScript 逻辑

核心优化在于JavaScript函数 myFunction()。我们将采用以下步骤:

获取所有卡片元素。首先隐藏所有卡片,清除上一次搜索的状态。根据搜索输入过滤出所有匹配的卡片。只显示那些匹配的卡片。根据匹配卡片的数量来决定是否显示“无内容”提示。

function myFunction() {  const input = document.getElementById("myFilter");  const noContent = document.getElementById("no-content");  const filter = input.value.toUpperCase();  const cardContainer = document.getElementById("myItems");  // 将 HTMLCollection 转换为数组,以便使用 forEach 和 filter 方法  const cards = Array.from(cardContainer.getElementsByClassName("blog-card"));  // 步骤 1: 首先隐藏所有卡片,重置显示状态  cards.forEach(card => card.style.display = "none");  // 步骤 2: 过滤出所有匹配搜索条件的卡片  const matchingCards = cards.filter(    card => card.querySelector(".card-title").innerText.toUpperCase().includes(filter)  );  // 步骤 3: 显示所有匹配的卡片  matchingCards.forEach(card => card.style.display = "block");  // 步骤 4: 根据匹配卡片的数量,决定是否显示“无内容”提示  noContent.style.display = (matchingCards.length === 0 ? "flex" : "none"); }

关键改进点与最佳实践

分离关注点: 新的逻辑将“隐藏所有卡片”、“查找匹配卡片”、“显示匹配卡片”和“显示/隐藏无内容提示”这几个步骤清晰地分离开来。这使得代码更易于理解和维护。统一处理: 不再在循环内部逐个判断并显示“无内容”提示,而是先完成所有卡片的显示/隐藏操作,最后根据整体结果统一处理“无内容”提示的可见性。使用现代JavaScript: Array.from() 将 HTMLCollection 转换为真正的数组,从而可以使用 forEach 和 filter 等数组方法,使代码更简洁、更具表现力。初始状态: 确保 no-content 元素在页面加载时的初始状态是隐藏的(例如,通过 style=”display: none;” 或 CSS 规则)。

总结

通过上述优化,我们解决了动态卡片搜索中“无结果”提示显示不准确的问题。这种“先隐藏全部,再显示匹配,最后判断总数”的策略是处理此类交互功能的标准做法,它不仅提升了用户体验的准确性,也使JavaScript代码更加清晰和易于维护。在构建类似的动态内容过滤功能时,请务必采纳这种分离逻辑和统一判断的思路。

以上就是如何实现卡片搜索无结果时准确显示“未找到卡片”提示的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1589531.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月23日 05:10:39
下一篇 2025年12月23日 05:10:56

相关推荐

  • 如何设置宽度自适应且左右边距始终为 1rem 的 div?

    如何设置宽度不可固定且两边边距始终为 1rem 的 div 在 css 中,设置元素宽度而不使用固定单位(如像素或百分比)可以确保元素在不同屏幕上都能适应。对于需要同时保持左右边距的元素,以下方法可以解决该问题: div { margin-left: 1rem; margin-right: 1rem…

    2025年12月24日
    000
  • 如何设置宽度不固定的 div,保持左右边距始终为 1rem?

    如何设置宽度不固定但左右边距为 1rem 的 div? 问题描述:如何设置一个div的宽度不固定,但是居左右边距都是1rem?希望不用百分比表示,因为在不同的屏幕上差距太大,希望左右边距始终为 1rem。 答案: 实现此效果的 css 代码如下: div { margin-left: 1rem; m…

    2025年12月24日
    000
  • 如何解决 div 中换行符显示为空格的问题?

    换行符在 div 中显示为空格的解决方案 纯文本中的换行符通常会显示为 div 中的空格,导致文本格式被破坏。要解决这个问题,可以使用 css 样式。 css 解决方案: 在包含文本的div 上添加以下css 样式: white-space: pre-wrap; white-space: pre-w…

    2025年12月24日
    000
  • React 嵌套组件中父组件 CSS 修饰会影响子组件样式吗?

    对嵌套组件的 CSS 修饰是否影响子组件样式 提问: 在 React 中,如果对嵌套组件 ComponentA 配置 CSS 修饰,是否会影响到其子组件 ComponentB 的样式?ComponentA 是由 HTML 元素(如 div)组成的。 回答: 立即学习“前端免费学习笔记(深入)”; 在…

    2025年12月24日
    000
  • Vue CSS 如何实现无限循环列表自动滚动?

    vue css 如何实现无限循环列表自动滚动? 对于这个问题,我们可以使用以下方法来实现: 将数据扩充为双倍渲染,然后用CSS3向上滚动50%。此方法可以创建无限循环的无缝滚动效果。 具体实现步骤如下: 将数据扩充为双倍,并在Vue模板中使用v-for循环渲染。在CSS中,设置列表容器的高度和宽度。…

    2025年12月24日
    000
  • 如何在 Echarts 中绘制发光的 3D 图形?

    在 echarts 中绘制类似于发光的 3d 图形 echarts 是一个功能强大的图表库,用于在网页中创建交互式可视化内容。它支持多种图表类型,包括柱状图、折线图和饼状图。但是,如果你想绘制类似于题目中提到的发光 3d 图形,则需要使用 echarts 的扩展库 echarts-gl。 echar…

    2025年12月24日
    000
  • CSS 中,如何实现 div 上边框内阴影,其他三边外阴影?

    通过阴影实现一边内阴影,其他三边外阴影 在 css 中,如何实现一个 div 只在上边框有内阴影,其他三边有外阴影的需求呢? 这个问题可以通过使用 box-shadow 属性来实现,具体如下: box-shadow: 14px 0px 0 0 red, 0px -14px 0 0 blue, -11…

    2025年12月24日
    000
  • 如何在 ElementUI Tabs 组件中在第一个选项卡前添加额外元素?

    如何在 elementui tabs 中添加额外的元素到第一个选项卡之前? 问题背景: 在 elementui 的 tabs 组件中,我们可能需要在第一个选项卡之前添加一个额外的元素,例如按钮或 div,并且希望这个元素可以在不占据选项卡位置的情况下隐藏和显示。如下图所示: [图片:显示 tabs …

    2025年12月24日
    000
  • PostCSS-RTL插件:为什么嵌套样式中的/*rtl:ignore*/声明失效?

    postcss-rtl插件嵌套样式忽略失效问题 在使用postcss-rtl插件时,开发者希望忽略对特定样式进行转换。然而,当在scss文件中使用/*rtl:ignore*/声明时,该声明却在rtl环境下失效。相反,在css文件中使用该声明时,它却生效了。 造成此问题的根本原因是,postcss-r…

    2025年12月24日
    000
  • 如何为阿拉伯语网站适配自定义滚动条?

    rtl阿拉伯语适配自定义滚动条 在阿拉伯语网站中,由于其从右向左的阅读习惯(rtl),因此需要对滚动条进行适配。针对此问题,有以下解决方案: 推荐插件: javascript项目: perfect-scrollbar:此插件专为适配rtl布局而设计,提供了自定义滚动条样式和事件处理。 vue项目: …

    2025年12月24日
    000
  • 如何用 CSS 替代 SCSS 中的 @import?

    用 css 替代 scss 中的 @import 在 scss 文件中,@import 语句用于导入其他 css 文件。然而,如果项目中只有一个文件使用 scss,我们可以考虑使用普通 css 来替代它,从而消除对 sass 和 sass-loader 的依赖。 要使用纯 css 替代 scss 文…

    2025年12月24日
    000
  • CSS Flexbox 与 Gridbox:详细比较

    css(层叠样式表)是网页设计的支柱,为开发人员提供了创建美观、响应式和功能性布局的工具。 css 中最强大的两个布局系统是 flexbox 和 grid。两者都是现代的、多功能的,对于构建动态、响应式网站至关重要。虽然它们有一些相似之处,但它们是针对不同的用例而设计的,并且有自己的优点和局限性。 …

    2025年12月24日
    000
  • 如何使用 el-Rate 实现每半颗星为 10 分的评分机制?

    el-rate 半星评分 本文探讨如何在 el-rate 组件中实现每半颗星为 10 分的评分机制。 如何实现? 一个简单的解决方案是开启 el-rate 的 allow-half 属性,并将评分结果乘以 20,即可将 5 星 5 分评分制转换为 5 星百分制。 使用插槽 由于 el-rate 无法…

    2025年12月24日
    000
  • 如何在 Element UI 的 el-rate 组件中实现 5 颗星 5 分制与百分制之间的转换?

    如何在el-rate中将5颗星5分制的分值显示为5颗星百分制? 要实现该效果,只需使用 el-rate 组件的 allow-half 属性。在设置 allow-half 属性后,获得的结果乘以 20 即可得到0-100之间的百分制分数。如下所示: score = score * 20; 动态显示鼠标…

    2025年12月24日
    000
  • 为什么在 SCSS 文件中 postcss-rtl 无法识别 /*rtl:ignore*/ 声明?

    postcss-rtl 插件中忽略转换属性的疑惑 在使用 postcss-rtl 插件时,开发者可能会遇到这种情况:使用 /*rtl:ignore*/ 在选择器前声明,以排除某个样式进行转化。但是,在通过浏览器查看时,却发现该样式在 rtl 环境下仍然被转换了。 究其原因,这与样式文件的格式有关。这…

    2025年12月24日
    000
  • 宽度不固定的容器中,如何解决边距塌陷失效并实现盒子与容器下边缘对齐?

    如何解决宽度不固定的容器中边距塌陷失效的问题 在一段 html 代码中,存在一个宽度不固定的灰色容器,其中包含 n 个固定宽高的 div 盒子。这些盒子均设置了右边距和下边距,但希望最下面的两个盒子的下边缘与灰色容器的下边缘对齐。 起初,尝试使用 css 的边距塌陷,但在这种布局中无效。也尝试了给最…

    2025年12月24日
    000
  • 如何为宽度不固定的div设置固定左右边距?

    如何为宽度不固定的div设置固定左右边距 在网页设计中,有时我们需要设置一个div的宽度不固定,但其左右边距保持固定距离。这在使用rem单位时尤其重要,因为rem单位基于根元素的字体大小,在不同屏幕上会产生不同的宽度。 要实现此目标,可以使用以下css代码: div { margin-left: 1…

    2025年12月24日
    000
  • 垂直外边距合并:如何理解和解决?

    垂直外边距合并的理解与处理 垂直外边距合并是一种 CSS 样式应用规则,当相邻元素的垂直外边距 overlap 时,会产生合并效果。 垂直外边距合并有几种情况: 无合并:当元素没有设置垂直外边距或外边距值不重叠时,不会发生合并。部分合并:当元素的垂直外边距部分重叠时,会合并为最大值的部分。完全合并:…

    2025年12月24日
    000
  • 如何使用 CSS 为文本添加渐变效果?

    css 实现字体渐变 如何使用 css 为文本添加渐变效果? 问题: 如何为 元素添加背景渐变,并仅对文本应用效果? 立即学习“前端免费学习笔记(深入)”; 答案: 可以使用以下 css 代码: p { background-image:-webkit-linear-gradient(bottom,…

    2025年12月24日
    000
  • CSS 网格

    [css(https://developer.mozilla.org/en-us/docs/web/css) property is a [shorthand](https://developer.mozilla.org/en-us/docs/web/css/shorthand_properties…

    2025年12月24日
    000

发表回复

登录后才能评论
关注微信