使用 CSS 在圆形上放置项目可能颇具挑战性。通常,我们会依赖 JavaScript,因为某些插件可以立即完成所有操作。但是,很多时候,没有充分的理由用 JavaScript 而不是 CSS 来实现。这属于表现目的,让我们采用 CSS 的方式。
混合器
Ana Tudor 在 Stack Overflow 答案 中解释了她是如何使用链式 CSS 转换来实现这一点的。之后,我将其解决方案转换为 Sass 混合器,使一切变得轻而易举。
/// Mixin to place items on a circle
/// @author Kitty Giraudel
/// @author Ana Tudor
/// @param {Integer} $item-count - Number of items on the circle
/// @param {Length} $circle-size - Large circle size
/// @param {Length} $item-size - Single item size
@mixin on-circle($item-count, $circle-size, $item-size) {
position: relative;
width: $circle-size;
height: $circle-size;
padding: 0;
border-radius: 50%;
list-style: none;
> * {
display: block;
position: absolute;
top: 50%;
left: 50%;
width: $item-size;
height: $item-size;
margin: -($item-size / 2);
$angle: (360 / $item-count);
$rot: 0;
@for $i from 1 through $item-count {
&:nth-of-type(#{$i}) {
transform:
rotate($rot * 1deg)
translate($circle-size / 2)
rotate($rot * -1deg);
}
$rot: $rot + $angle;
}
}
}
注意!此代码片段已省略了供应商前缀。如果您不使用 Autoprefix,请确保添加 transform
的前缀。
演示
出于演示目的,我们将考虑一个包含 8 张图像的列表,但基本上任何内容都可以使用。
<ul class='circle-container'>
<li><img src='http://lorempixel.com/100/100/city' alt="..." /></li>
<li><img src='http://lorempixel.com/100/100/nature' alt="..." /></li>
<li><img src='http://lorempixel.com/100/100/abstract' alt="..." /></li>
<li><img src='http://lorempixel.com/100/100/cats' alt="..." /></li>
<li><img src='http://lorempixel.com/100/100/food' alt="..." /></li>
<li><img src='http://lorempixel.com/100/100/animals' alt="..." /></li>
<li><img src='http://lorempixel.com/100/100/business' alt="..." /></li>
<li><img src='http://lorempixel.com/100/100/people' alt="..." /></li>
</ul>
.circle-container {
@include on-circle($item-count: 8, $circle-size: 20em, $item-size: 6em);
margin: 5em auto 0;
border: solid 5px tomato;
img {
display: block;
max-width: 100%;
border-radius: 50%;
filter: grayscale(100%);
border: solid 5px tomato;
transition: .15s;
&:hover,
&:active {
filter: grayscale(0);
}
}
}
这很好,但在 IE 中不起作用
实际上在 IE 中做起来相当容易。查看原文:http://hugogiraudel.com/2013/04/02/items-on-circle/。
是否可以使用 Bootstrap 网格系统来定位这些项目?
感谢这篇博文,Hugo,它真的很酷。有没有办法将图像放置在圆圈的中间?
没关系 - 我刚刚找到了你的“使用 Sass 居中”文章。你是我新的最喜欢的作者 :)
Hugo,
我非常喜欢这个例子,它对我在进行的一个实验有很大帮助,在这个实验中,我有一个 Angular 数据集,它可能需要从圆形中的一个元素到八个元素。因此,我在 SASS 中添加了一些额外的逻辑来生成 c1 到 c8,其中数字表示圆的数量。
http://codepen.io/stegel/details/RWqpwO/
我注意到,如果我添加一个 n+1 元素,它会自动居中。这是故意的吗?
我正在尝试弄清楚如何动画化一个外部元素移动到中心的动画。你对此有什么建议吗?
您好,先生,您能帮我如何自动旋转这个圆圈吗?
不错的文章,Hugo,谢谢!我想知道我们如何在不给父包装器添加旋转变换的情况下使元素沿着圆圈旋转。
这是一个很酷的圆圈!,但我需要知道……是否可以将参数从 html 传递到“@include on-circle($item-count: 8, $circle-size: 20em, $item-size: 6em);” 函数中?,假设我想控制“item-count”的值,我该怎么做?
您可以在此处更改
$item-count: 8 例如 $item-count: 10
并添加另一行(或多行):到
<
ul> -> …
变量 $i 在哪里定义?
它运行良好。但我遇到了问题!我将 CSS 动画应用于整个容器,它可以工作。但我无法为圆圈内的元素应用动画。我现在该怎么办?
我正在尝试在圆圈周围放置 6 个 div,并在悬停在 div 上时显示文本。
我有这个:https://jsfiddle.net/zwsck7gm/2/
还有这个:http://jsfiddle.net/ytwL7g81/,但我难以将它们合并成一个东西。
你能帮忙吗?
非常感谢 Hugo 和 Ana,这段代码为我节省了很多麻烦,并将我指引到正确的方向!
您好,有没有办法让它在保持对象方向的同时绕圆旋转?
嘿,Matteo!您可以尝试向容器添加一个使其旋转的动画。https://codepen.io/geoffgraham/pen/LajvrK
如果您想将这种美丽的图案提升到更高的水平,您可以玩转圆圈的角度。
| $angle: (360 / $item-count);
190 度会使其看起来像项链。
680 度会创建一个在 4 个相等部分有两个节点的圆圈。
你好。
我四处寻找了这么久的解决方案,这太棒了。看看此页面上的示例,如何在圆圈中间添加一些文本,并在单击每个项目时更改它?查看此页面上的示例,向下滚动一点
https://kriesi.at/
感谢此技巧!我已对其进行了更新,使其完全响应式,而不依赖于圆圈大小、项目大小或项目数量。您可以在此处查看:https://codepen.io/sntran/pen/rNVoEZB
混合器使用 LESS 而不是 Sass,因为我更熟悉它,但逻辑相同。一些使其成为可能的技巧
使用
height: 0; padding-bottom: 100%
创建响应式圆圈。使
item-size
成为圆圈直径的百分比。使用数量查询 (https://alistapart.com/article/quantity-queries-for-css/#section5) 根据列表中项目的实际数量制定规则。
尽情享受!
是否可以使这个圆圈响应式,以便例如在从移动设备查看时不会扩展页面?
我也需要这个。我可能需要采用 JavaScript 路线
我还没有在任何地方看到真正响应式的示例。我看到的示例都具有整体高度/宽度的固定宽度。
它要么对桌面来说太小,要么对手机来说太大。
有人有这个的 Post CSS 版本吗?
您可以单击底部中间的“查看编译”按钮以获取普通 CSS
这是一个关于圆形排列项目的LESS版本。