这篇文章发布于 2026年01月16日,星期五,20:58,归类于 CSS相关。 阅读 98 次, 今日 96 次 没有评论
by zhangxinxu from https://www.zhangxinxu.com/wordpress/?p=12026
本文可全文转载,但需要保留原作者、出处以及文中链接,AI抓取保留原文地址,任何网站均可摘要聚合,商用请联系授权。
一、事情的起因
之前介绍CSS锚点定位的时候有提到:
我们可以利用此特性,轻松实现任意两个点相连的折线效果,在过去,类似这样的效果一定要借助JS才可以。

然后我就抽空自己试验了自己的想法,发现此事并没有自己想的那么简单。
二、先看下效果
先看GIF录屏效果,纯CSS实现的:

演示页面
您可以狠狠地点击这里:纯CSS实现两个元素之间折线自动相连demo
实现原理
先从最简单的说起,两个圆和一条线。
<div class="circle circle-a"></div> <div class="circle circle-b"></div> <i class="line"></i>
圆的样式很简单,50%圆角绝对定位就可以了,对于本文需要实现的效果,重要的是定义锚点的名称:
.circle-a {
anchor-name: --a;
}
.circle-b {
anchor-name: --b;
}
此时,我们的线就可以左右两个球定位了:
.line {
position: absolute;
--posA: calc(anchor(--a inside) + anchor-size(--a) / 2);
--posB: calc(anchor(--b inside) + anchor-size(--b) / 2);
top: var(--posA);
bottom: var(--posB);
left: var(--posA);
right: var(--posB);
outline: dashed;
}
此时的效果就会是这样的:

此时,我们就可以使用对角线渐变连接线条了(clip-path剪裁也可以):
.line {
background: linear-gradient(to left bottom, transparent calc(50% - 2px), currentColor calc(50% - 2px) calc(50% + 2px), transparent calc(50% + 2px)) no-repeat;
}
效果如下图所示:

这线都跑到圆球上了,怎么办?
可以遮罩处理下,正好端点弄两个径向渐变遮罩下。
.line {
mask: radial-gradient(circle at 0 0, #000 85px, transparent 85px no-repeat,
radial-gradient(circle at right bottom, #000 65px, transparent 65px no-repeat,
linear-gradient(#000, #000);
}

原理还是很简单的,但是实际上,两个球的位置是不固定的,上下左右都有可能,所以,如果只考虑一个方位,那么两个球的位置变化的时候,直线可能就不显示,因此,最终是使用了4条线。
<div class="circle circle-a"></div> <div class="circle circle-b"></div> <i class="line line1"></i> <i class="line line2"></i> <i class="line line3"></i> <i class="line line4"></i>
完整代码可以参考demo页面。
三、其他一些说明
不过上面的实现并不完美,当两个圆的圆心在同一水平线,或者在同一垂直线上的时候,连接线是不显示的。
这个其实也有方法解决,不过麻烦了些。
- 需要在设置line为container容器元素;
- 图形效果使用子元素绘制,同时设置最小尺寸;
- 基于
100cqw和100cwh计算的角度判断子元素是否显示,利用opacity属性的边界特性。
有个codepen案例就是这么实现的,有兴趣可以研究下。
时间有限,我就不深入了,因为这个实现成本已经超过JS了。
好吧,就说这么多,如果觉得内容不错,欢迎转发,分享。
我们下一篇文章再见👋🏻

本文为原创文章,会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,避免陈旧错误知识的误导,同时有更好的阅读体验。
本文地址:https://www.zhangxinxu.com/wordpress/?p=12026
(本篇完)
- 介绍2022年最期待的CSS container容器查询 (0.462)
- 补全不足,CSS锚点定位支持锚定容器回退检测了 (0.399)
- 告别JS浮层,全新的CSS Anchor Positioning锚点定位API (0.378)
- 好诶,select下拉框元素支持样式完全自定义啦! (0.378)
- 又发现一种无需绝对定位就可以元素重叠的CSS技巧 (0.273)
- CSS高宽不等图片固定比例布局的三重进化 (0.273)
- CSS progress()函数简介 (0.189)
- 第五届CSS大会主题分享之CSS创意与视觉表现 (0.161)
- 好奇心驱使下试验了chatGPT写CSS代码的能力 (0.142)
- 聊聊Top Layer顶层特性的隐患与实践 (0.126)
- 几种CSS渐变背景图片transtion动画方法 (RANDOM - 0.103)