仅使用 css 在网格框之间创建线条
creating lines between grid boxes using css only
我正在尝试实现与此类似的东西
An interesting Javascript task
我尝试了答案,但似乎没有出现这条线。
我真正想要达到的目标
网格框之间有横线和竖线。
这就是我的代码的样子
HTML
<section class="block-map">
<div class="bound-layout">
<div class="block_grid">
{% for item in items %}
<div class="block_item">
<p class="need"><span class="bg"><span class="icon">{{ item.description|raw }}</span></span></p>
</div>
{% endfor %}
</div>
</div>
</section>
CSS
.block-map {
.block_grid {
display: grid;
grid-template-columns: auto auto auto;
padding: 10px;
column-gap: 30px;
row-gap: 30px;
}
.block_item {
background-color: #F5F5F5;
border-bottom: 5px solid #5B8726;
padding: 20px;
font-size: 30px;
text-align: left;
width:338px;
height: 149px;
align-items: center;
display: grid;
}
p.need {
color:@grey;
font-size:16px;
font-family: @serif;
font-weight: 700;
}
.block_grid .bg::after {
letter-spacing: 20px; /* adjust this to control the blue line length */
font-size: 25px;
border-bottom: 2px solid blue;
vertical-align: top;
}
}
我不会为线条使用伪元素 ::after
,您需要更多控制。我会使用特定的 HTML 元素。
我在代码中所做的事情:
- 为每个
.block-item
添加了一个 .block-item-wrapper
以保持虚线
- 在父级
.block-item-wrapper
中添加了 .dashed-line
元素并给它一个虚线底边框
- 给定
.dashed-line
的计算值 top: calc(50% - 6px);
。文本 font-size
属性 渲染中的 6px 因素,因此虚线与文本中间水平。您需要根据您选择的字体及其大小的呈现方式来更改它。
- 鉴于
.block-item
更高 z-index
所以它位于线上方
- 使用
nth-child
选择器删除第 1 / 4 等项上的虚线
您有时还需要在网格本身上设置一个 max-width:
值。
Codepen Link:
由于线条是一种视觉线索,因此可以使用每个网格项目上的伪前后元素绘制它们。
垂直线是使用 before 伪元素绘制的,位于每个网格项目的顶部和中间。顶行中的网格项将其行设置为显示:none.
水平线是使用 after 伪元素绘制的,位于项目下方的右侧。行末尾的项目(即每第 3 个项目)的行设置为显示:none.
使用线性渐变的重复背景图像将线条设为虚线。
这是一个简单的例子。显然,您需要更改尺寸以满足您的特定要求。
.grid {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
--g: 3vw;
grid-gap: var(--g);
}
.grid>* {
width: 100%;
aspect-ratio: 2 / 1;
border: solid 1px gray;
background: lightgray;
position: relative;
}
.grid>*::before {
content: '';
height: var(--g);
width: 2px;
background-image: linear-gradient(gray 0 50%, transparent 50% 100%);
background-size: auto calc(var(--g) / 4);
position: absolute;
z-index: -1;
bottom: 100%;
left: 50%;
}
.grid>*:nth-child(1)::before,
.grid>*:nth-child(2)::before,
.grid>*:nth-child(3)::before {
display: none;
}
.grid>*::after {
content: '';
width: var(--g);
height: 2px;
background-image: linear-gradient(to right, transparent 0 50%, gray 50% 100%);
background-size: calc(var(--g) / 4);
position: absolute;
z-index: -1;
top: 50%;
left: 100%;
}
.grid>*:nth-child(3n)::after,
.grid>*:last-child::after {
display: none;
;
}
<div class="grid">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
<div>6</div>
<div>7</div>
</div>
这会产生这样的结果:
我正在尝试实现与此类似的东西
An interesting Javascript task
我尝试了答案,但似乎没有出现这条线。
我真正想要达到的目标
<section class="block-map">
<div class="bound-layout">
<div class="block_grid">
{% for item in items %}
<div class="block_item">
<p class="need"><span class="bg"><span class="icon">{{ item.description|raw }}</span></span></p>
</div>
{% endfor %}
</div>
</div>
</section>
CSS
.block-map {
.block_grid {
display: grid;
grid-template-columns: auto auto auto;
padding: 10px;
column-gap: 30px;
row-gap: 30px;
}
.block_item {
background-color: #F5F5F5;
border-bottom: 5px solid #5B8726;
padding: 20px;
font-size: 30px;
text-align: left;
width:338px;
height: 149px;
align-items: center;
display: grid;
}
p.need {
color:@grey;
font-size:16px;
font-family: @serif;
font-weight: 700;
}
.block_grid .bg::after {
letter-spacing: 20px; /* adjust this to control the blue line length */
font-size: 25px;
border-bottom: 2px solid blue;
vertical-align: top;
}
}
我不会为线条使用伪元素 ::after
,您需要更多控制。我会使用特定的 HTML 元素。
我在代码中所做的事情:
- 为每个
.block-item
添加了一个.block-item-wrapper
以保持虚线 - 在父级
.block-item-wrapper
中添加了.dashed-line
元素并给它一个虚线底边框 - 给定
.dashed-line
的计算值top: calc(50% - 6px);
。文本font-size
属性 渲染中的 6px 因素,因此虚线与文本中间水平。您需要根据您选择的字体及其大小的呈现方式来更改它。 - 鉴于
.block-item
更高z-index
所以它位于线上方 - 使用
nth-child
选择器删除第 1 / 4 等项上的虚线
您有时还需要在网格本身上设置一个 max-width:
值。
Codepen Link:
由于线条是一种视觉线索,因此可以使用每个网格项目上的伪前后元素绘制它们。
垂直线是使用 before 伪元素绘制的,位于每个网格项目的顶部和中间。顶行中的网格项将其行设置为显示:none.
水平线是使用 after 伪元素绘制的,位于项目下方的右侧。行末尾的项目(即每第 3 个项目)的行设置为显示:none.
使用线性渐变的重复背景图像将线条设为虚线。
这是一个简单的例子。显然,您需要更改尺寸以满足您的特定要求。
.grid {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
--g: 3vw;
grid-gap: var(--g);
}
.grid>* {
width: 100%;
aspect-ratio: 2 / 1;
border: solid 1px gray;
background: lightgray;
position: relative;
}
.grid>*::before {
content: '';
height: var(--g);
width: 2px;
background-image: linear-gradient(gray 0 50%, transparent 50% 100%);
background-size: auto calc(var(--g) / 4);
position: absolute;
z-index: -1;
bottom: 100%;
left: 50%;
}
.grid>*:nth-child(1)::before,
.grid>*:nth-child(2)::before,
.grid>*:nth-child(3)::before {
display: none;
}
.grid>*::after {
content: '';
width: var(--g);
height: 2px;
background-image: linear-gradient(to right, transparent 0 50%, gray 50% 100%);
background-size: calc(var(--g) / 4);
position: absolute;
z-index: -1;
top: 50%;
left: 100%;
}
.grid>*:nth-child(3n)::after,
.grid>*:last-child::after {
display: none;
;
}
<div class="grid">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
<div>6</div>
<div>7</div>
</div>
这会产生这样的结果: