一方面,使用 CSS 创建简单的棋盘格背景很容易。另一方面,除非我们是 CSS 渐变忍者,否则我们基本上只能使用基本图案。
至少在我盯着屏幕上的棋盘格背景并试图稍微圆化方块的角时,我是这么想的……直到我想起了我最喜欢的项目符号字符 — ✦
— 并意识到如果我能在图案的每个交叉点上放置它,我肯定就能得到我想要的设计。
事实证明这是可能的!这是证据。
让我们从基本图案开始
<div></div>
div {
background:
repeating-linear-gradient(
to right, transparent,
transparent 50px,
white 50px,
white 55px
),
repeating-linear-gradient(
to bottom, transparent,
transparent 50px,
white 50px,
white 55px
),
linear-gradient(45deg, pink, skyblue);
/* more styles */
}
这为我们提供了一个从粉红色到蓝色的正方形重复背景,它们之间有 5px
的白色间隙。每个正方形宽五十像素且透明。这是使用 repeating-linear-gradient
创建的,它会创建一个线性渐变图像,其中渐变在整个包含区域中重复。
换句话说,该序列中的第一个渐变创建了白色的水平条纹,第二个渐变创建了白色的垂直条纹。它们叠加在一起形成了棋盘格图案,第三个渐变填充了其余空间。
现在,我们将前面提到的星形字符添加到背景图案的顶部。我们可以通过将其与渐变一起包含在同一个 background
属性中,同时使用编码的 SVG 来表示形状。
div {
background:
repeat left -17px top -22px/55px 55px
url("data:image/svg+xml,
<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 35px 35px'>
<foreignObject width='35px' height='35px'>
<div xmlns='http://www.w3.org/1999/xhtml' style='color: white; font-size: 35px'>✦</div>
</foreignObject>
</svg>"
),
repeating-linear-gradient(
to right, transparent,
transparent 50px,
white 50px,
white 55px
),
repeating-linear-gradient(
to bottom, transparent,
transparent 50px,
white 50px,
white 55px
),
linear-gradient(45deg, pink, skyblue);
/* more style */
}
让我们分解一下。第一个关键字 repeat
表示这是一个重复的背景图像。其后分别是每个重复单元的位置和大小(left -17px top -22px/55px 55px
)。此偏移位置基于字符和图案的大小。您将在下面看到字符大小是如何给定的。添加偏移是为了将重复的字符重新定位到棋盘格图案的每个交叉点上。
SVG 中有一个包含字符的 HTML <div>
。请注意,我在其中声明了一个 font-size
。这最终决定了棋盘格图案中正方形的圆角半径 — 字符越大,正方形越圆。从数据 URL 展开的 SVG 如下所示
<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 35px 35px'>
<foreignObject width='35px' height='35px'>
<div xmlns='http://www.w3.org/1999/xhtml' style='color:white;font-size:35px'>✦</div>
</foreignObject>
</svg>
现在 CSS 图案已建立,让我们添加一个 :hover
效果,在该效果中,字符将被移除,而白线将使用带有 alpha 透明度的 rgb()
颜色值变得稍微半透明。
div:hover {
background:
repeating-linear-gradient(
to right, transparent,
transparent 50px,
rgb(255 255 255 / 0.5) 50px,
rgb(255 255 255 / 0.5) 55px
),
repeating-linear-gradient(
to bottom, transparent,
transparent 50px,
rgb(255 255 255 / 0.5) 50px,
rgb(255 255 255 / 0.5) 55px
),
linear-gradient(45deg, pink, skyblue);
box-shadow: 10px 10px 20px pink;
}
就是这样!现在,我们不仅拥有了圆角,而且对图案有了更多控制,可以实现类似这样的效果
再说一遍,整个练习是为了获得一个棋盘格图案的正方形网格,该网格支持圆角、用作图案叠加层的背景渐变以及交互式样式。我认为这很好地完成了任务,但我也很想知道您可能会如何处理它。请在评论中告诉我!
我会使用蒙版和多个渐变来实现这一点。语法可能有点冗长,但使用 CSS 变量可以缩短它,而且我们可以轻松调整所有内容(大小、间隙、半径)
聪明!看起来字符渲染可能略有偏差。在 Chrome 105 和 Firefox 104 中,字符似乎比预期低 5-10 像素。
✦ 这里是一个误导,它破坏了本来非常好的方法。
您不应该使用文本,而应该使用
path
。文本使您容易受到渲染不一致性的影响,因为您无法控制将使用的字体。显示的示例对我来说看起来很糟糕,因为我的指标与作者设计它的指标不同。(此外,也没有必要使用
foreignObject
来耍聪明;text
完全可以胜任这项工作,整个foreignObject
/div
舞蹈将类似于<text font-size='35' fill='white' y='30'>✦</text>
。)然后,您还可以考虑将更多花哨的东西塞进 SVG 中。SVG 支持图案、渐变、&c. 比 CSS 甚至更强大。
我预计本文的作者只提供了一种实现该图案的方法。如果有人有其他方法,我希望看到一些建设性的批评,而不是对所用方法的抨击。只需给出您自己的版本以及原因就足够了