//- start with an array of images, described by url and alt text
- let imgs = [
- {
- src: 'image_url.jpg',
- alt: 'image alt text'
- } /* and so on, add more images here */
- ];
- let n_imgs = imgs.length;
- let has_mid = 1; /* 0 if there's no item in the middle, 1 otherwise */
- let m = n_imgs - has_mid; /* how many are ON the circle */
- let tan = Math.tan(Math.PI/m); /* tangent of half the base angle */
.container(style=`--m: ${m}; --tan: ${+tan.toFixed(2)}`)
- for(let i = 0; i < n_imgs; i++)
a(href='#' style=i - has_mid >= 0 ? `--i: ${i}` : null)
img(src=imgs[i].src alt=imgs[i].alt)
生成的HTML如下所示(是的,您也可以手动编写HTML,但之后要进行更改会很痛苦):
<div class="container" style="--m: 8; --tan: 0.41">
<a href='#'>
<img src="image_mid.jpg" alt="alt text"/>
</a>
<a style="--i: 1">
<img src="first_img_on_circle.jpg" alt="alt text"/>
</a>
<!-- the rest of those placed on the circle -->
</div>
我有一个类似的工作要做,所以我创建了一个脚本,并为任何可能需要它的人开源here on Github。它只接受一些配置值,并简单地输出您需要的CSS代码。 如果你想使用Js解决方案,这里有一个简单的指针,它对你很有用。使用这个html作为起点,#box是容器,.dot是图像,/div在中间,你想让所有其他的图像围绕着它: 启动html:
<div id="box">
<div class="dot"></div>
<img src="my-img.jpg">
<!-- all the other images you need-->
</div>
var circle = document.getElementById('box'),
imgs = document.getElementsByTagName('img'),
total = imgs.length,
coords = {},
diam, radius1, radius2, imgW;
// get circle diameter
// getBoundingClientRect outputs the actual px AFTER transform
// using getComputedStyle does the job as we want
diam = parseInt( window.getComputedStyle(circle).getPropertyValue('width') ),
radius = diam/2,
imgW = imgs[0].getBoundingClientRect().width,
// get the dimensions of the inner circle we want the images to align to
radius2 = radius - imgW
var i,
alpha = Math.PI / 2,
len = imgs.length,
corner = 2 * Math.PI / total;
// loop over the images and assign the correct css props
for ( i = 0 ; i < total; i++ ){
imgs[i].style.left = parseInt( ( radius - imgW / 2 ) + ( radius2 * Math.cos( alpha ) ) ) + 'px'
imgs[i].style.top = parseInt( ( radius - imgW / 2 ) - ( radius2 * Math.sin( alpha ) ) ) + 'px'
alpha = alpha - corner;
}
var left = $('#centerImage').offset().left - $('#centerImage').parent().offset().left;
var top = $('#centerImage').offset().top - $('#centerImage').parent().offset().top;
$('#surroundingElement1').css({
'left': left - 50,
'top': top - 50
});
$('#surroundingElement2').css({
'left': left - 50,
'top': top
});
$('#surroundingElement3').css({
'left': left - 50,
'top': top + 50
});
9条答案
按热度按时间qyzbxkaa1#
2020溶液
这是我最近用的一个更现代的解决方案。
我首先从一个图片数组开始生成HTML,不管HTML是用PHP、JS还是HTML预处理器生成的,不管是什么......这都不重要,因为背后的基本思想是一样的。
下面是Pug的代码:
生成的HTML如下所示(是的,您也可以手动编写HTML,但之后要进行更改会很痛苦):
在CSS中,我们决定图片的大小,比如
8em
,--m
项位于一个圆上,如果它们位于--m
边的多边形的中间,所有边都与圆相切。如果你很难想象,你可以使用这个interactive demo,它为各种多边形构造内切圆和外切圆,你可以通过拖动滑块来拾取多边形的边数。
这告诉我们容器的大小必须是圆半径的两倍加上图像大小的一半的两倍。
我们还不知道半径,但是如果我们知道边的数目,我们就可以计算出它(因此底角一半的正切值,预先计算并设置为自定义属性
--tan
)和多边形边。我们可能希望多边形边的大小最小为图像的大小,但我们在边上留下多少是任意的。假设我们在每边都有图像大小的一半,所以多边形的边是图像大小的两倍。这给了我们如下的CSS:有关变换链如何工作的说明,请参见旧解决方案。
这样,在图像数组中添加或删除图像时,会自动将新数量的图像排列在一个圆圈上,使它们等间距排列,同时调整容器的大小,您可以在this demo中测试这一点。
旧溶液(因历史原因保留)
是的,使用CSS是非常可能的,也是非常简单的。你只需要清楚地记住你想要图片链接的Angular (我在最后添加了一段代码,只是为了在你悬停其中一个时显示Angular )。
你首先需要一个 Package 器,我把它的直径设置为
24em
(width: 24em; height: 24em;
可以做到这一点),你可以把它设置成任何你想要的,你给它position: relative;
。然后,将链接与图像一起水平和垂直地放置在 Package 器的中心,方法是设置
position: absolute;
、top: 50%; left: 50%;
和margin: -2em;
(其中2em
是图片链接宽度的一半,我将其设置为4em
-同样,您可以将其更改为任何您想要的值,但是在这种情况下不要忘记改变边距)。然后你决定你想要链接到图片的Angular ,你添加一个类
deg{desired_angle}
(例如deg0
或deg45
或其他),然后对每个这样的类应用链式CSS转换,如下所示:在这里,您可以将
{desired_angle}
替换为0
、45
等等...第一个旋转变换旋转对象及其轴,平移变换沿旋转的X轴平移对象,第二个旋转变换将对象带回原位。
这种方法的优点是灵活,你可以在不改变现有结构的情况下,以不同的Angular 添加新的图像。
此外,您可以通过使用链接的背景图像而不是使用
img
标记来进一步简化HTML。o0lyfsai2#
以下是无需绝对定位的简单解决方案:
http://jsfiddle.net/mD6H6/
azpvetkf3#
使用@Ana提出的解决方案:
我创建了下面的jsFiddle,它使用纯JavaScript(也有jQuery版本)动态放置圆圈。
它的工作原理相当简单:
x一个一个一个一个x一个一个二个一个x一个一个三个一个
n3schb8v4#
在@Ana的精彩回答的基础上,我创建了这个动态版本,它允许您在DOM中添加和删除元素,并保持元素之间的比例间距--看看我的小提琴:https://jsfiddle.net/skwidbreth/q59s90oy/
4ktjp1zp5#
这是我在React里做的一个版本,来自这里的例子。
CodeSandbox Example
qmelpv7a6#
你当然可以用纯css或者JavaScript来做。我的建议是:
我有一个类似的工作要做,所以我创建了一个脚本,并为任何可能需要它的人开源here on Github。它只接受一些配置值,并简单地输出您需要的CSS代码。
如果你想使用Js解决方案,这里有一个简单的指针,它对你很有用。使用这个html作为起点,
#box
是容器,.dot
是图像,/div在中间,你想让所有其他的图像围绕着它:启动html:
起始Css:
可以沿着以下方式创建快速函数:
您可以看到一个实时示例here
xxslljrj7#
没有办法用CSS神奇地把可点击的项目放在一个围绕另一个元素的圆圈里。我要做的是用
position:relative;
的容器。然后用position:absolute;
放置所有的元素,用top
和left
定位它的位置。即使您没有在标记中放置jquery,最好使用jQuery / javascript。
第一步是使用
position:relative;
将中心图像完美地放置在容器的中心。之后,你可以用centerImage的
offset()
减去容器的offset()
,把其他元素放在它周围,这样你就得到了图像的top
和left
。我在这里所做的是将元素relative到centerImage。希望这能有所帮助。
n8ghc7c18#
你可以这样做:fiddle
不要介意定位,这是一个简单的示例
hc2pp10m9#
第一步是有6个长柱形框:
第二步是使用
position: absolute
并将它们全部移到容器的中间:现在围绕位于
bottom center
的枢轴点旋转它们。使用:nth-child
改变旋转Angular :现在你所要做的就是把你的图像放在每一列的远端,然后用一个反旋转来补偿旋转:)
完整来源:
x一个一个一个一个x一个一个二个x
参见CodePen