【发布时间】:2020-09-01 17:58:42
【问题描述】:
我正在使用这种技术根据其父项的data-current 属性过滤项目:
const ul = document.querySelector('ul');
document.querySelector('select').addEventListener('change', ({ target }) => ul.setAttribute('data-current', target.value));
ul li {
display: none;
}
ul[data-current='vegetable'] li[data-category='vegetable'],
ul[data-current='fruit'] li[data-category='fruit'],
ul[data-current='dessert'] li[data-category='dessert'],
ul[data-current='misc'] li[data-category='misc'],
ul[data-current='all'] li {
display: block;
}
<select>
<option value="all">All</option>
<option value="vegetable">Vegetable</option>
<option value="fruit">Fruit</option>
<option value="dessert">Dessert</option>
<option value="misc">Misc</option>
</select>
<ul data-current="all">
<li data-category="vegetable">Tomato</li>
<li data-category="vegetable">Cucumber</li>
<li data-category="vegetable">Eggplant</li>
<li data-category="fruit">Apple</li>
<li data-category="fruit">Banana</li>
<li data-category="fruit">Orange</li>
<li data-category="dessert">Cake</li>
<li data-category="dessert">Chocolate</li>
<li data-category="misc">Beef Jerky</li>
</ul>
现在它工作得很好,但是你可以看到选择器越来越重,而data-category 填充。此外,如果类别是动态的,那也是不可能的。
有没有这样的选择器,$1 匹配前面的字符串?
ul[data-current=/(.*)/] li[data-category=$1] {
display: block;
}
实现这种过滤器功能有什么更好的主意?
我不太喜欢使用 javascript 手动隐藏/显示每个元素。
【问题讨论】:
-
不可能使用 CSS(除非您要为每个可能的值手动添加设置)
-
所以希望我们在 CSS 中拥有这个功能,这样我们就可以在没有 javascript 的情况下实现更多。
-
嗯,CSS 应该保持简单、快速和易于解释。恕我直言,您的建议非常复杂。
标签: javascript css css-selectors