[文章分享] CSS 实现 Word 表格“镶边行”的效果

2017-05-24 11:50:09 +08:00
 geelaw

2016 年的事情了,现在写一篇 blog 记录之。之前建立自己的 blog 的时候给自己提出过一个需求:希望实现“镶边行”效果(奇、偶行的背景色不同)。(需求背景请看全文,链接在最末)

当然这很简单,只要

table > tbody > tr:nth-child(odd)
{
    background: rgba(0, 0, 0, 0.02);
}

即可。但是后来又因为一些原因(欲知详情请查看全文,链接在最末),我希望 当且仅当表格有至少 4 行时 显示为“镶边行”。

因为无法检测一个 tbody 是否有至少 4 个 tr,我们可以直接检测 tr。我们需要排除的有 :only-child:first-child:nth-last-child(2)( 2 行表格中的第 1 行)、:first-child:nth-last-child(3):last-child:nth-child(3)( 3 行表格中的第 1、3 行)。理想状态下我可以这样:

table > tbody > tr:nth-child(odd):not(:only-child):not(:first-child:nth-last-child(2)):not(:last-child:nth-last-child(3)):not(:last-child:nth-child(3))
{
    background: rgba(0, 0, 0, 0.02);
}

但是 CSS 4 的 :not 才支持选择器列表,CSS 3 的 :not 只支持 简单选择器

于是可以利用数理逻辑的知识,假设 ABCD 是 4 个选择器,则 :not(AB):not(CD) 等价于

:not(A):not(C), :not(A):not(D),
:not(B):not(C), :not(B):not(D)

于是可以把我们理想中的选择器展开为长度为 8 的复杂选择器列表,这件事情可以用一个工具自动化完成。

这个问题得到了部分的解决:不完美的原因是把一个“理想的”选择器转换为 CSS 3 选择器可能会使得代码长度 指数速度 增长。

在我写这篇博文的时候,似乎未有见到很多讨论 :not(AB):not(CD) 型选择器 CSS 3 化的问题,比较多的是 :not(.simple1, .simple2) 型选择器 CSS 3 化的问题(等于 :not(.simple1):not(.simple2))。不知道是这件事情太无聊以致于没人写(这肯定是 trivial 啦),还是什么别的原因。


在我的 blog 上查看完整的故事:Make a table banded if and only if it has at least 4 rows

直接转到 blog 上的答案位置

2231 次点击
所在节点    分享创造
2 条回复
geelaw
2017-05-24 12:04:32 +08:00
这个代码染色器有毒,什么迷之配色……
geelaw
2017-05-26 07:01:34 +08:00
wlgq,我刚刚更新了文章,因为我想到了一种更简单的实现。

要选中的行分成如下几类:

· 第五行、第七行……
· 第一行,但不是倒数一、二、三行
· 第三行,但不是倒数第一行

于是只要

```
table > tbody > tr:nth-child(2n+5),
table > tbody > tr:first-child:not(:nth-child(-n+3)),
table > tbody > tr:nth-child(3):not(:last-child)
{
background: color(0,0,0,0.02);
}
```

即可!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/363440

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX