用CSS Grid Shepherd技术对数据进行排序[每日前端夜话0x7B]

栏目: CSS · 发布时间: 5年前

内容简介:翻译:疯狂的技术宅来源:

每日前端夜话 0x7B

每日前端夜话,陪你聊前端。

每天晚上18:00准时推送。

正文共:1740 字

预计阅读时间: 6 分钟

翻译:疯狂的技术宅

来源: css-tricks

牧羊人很擅长照顾他们的羊群,为牧群带来秩序和结构。即使有几百只毛茸茸的动物,牧羊人仍然会在一天结束时将它们悉数带回农场。

而对于 程序员 来说,当我们在处理数据时,通常不知道这些数据是否已经被正确的过滤或者排序。尤其是当你想要在页面上按照稍微复杂一点的规则显示数据时,这就比较痛苦了。 Grid Shepherd 是一种使用 CSS Grid 帮助定位和 排序 的技术,完全不需要 JavaScript 的参与。

这就是本文要解决的问题。 Grid Shepherd 技术可以为我们的数据提供所需的顺序和结构,让我们更好地了解它的使用方式和应用场景。

让我们来深入研究一下。

用 JavaScript 排序

我们首先针对农场中一系列无序的动物进行排序。想象一下牛和羊在农场中悠闲的样子。我们可以用 Array.prototype.sort 方法以编程方式对其排序分组并展示在页面上:

 1let animals = [
 2  { name: 'Edna', animal: 'cow'   },
 3  { name: 'Liam', animal: 'sheep' },
 4  { name: 'Fink', animal: 'sheep' },
 5  { name: 'Olga', animal: 'cow'   },
 6]
 7let sortedAnimals = animals.sort((a, b) => {
 8  if (a.animal < b.animal) return -1
 9  if (a.animal > b.animal) return 1
10  return 0
11})
12console.log(sortedAnimals)
13/* Returns:
14  [ { name: 'Elga', animal: 'cow'   },
15    { name: 'Olga', animal: 'cow'   },
16    { name: 'Liam', animal: 'sheep' },
17    { name: 'Fink', animal: 'sheep' } ]
18*/

认识 Grid Shepherd

Grid Shepherd 方法能够在 不依赖 JavaScript 的情况下实现对数据的排序,只依靠 CSS Grid 本身就可以做到。

下面的结构与上面的 JavaScript 对象数组完全相同,只不过是在 DOM 节点中表示的。

1<main>
2  <div class="cow">Edna</div>
3  <div class="sheep">Liam</div>
4  <div class="sheep">Jenn</div>
5  <div class="cow">Fink</div>
6</main>

用CSS Grid Shepherd技术对数据进行排序[每日前端夜话0x7B]

CodePen上的演示:https://codepen.io/Achilles_2/embed/WWypav

由于微信公众号不能引用并显示CodePen上的效果,请大家点击文末的查看原文或者复制链接并粘贴到浏览器【http://blog.yidengxuetang.com/post/201906/01/】,到我的博客上修改代码并查看效果。另外请在查看原文之前顺便点一下“在看” ^_^

为了放养这些动物,我们必须将它们围在一个公共区域内,这就是我们 <main> 元素要做的事。通过使用 display:grid 设置该栅栏,我们创建了一个网格格式化上下文【 https://www.w3.org/TR/css-grid-1/#grid-containers 】,可以在其中定义每种动物应该占据的列(或行)。

1.sheep { grid-column: 1; }
2.cow { grid-column: 2; }

用CSS Grid Shepherd技术对数据进行排序[每日前端夜话0x7B]

羊在第一列,牛在第二列

通过 grid-auto-flow:dense ,每只动物都会让自己进入对应定义区域的第一个可用点。也可以用于任意数量的不同排序规则—— 只需再定义另一个列,数据就会被神奇地引导到其中。

1main
2  display: grid;
3  grid-auto-flow: dense;
4}
5
6.sheep { grid-column: 1; }
7.cow { grid-column: 2; }

用CSS Grid Shepherd技术对数据进行排序[每日前端夜话0x7B]

CodePen:https://codepen.io/Achilles_2/embed/bJKqQG

更专业的使用 Shepherd

我们还可以通过 CSS Counters 【 https://css-tricks.com/custom-list-number-styling/ 】进一步丰富这个例子。这样我们可以计算每一列中有多少只动物,并根据这个数量来有条件地设置它们的样式。

数量查询依赖于某种类型的选择器来计算其数量 —— 这对于伪类表示法 :nth-child(An+B [of S\ ]?) 来说会很好。但它目前仅在 Safari 中可用。这意味着我们必须用   :nth-of-type() 选择器来解决这个问题。

我们需要一些新的元素类型才能实现。这可以通过 Web 组件实现,也可以将 HTML 元素重命名为自定义名称。即使这些元素不在 HTML 规范中,也同样适用,因为浏览器对未定义的标记使用 HTMLUnknownElement ,这会导致他们的表现很像一个div。该文档现在看起来像这样:

1<fence>
2  <sheep>Lisa</sheep>
3  <sheep>Bonnie</sheep>
4  <cow>Olaf</cow>
5  <sheep>Jenn</sheep>
6</fence>

现在我们可以访问自己的自定义元素类型了。当羊或牛的数量小于等于 10 时应用红色背景。

1sheep:nth-last-of-type(n+10),
2sheep:nth-last-of-type(n+10) ~ sheep,
3cow:nth-last-of-type(n+10),
4cow:nth-last-of-type(n+10) ~ cow, {
5  background-color: red;
6}

可以通过在父元素上使用 counter-reset:countsheep countcow; 并使用 before 选择器来定位每个元素并计数,这样就实现了一个简单的计数器。

1sheep::before {
2  counter-increment: countsheep;  
3  content: counter(countsheep); 
4}

你可以通过下面这个演示观察在不同的排序规则下,对动物进行添加和移除时的效果:

用CSS Grid Shepherd技术对数据进行排序[每日前端夜话0x7B]

CodePen演示:https://codepen.io/Achilles_2/embed/YMgrpy

Grid Shepherd 还可以和任何非有序数据一起使用:

  • 根据实时增长的投票数据对选民进行分组和统计;

  • 根据人们的地理位置、年龄、身高等进行分组;

  • 根据规则创建层次结构。

Shepherd 和可访问性

grid-auto-flow:dense 不会改变网格的 DOM 结构 —— 它只是在视觉上对包含的元素重新排序。最后一个例子中会看到副作用:按字母顺序排序时,   counter 的数字被混淆了。更改 DOM 结构不仅会影响使用屏幕阅读器的用户,还会影响对标签遍历的效果。

圆满结束!

本文描述了如何将一个功能强大的 CSS 布局工具(如grid)用于不符合传统布局需求的案例。我们可以看到 CSS Grid 的布局优势和 JavaScript 的动态数据处理功能是重叠的,它可以为我们提供更多的选择和功能,是我们能够随心所欲的去渲染数据。

原文:https://css-tricks.com/using-the-grid-shepherd-technique-to-order-data-with-css/

推荐图书

下面夹杂一些私货:也许你和高薪之间只差这一张图

2019年京程一灯课程体系上新,这是我们第一次将全部课程列表对外开放。

愿你有个好前程,愿你月薪30K。我们是认真的 ! 用CSS Grid Shepherd技术对数据进行排序[每日前端夜话0x7B]

用CSS Grid Shepherd技术对数据进行排序[每日前端夜话0x7B]

在公众号内回复“体系”查看高清大图

长按二维码,加大鹏老师微信好友

拉你加入前端技术交流群

唠一唠怎样才能拿高薪

用CSS Grid Shepherd技术对数据进行排序[每日前端夜话0x7B]

小手一抖,资料全有。长按二维码关注 前端先锋 ,阅读更多技术文章和业界动态。

用CSS Grid Shepherd技术对数据进行排序[每日前端夜话0x7B]


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

以奋斗者为本

以奋斗者为本

黄卫伟 / 中信出版社 / 2014-11-1 / 68.00元

《以奋斗者为本:华为公司人力资源管理纲要》传承于《华为公司基本法》,华为管理层25年人力资源管理思想精髓,5年整理,华为公司内训教材,首次大公开!作为华为公司内部培训教材,原汁原味,是继《华为基本法》之后华为的标志性著作,对国内外企业管理者&研究者具有高度的研究及借鉴价值。《以奋斗者为本:华为公司人力资源管理纲要》由华为公司首席管理科学家主编,华为高管及顾问参与编著,华为管理层25年实践,权威出品......一起来看看 《以奋斗者为本》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试