将图标放入圆圈

Fat*_*oke 89 html css html5 css3

如何将多个<img>元素放置在另一个元素周围的圆圈中,并将这些元素都设置为可点击链接?我希望它看起来像下面的图片,但我不知道如何实现这种效果.

期望的结果

这甚至可能吗?

Ana*_*Ana 181

是的,使用CSS非常简单,非常简单.你只需要清楚你想要与图像链接的角度(我在末尾添加了一段代码,只是为了在你将其中一个悬停时显示角度).

演示

你首先需要一个包装器.我将它的直径设置为24em(width: 24em; height: 24em;那样),你可以将它设置为你想要的任何东西.你给它position: relative;.

然后,您可以在水平和垂直方向上将链接与图像放置在该包装的中心.你可以通过设置position: absolute;然后top: 50%; left: 50%;margin: -2em;(那里2em是图像链接宽度的一半,我已经设置为4em- 再次,您可以将其更改为您想要的任何内容,但不要忘记更改边距那个案子).

然后,您决定在要与图像您的链接的角度和你添加一个类deg{desired_angle}(例如deg0deg45或其他).然后对于每个这样的类,您应用链式CSS变换,如下所示:

.deg{desired_angle} {
   transform: rotate({desired_angle}) translate(12em) rotate(-{desired_angle});
}
Run Code Online (Sandbox Code Playgroud)

在您更换{desired_angle}0,45等...

第一个旋转变换旋转对象及其轴,平移变换沿旋转的X轴平移对象,第二个旋转变换将对象带回位置 - 演示以说明其工作原理.

这种方法的优点是它很灵活.您可以在不改变当前结构的情况下以不同角度添加新图像.

HTML:

    .circle-container {
    	position: relative;
    	width: 24em;
    	height: 24em;
    	padding: 2.8em;
        /*2.8em = 2em*1.4 (2em = half the width of a link with img, 1.4 = sqrt(2))*/
    	border: dashed 1px;
    	border-radius: 50%;
    	margin: 1.75em auto 0;
    }
    .circle-container a {
    	display: block;
    	position: absolute;
    	top: 50%; left: 50%;
    	width: 4em; height: 4em;
    	margin: -2em;
    }
    .circle-container img { display: block; width: 100%; }
    .deg0 { transform: translate(12em); } /* 12em = half the width of the wrapper */
    .deg45 { transform: rotate(45deg) translate(12em) rotate(-45deg); }
    .deg135 { transform: rotate(135deg) translate(12em) rotate(-135deg); }
    .deg180 { transform: translate(-12em); }
    .deg225 { transform: rotate(225deg) translate(12em) rotate(-225deg); }
    .deg315 { transform: rotate(315deg) translate(12em) rotate(-315deg); }
Run Code Online (Sandbox Code Playgroud)

相关CSS:

    <div class='circle-container'>
    	<a href='#' class='center'><img src='image.jpg'></a>
    	<a href='#' class='deg0'><img src='image.jpg'></a>
    	<a href='#' class='deg45'><img src='image.jpg'></a>
    	<a href='#' class='deg135'><img src='image.jpg'></a>
    	<a href='#' class='deg180'><img src='image.jpg'></a>
    	<a href='#' class='deg225'><img src='image.jpg'></a>
    	<a href='#' class='deg315'><img src='image.jpg'></a>
    </div>
Run Code Online (Sandbox Code Playgroud)

此外,您可以通过使用链接的背景图像而不是使用img标记来进一步简化HTML .


编辑:IE8及更早版本的回退示例(在IE8和IE7中测试)

  • 之前没见过这种魔法,干得好. (9认同)
  • @Ana很棒,如果感兴趣的话,用你的CSS为n个项目制作一个通用的例子.http://jsfiddle.net/sajjansarkar/zgcgq8cg/ (6认同)
  • @Ana非常酷!你激励我创建一个动态版本 - https://jsfiddle.net/skwidbreth/q59s90oy/ (3认同)

gko*_*ond 17

这是没有绝对定位的简单解决方案:

.container .row {
  margin: 20px;
  text-align: center;
}

.container .row img {
  margin: 0 20px;
}
Run Code Online (Sandbox Code Playgroud)
<div class="container">
  <div class="row">
    <img src="https://ssl.gstatic.com/s2/oz/images/faviconr2.ico" alt="" width="64" height="64">
    <img src="https://ssl.gstatic.com/s2/oz/images/faviconr2.ico" alt="" width="64" height="64">
  </div>
  <div class="row">
    <img src="https://ssl.gstatic.com/s2/oz/images/faviconr2.ico" alt="" width="64" height="64">
    <img src="https://ssl.gstatic.com/s2/oz/images/faviconr2.ico" alt="" width="64" height="64">
    <img src="https://ssl.gstatic.com/s2/oz/images/faviconr2.ico" alt="" width="64" height="64">
  </div>
  <div class="row">
    <img src="https://ssl.gstatic.com/s2/oz/images/faviconr2.ico" alt="" width="64" height="64">
    <img src="https://ssl.gstatic.com/s2/oz/images/faviconr2.ico" alt="" width="64" height="64">
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/mD6H6/


skw*_*eth 8

建立@Ana的优秀答案,我创建了这个动态版本,允许您添加和删除DOM中的元素并保持元素之间的比例间距 - 请查看我的小提琴:https://jsfiddle.net/skwidbreth/q59s90oy/

var list = $("#list");

var updateLayout = function(listItems) {
  for (var i = 0; i < listItems.length; i++) {
    var offsetAngle = 360 / listItems.length;
    var rotateAngle = offsetAngle * i;
    $(listItems[i]).css("transform", "rotate(" + rotateAngle + "deg) translate(0, -200px) rotate(-" + rotateAngle + "deg)")
  };
};

$(document).on("click", "#add-item", function() {
  var listItem = $("<li class='list-item'>Things go here<button class='remove-item'>Remove</button></li>");
  list.append(listItem);
  var listItems = $(".list-item");
  updateLayout(listItems);

});

$(document).on("click", ".remove-item", function() {
  $(this).parent().remove();
  var listItems = $(".list-item");
  updateLayout(listItems);
});
Run Code Online (Sandbox Code Playgroud)
#list {
  background-color: blue;
  height: 400px;
  width: 400px;
  border-radius: 50%;
  position: relative;
}

.list-item {
  list-style: none;
  background-color: red;
  height: 50px;
  width: 50px;
  position: absolute;
  top: 50%;
  left: 50%;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>

<ul id="list"></ul>
<button id="add-item">Add item</button>
Run Code Online (Sandbox Code Playgroud)


Ita*_*dev 7

使用@Ana 提出的解决方案:

transform: rotate(${angle}deg) translate(${radius}px) rotate(-${angle}deg)
Run Code Online (Sandbox Code Playgroud)

我创建了以下jsFiddle,它使用纯 JavaScript(也可用 jQuery 版本)动态放置圆圈。

它的工作方式相当简单:

document.querySelectorAll( '.ciclegraph' ).forEach( ( ciclegraph )=>{
  let circles = ciclegraph.querySelectorAll( '.circle' )
  let angle = 360-90, dangle = 360 / circles.length
  for( let i = 0; i < circles.length; ++i ){
    let circle = circles[i]
    angle += dangle
    circle.style.transform = `rotate(${angle}deg) translate(${ciclegraph.clientWidth / 2}px) rotate(-${angle}deg)`
  }
})
Run Code Online (Sandbox Code Playgroud)
.ciclegraph {
  position: relative;
  width: 500px;
  height: 500px;
  margin: calc(100px / 2 + 0px);
}

.ciclegraph:before {
  content: "";
  position: absolute;
  top: 0; left: 0;
  border: 2px solid teal;
  width: calc( 100% - 2px * 2);
  height: calc( 100% - 2px * 2 );
  border-radius: 50%;
}

.ciclegraph .circle {
  position: absolute;
  top: 50%; left: 50%;
  width: 100px;
  height: 100px;
  margin: calc( -100px / 2 );
  background: teal;
  border-radius: 50%;
}
Run Code Online (Sandbox Code Playgroud)
<div class="ciclegraph">
  <div class="circle"></div>
  <div class="circle"></div>
  <div class="circle"></div>
  <div class="circle"></div>
  <div class="circle"></div>
  <div class="circle"></div>
</div>
Run Code Online (Sandbox Code Playgroud)


br3*_*tor 6

这是我从这里的示例中在 React 中制作的一个版本。

代码沙盒示例

import React, { useRef, useEffect } from "react";

import "./styles.css";

export default function App() {
  const graph = useRef(null);

  useEffect(() => {
    const ciclegraph = graph.current;
    const circleElements = ciclegraph.childNodes;

    let angle = 360 - 90;
    let dangle = 360 / circleElements.length;

    for (let i = 0; i < circleElements.length; i++) {
      let circle = circleElements[i];
      angle += dangle;
      circle.style.transform = `rotate(${angle}deg) translate(${ciclegraph.clientWidth /
        2}px) rotate(-${angle}deg)`;
    }
  }, []);

  return (
    <div className="App">
      <div className="ciclegraph" ref={graph}>
        <div className="circle" />
        <div className="circle" />
        <div className="circle" />
        <div className="circle" />
        <div className="circle" />
        <div className="circle" />
      </div>
    </div>
  );
}
Run Code Online (Sandbox Code Playgroud)

  • 我来这里寻找一个可以在 React 中使用的解决方案,所以仍然非常有用 (3认同)
  • 我知道,这是一个没有人要求的答案,但无论如何,这就是呵呵:) (2认同)

Sem*_*Sem 5

使用CSS无法将可点击的项目神奇地放置在围绕另一个元素的圆圈中.我如何做到这一点的方法是使用一个容器position:relative;.然后将所有元素放置position:absolute;并使用topleft定位它的位置.

即使你没有在你的标签中放置,最好使用jQuery/javascript.

第一步是使用中心图像完美地放置在容器的中心position:relative;.

#centerImage {
  position:absolute;
  top:50%;
  left:50%;
  width:200px;
  height:200px;
  margin: -100px 0 0 -100px;
}
Run Code Online (Sandbox Code Playgroud)

之后,您可以使用offset()centerImage减去offset()容器的一个来放置其他元素.给你确切topleft图像.

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 
});
Run Code Online (Sandbox Code Playgroud)

我在这里做的是将元素放在对于centerImage的位置.希望这可以帮助.


Nob*_*ita 5

您当然可以使用纯 css 或使用 JavaScript 来完成。我的建议:

  • 如果您已经知道图像编号永远不会改变,只需计算您的样式并使用纯 css(优点:性能更好,非常可靠)

  • 如果数字可以在您的应用程序中动态变化,或者将来可能会发生变化,请使用 Js 解决方案(优点:更具前瞻性)

我有一个类似的工作要做,所以我创建了一个脚本并在 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>
Run Code Online (Sandbox Code Playgroud)

开始CSS:

 #box{
  width: 400px;
  height: 400px;
  position: relative;
  border-radius: 100%;
  border: 1px solid teal;
}

.dot{
    position: absolute;
    border-radius: 100%;
    width: 40px;
    height: 40px;
    left: 50%;
    top: 50%;
    margin-left: -20px;
    margin-top: -20px;
    background: rebeccapurple;
}
img{
  width: 40px;
  height: 40px;
  position: absolute;
}
Run Code Online (Sandbox Code Playgroud)

您可以按照以下方式创建快速函数:

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;
}
Run Code Online (Sandbox Code Playgroud)

你可以在这里看到一个活生生的例子