|
|
请马上登录,朋友们都在花潮里等着你哦:)
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 马黑黑 于 2022-11-12 08:36 编辑
此前介绍过offset-path,借助该CSS属性,通过svg路径(无需svg标签)实现各种路线的关键帧动画。本帖,则简单探讨一下使用 offset-path 实现子元素沿svg路径(同样无需svg标签)的静态布局(即摆放成什么样子)。
我们先来复习一下 offset-pass 这个 CSS 属性,它的语句一般是酱紫:
offset-path: path('svg路径');
offset-path 是属性名称,其后用冒号引出值。值的构成用 path 关键字引导,svg 路径放在小角引号内,并整体置于小角小括号内。
关于路径,要求符合 svg 路径表达规则,即,只要是合法的 svg 路径均可使用。路径可以自己制作,也可以通过工具生成。
配套 offset-path 属性使用的另一个重要的CSS属性,offset-distance,则能将子元素布置到路径上的指定位置,例如,我们把子元素放置在路径上的50%处:
offset-distance: 50%;
下面开始实现子元素的静态布局——
子元素的静态布局需要载体,所以,我们先得创建一个父盒子:
#papa {
margin: auto;
width: 1024px;
height: 640px;
background: snow;
box-shadow: 3px 3px 20px #000;
display: grid;
place-items: center;
position: relative;
}
接着设定子元素的样式。本帖示范的,是帖子 《只爱我自己》 里的心形效果(注意观察 offset-path 属性和它的设定值):
.heart {
position: absolute;
left: 0;
top: 0;
width: 40px;
height: 40px;
display: grid;
place-items: center;
font: normal 40px sans-serif;
color: pink;
offset-path: path('m271.44526,175.38086c65.55493,-161.83822 322.4013,0 0,208.07771c-322.4013,-208.07771 -65.55493,-369.91593 0,-208.07771z');
}
这两个CSS盒子,都用到 grid 布局,其作用是快速定位子元素绝对居中(.heart也将拥有文本,文本是其子元素)。
记得写上HTML代码:
<div id="papa"></div>
在HTML代码里,我们没有写上任何一个 .heart 的子元素,它们将由 JS 生成,因为量大:
<script>
let total = 25;
Array.from({length: total}).forEach((item,key) => {
item = document.createElement('span');
item.className = 'heart';
item.innerText = '♥';
item.style.offsetDistance = 100/total *key + '%';
papa.appendChild(item);
});
</script>
JS代码里,total 变量是 ♥ 的总数,可根据实际场景决定赋值。
然后遍历长度为 total 个子项目的数组,每一个数组元素都遍历(forEach)一次,遍历中对每一个数组元素进行处理:
① 将 forEach() 的参数 item 赋值为待添加的子元素 span;
② item 的CSS类名为 heart;
③ item 的文本内容为 ♥(本论坛需要使用Unicode编码表示心形:\u2764);
④ 重要!设置偏移距离(offsetDistance),实现按路径分散摆放效果。offsetDistance可以使用百分比表示偏移量,所以有这个算式 100/total *key ,后面再加上字串 '%';
⑤ 最后将子元素 item 追加到 papa 父框,papa.appendChild(item);
偏移路径起始点、分散摆放子元素的实现,核心是CSS属性 offset-distance,偏移距离,在JS里写为 offsetDistance 。子元素偏移量的计算,以自身的索引(forEach参数中的key)参与计算,从而实现路径上的均衡布局。
效果请查看下楼。
|
评分
-
| 参与人数 2 | 威望 +100 |
金钱 +200 |
经验 +100 |
收起
理由
|
红影
| + 50 |
+ 100 |
+ 50 |
赞一个! |
小辣椒
| + 50 |
+ 100 |
+ 50 |
赞一个! |
查看全部评分
|