2020 Lösung
Hier ist eine modernere Lösung, die ich heutzutage verwende.
Ich beginne mit der Generierung des HTML-Codes aus einer Reihe von Bildern. Ob der HTML-Code mit PHP, JS oder einem HTML-Präprozessor generiert wird, was auch immer ... dies ist weniger wichtig, da die Grundidee dahinter dieselbe ist.
Hier ist der Mops-Code, der dies tun würde:
//- 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)
Der generierte HTML-Code sieht wie folgt aus (und ja, Sie können den HTML-Code auch manuell schreiben, aber es wird schwierig sein, danach Änderungen vorzunehmen):
<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>
Im CSS legen wir beispielsweise eine Größe für die Bilder fest 8em. Die --mElemente befinden sich auf einem Kreis und befinden sich in der Mitte der Kanten eines Kantenpolygons --m, die alle den Kreis tangieren.
Wenn Sie sich das nur schwer vorstellen können, können Sie mit dieser interaktiven Demo spielen, die den Kreis und den Kreis für verschiedene Polygone erstellt, deren Anzahl der Kanten Sie durch Ziehen des Schiebereglers auswählen.

Dies sagt uns, dass die Größe des Containers doppelt so groß sein muss wie der Radius des Kreises plus doppelt so groß wie die Größe der Bilder.
Wir kennen den Radius noch nicht, aber wir können ihn berechnen, wenn wir die Anzahl der Kanten (und damit die Tangente der Hälfte des Basiswinkels, vorberechnet und als benutzerdefinierte Eigenschaft festgelegt --tan) und die Polygonkante kennen . Wir möchten wahrscheinlich, dass die Polygonkante mindestens so groß wie die Bilder ist, aber wie viel wir an den Seiten lassen, ist willkürlich. Angenommen, wir haben auf jeder Seite die Hälfte der Bildgröße, sodass die Polygonkante doppelt so groß ist wie die Bildgröße. Dies gibt uns das folgende CSS:
.container {
--d: 6.5em; /* image size */
--rel: 1; /* how much extra space we want between images, 1 = one image size */
--r: calc(.5*(1 + var(--rel))*var(--d)/var(--tan)); /* circle radius */
--s: calc(2*var(--r) + var(--d)); /* container size */
position: relative;
width: var(--s); height: var(--s);
background: silver /* to show images perfectly fit in container */
}
.container a {
position: absolute;
top: 50%; left: 50%;
margin: calc(-.5*var(--d));
width: var(--d); height: var(--d);
--az: calc(var(--i)*1turn/var(--m));
transform:
rotate(var(--az))
translate(var(--r))
rotate(calc(-1*var(--az)))
}
img { max-width: 100% }
In der alten Lösung finden Sie eine Erklärung der Funktionsweise der Transformationskette.
Auf diese Weise ordnet das Hinzufügen oder Entfernen eines Bilds zum Array von Bildern die neue Anzahl von Bildern auf einem Kreis automatisch so an, dass sie gleichmäßig verteilt sind, und passt auch die Größe des Containers an. Sie können dies in dieser Demo testen .
ALTE Lösung (aus historischen Gründen erhalten)
Ja, es ist sehr gut möglich und sehr einfach, nur CSS zu verwenden. Sie müssen nur die Winkel im Auge behalten, in denen Sie die Verknüpfungen mit den Bildern herstellen möchten (ich habe am Ende einen Code hinzugefügt, um die Winkel anzuzeigen, wenn Sie mit der Maus über einen von ihnen fahren).
Sie benötigen zuerst einen Wrapper. Ich stelle seinen Durchmesser so ein 24em( width: 24em; height: 24em;macht das), du kannst ihn auf alles einstellen, was du willst. Du gibst es position: relative;.
Anschließend positionieren Sie Ihre Links mit den Bildern horizontal und vertikal in der Mitte des Wrappers. Sie tun dies, indem Sie position: absolute;und dann top: 50%; left: 50%;und margin: -2em;(wo 2emist die halbe Breite des Links mit dem Bild, das ich festgelegt habe - einstellen 4em- wieder können Sie es nach Belieben ändern, aber vergessen Sie nicht, den Rand in zu ändern dieser Fall).
Sie entscheiden dann über die Winkel , in denen Sie Ihre Links mit den Bildern haben wollen und fügen Sie eine Klasse deg{desired_angle}(zum Beispiel deg0oder deg45oder was auch immer). Dann wenden Sie für jede dieser Klassen verkettete CSS-Transformationen wie folgt an:
.deg{desired_angle} {
transform: rotate({desired_angle}) translate(12em) rotate(-{desired_angle});
}
wo Sie ersetzen {desired_angle}mit 0, 45und so weiter ...
Die erste Drehtransformation dreht das Objekt und seine Achsen, die Translationstransformation verschiebt das Objekt entlang der gedrehten X-Achse und die zweite Drehtransformation bringt das Objekt wieder in Position.
Der Vorteil dieser Methode ist, dass sie flexibel ist. Sie können neue Bilder in verschiedenen Winkeln hinzufügen, ohne die aktuelle Struktur zu ändern.
CODE-AUSZUG
.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); }
<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>
Sie können den HTML-Code auch weiter vereinfachen, indem Sie Hintergrundbilder für die Links anstelle von imgTags verwenden.
BEARBEITEN : Beispiel mit Fallback für IE8 und älter (getestet in IE8 und IE7)