父组件修改子组件css_如何在纯CSS中构建过滤组件

本文介绍如何仅使用CSS构建一个功能齐全的过滤组件,通过单选按钮和标签实现实时过滤效果,无需JavaScript。

父组件修改子组件css

在今天的教程中,我们将学习如何构建仅CSS的过滤组件,考虑到需要JavaScript,您可以原谅这件事。 我们将使用一些简单的标记,一些表单控件以及一些您可能从未使用过的非常有趣CSS选择器。

我们正在努力

Tuts +的每位讲师都有自己的存档页面 。 我们将使用自己的标记来重新创建这样的教程列表。 然后,我们将实现一个组件,该组件将根据帖子所属的类别过滤帖子。

这是我们的最终项目:

让我们开始吧!

1.从HTML标记开始

我们首先确定组件中的过滤器类别。 在此示例中,我们将使用七个过滤器:

  1. All
  2. CSS
  3. JavaScript
  4. jQuery
  5. WordPress
  6. Slider
  7. fullPage.js

为此,我们首先定义七个单选按钮,将它们分组在categories关键字下。 默认情况下,第一个单选按钮处于选中状态:

<input type="radio" id="All" name="categories" value="All" checked>
<input type="radio" id="CSS" name="categories" value="CSS">
<input type="radio" id="JavaScript" name="categories" value="JavaScript">
<input type="radio" id="jQuery" name="categories" value="jQuery">
<input type="radio" id="WordPress" name="categories" value="WordPress">
<input type="radio" id="Slider" name="categories" value="Slider">
<input type="radio" id="fullPage.js" name="categories" value="fullPage.js">

然后,我们创建一个包含与上述单选按钮相关的标签的有序列表。

请记住,我们一个单选按钮与标签相关联通过设置它的id值等于标签的for价值:

<ol class="filters">
  <li>
    <label for="All">All</label>
  </li>
  <li>
    <label for="CSS">CSS</label>
  </li>
  <li>
    <label for="JavaScript">JavaScript</label>
  </li>
  <li>
    <label for="jQuery">jQuery</label>
  </li>
  <li>
    <label for="WordPress">WordPress</label>
  </li>
  <li>
    <label for="Slider">Slider</label>
  </li>
  <li>
    <label for="fullPage.js">fullPage.js</label>
  </li>
</ol>

接下来,我们设置另一个有序列表,其中包括我们要过滤的元素(我们的卡片)。 每个过滤的元素将具有一个自定义的data-category属性,其值是由空格分隔的过滤器列表:

<ol class="posts">
 <li class="post" data-category="CSS JavaScript">...</li>
 <li class="post" data-category="CSS JavaScript">...</li>
 
 <!-- 10 more list items here -->
</ol>

在我们的例子中,过滤后的元素将是帖子。 因此,我们将用来描述帖子及其元数据(标题,图像,类别)的标记如下所示:

<article>
  <figure>
    <a href="" target="_blank">
      <img src="IMG_SRC" alt="">
    </a>
    <figcaption>
      <ol class="post-categories">
        <li>
          <a href="">...</a>
        <li>
        
        <!-- possibly more list items here -->
      </ol>
      <h2 class="post-title">
        <a href="" target="_blank">...</a>
      </h2>
    </figcaption>
  </figure>
</article>

准备好标记后,让我们将注意力转移到所需的样式上。

2.定义样式

我们首先在视觉上隐藏单选按钮:

input[type="radio"] {
  position: absolute;
  left: -9999px;
}

然后,我们向过滤器添加一些样式:

:root {
  --black: #1a1a1a;
  --white: #fff;
  --green: #49b293;
}

.filters {
  text-align: center;
  margin-bottom: 2rem;
}

.filters * {
  display: inline-block;
}

.filters label {
  padding: 0.5rem 1rem;
  margin-bottom: 0.25rem;
  border-radius: 2rem;
  min-width: 50px;
  line-height: normal;
  cursor: pointer;
  transition: all 0.1s;
}

.filters label:hover {
  background: var(--green);
  color: var(--white);
}

CSS网格布局

我们继续为过滤后的元素指定一些样式。 最重要的是,我们根据屏幕尺寸使用CSS Grid进行不同的布局:

:root {
  --black: #1a1a1a;
  --white: #fff;
  --green: #49b293;
}

.posts {
  display: grid;
  grid-gap: 1.5rem;
  grid-template-columns: repeat(4, 1fr);
}

.posts .post {
  background: #fafafa;
  border: 1px solid rgba(0, 0, 0, 0.1);
}

.posts .post-title {
  font-size: 1.3rem;
}

.posts .post-title:hover {
  text-decoration: underline;
}

.posts figcaption {
  padding: 1rem;
}

.posts .post-categories {
  margin-bottom: 0.75rem;
  font-size: .75rem;
}

.posts .post-categories * {
  display: inline-block;
}

.posts .post-categories li {
  margin-bottom: 0.2rem;
}

.posts .post-categories a {
  padding: 0.2rem 0.5rem;
  border-radius: 1rem;
  border: 1px solid;
  line-height: normal;
  background: all 0.1s;
}

.posts .post-categories a:hover {
  background: var(--green);
  color: var(--white);
}

@media screen and (max-width: 900px) {
  .posts {
    grid-template-columns: repeat(3, 1fr);
  }
}

@media screen and (max-width: 650px) {
  .posts {
    grid-template-columns: repeat(2, 1fr);
  }
}

注意:出于可读性原因,在我们CSS中,我们不对通用CSS规则进行分组。

添加过滤样式

这里的想法非常简单。 每次我们单击过滤器时,仅应显示相应的过滤元素(帖子)。 为了实现该功能,我们将结合使用以下CSS好东西:

当我们单击All过滤器时,将显示所有具有data-category属性的帖子:

[value="All"]:checked ~ .posts [data-category] {
  display: block;
}

当我们单击任何其他过滤器类别时,将仅显示目标帖子:

[value="CSS"]:checked ~ .posts .post:not([data-category~="CSS"]),
[value="JavaScript"]:checked ~ .posts .post:not([data-category~="JavaScript"]),
[value="jQuery"]:checked ~ .posts .post:not([data-category~="jQuery"]),
[value="WordPress"]:checked ~ .posts .post:not([data-category~="WordPress"]),
[value="Slider"]:checked ~ .posts .post:not([data-category~="Slider"]),
[value="fullPage.js"]:checked ~ .posts .post:not([data-category~="fullPage.js"]) {
  display: none;
}

例如,只要我们单击“ Slider过滤器类别,只有属于“ Slider类别的帖子才可见。

值得一提的是,在我们的风格,而不是上面的[att~=val]语法,我们同样可以使用了[att*=val]语法。 细微的变化如下所示:

[value="CSS"]:checked ~ .posts .post:not([data-category*="CSS"]),
[value="JavaScript"]:checked ~ .posts .post:not([data-category*="JavaScript"]),
[value="jQuery"]:checked ~ .posts .post:not([data-category*="jQuery"]),
[value="WordPress"]:checked ~ .posts .post:not([data-category*="WordPress"]),
[value="Slider"]:checked ~ .posts .post:not([data-category*="Slider"]),
[value="fullPage.js"]:checked ~ .posts .post:not([data-category*="fullPage.js"]) {
  display: none;
}

快速CSS选择器说明

这个选择器到底在说什么?

第一位[value="CSS"]:checked查找具有特定值(在这种情况下为“ CSS”)的选中的单选按钮。

在那之后,代字号(〜)是我们今天所称的“后续兄弟选择器”。 它选择与上一个元素具有相同父元素的元素,即使它们没有立即跟随标记。 所以~ .posts .post寻找元素.posts .post与被检查的单选输入共享相同的父元素。

为了更具体, :not([data-category~="CSS"])将选择器优化为仅那些具有data-category属性的.post元素,该属性在空格内某处包含CSS值清单。

然后应用display: none; 符合这些条件的任何元素。

这是一个非常复杂的选择器,即使它完全合乎逻辑。 用人类语言术语,您可以将其描述为:

“当选中值为“ CSS”的收音机时,请在其数据类别列表中找到所有不包含“ CSS”的后继元素,并将其隐藏。”

造型的最后一点

最后,我们添加一个规则来突出显示活动过滤器类别:

:root {
  --black: #1a1a1a;
  --white: #fff;
  --green: #49b293;
}

[value="All"]:checked ~ .filters [for="All"],
[value="CSS"]:checked ~ .filters [for="CSS"],
[value="JavaScript"]:checked ~ .filters [for="JavaScript"],
[value="jQuery"]:checked ~ .filters [for="jQuery"],
[value="WordPress"]:checked ~ .filters [for="WordPress"],
[value="Slider"]:checked ~ .filters [for="Slider"],
[value="fullPage.js"]:checked ~ .filters [for="fullPage.js"] {
  background: var(--green);
  color: var(--white);
}

3.辅助功能

默认情况下,可以很好地访问此过滤。 感谢单选按钮和标签的本机工作方式,我们可以使用键盘按键过滤项目。 首先按Tab键将焦点移至选中的单选按钮。 接下来,按箭头键将焦点和选择移至其他单选按钮。 自己尝试:

就是说,我们尚未真正关注可访问性,因此可能还有其他一些方面需要改进。

结论

就是这样! 仅使用一些CSS规则和一些结构化的标记,我们就可以构建一个功能齐全的过滤组件。

我希望您喜欢这个练习,它对您对CSS选择器的理解有所帮助。 一如既往,感谢您的阅读!

翻译自: https://webdesign.tutsplus.com/tutorials/how-to-build-a-filtering-component-in-pure-css--cms-33111

父组件修改子组件css

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值