Es kann eine ziemliche Herausforderung sein, Elemente mit CSS auf einem Kreis zu platzieren. Normalerweise greifen wir auf JavaScript zurück, weil einige Plugins alles sofort richtig machen. Aber meistens gibt es keinen guten Grund, es statt mit CSS mit JavaScript zu tun. Dies dient der Darstellung, also gehen wir den CSS-Weg.
Der Mixin
Ana Tudor erklärte, wie sie es in einer Stack Overflow-Antwort mit verketteten CSS-Transformationen geschafft hat. Danach habe ich ihre Lösung in einen Sass-Mixin umgewandelt, um alles zum Kinderspiel zu machen.
/// 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;
}
}
}
Vorsicht! Vendor-Präfixe wurden aus diesem Code-Snippet weggelassen. Achten Sie darauf, transform zu präfixen, wenn Sie Autoprefixer nicht verwenden.
Demo
Zu Demozwecken betrachten wir eine Liste von 8 Bildern, aber grundsätzlich könnte alles funktionieren.
<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);
}
}
}
Das ist gut, aber funktioniert nicht in IE
In IE ist es eigentlich recht einfach. Schauen Sie sich den Originalartikel an: http://hugogiraudel.com/2013/04/02/items-on-circle/.
Ist es möglich, diese Elemente mit dem Bootstrap-Grid-System zu positionieren?
Danke für diesen Artikel, Hugo, er ist wirklich cool. Gibt es eine Möglichkeit, ein Bild in die Mitte des Kreises zu positionieren?
Schon vergessen – ich habe gerade Ihren Artikel „Centering With Sass“ gefunden. Sie sind mein neuer Lieblingsautor :)
Hugo,
Ich liebe dieses Beispiel, es hat mir bei einem Experiment sehr geholfen, bei dem ich einen Winkel-Datensatz habe, der von einem bis zu acht Elemente im Kreis erfordern kann. Daher habe ich zusätzliche Logik in SASS eingebaut, um c1 bis c8 zu generieren, wobei die Zahl die Anzahl der Kreise ist.
http://codepen.io/stegel/details/RWqpwO/
Ich habe festgestellt, dass, wenn ich ein n+1-Element hinzufüge, es automatisch zentriert wird. War das beabsichtigt?
Ich versuche herauszufinden, wie man eines der äußeren Elemente in die Mitte animiert. Haben Sie dazu Vorschläge?
Hallo Sir, können Sie mir helfen, diesen Kreis automatisch zu drehen?
Schöner Artikel, Hugo, danke! Ich habe mich gefragt, wie wir das Element entlang des Kreises drehen können, ohne dem übergeordneten Wrapper eine Rotations-Transformation zu geben.
das ist ein cooler Kreis!, aber ich muss wissen…ist es möglich, Parameter von HTML an die Funktion ‚@include on-circle($item-count: 8, $circle-size: 20em, $item-size: 6em);‘ zu übergeben?, sagen wir, ich möchte den Wert von ‚item-count‘ steuern, wie kann ich das tun?
Sie können hier ändern
$item-count: 8 z.B. $item-count: 10
und fügen Sie eine weitere Zeile hinzu:
<
ul> -> …
Wo ist die Variable $i definiert?
Es funktioniert gut. Aber ich habe ein Problem! Ich habe CSS-Animationen auf den gesamten Container angewendet und es hat funktioniert. Aber ich kann keine Animationen für die Elemente innerhalb des Kreises anwenden. Was muss ich jetzt tun?
Ich versuche, 6 divs um einen Kreis zu legen und Text anzuzeigen, wenn man mit der Maus über die divs fährt.
Ich habe das: https://jsfiddle.net/zwsck7gm/2/
und das: http://jsfiddle.net/ytwL7g81/ aber ich habe Schwierigkeiten, sie zu einem Ganzen zusammenzuführen.
Können Sie bitte helfen.
Vielen Dank, Hugo & Ana, dieses Snippet hat mir viel Kopfzerbrechen erspart und mich in die richtige Richtung gewiesen!
Hallo, gibt es eine Möglichkeit, dies im Kreis rotieren zu lassen, während die Objektorientierung beibehalten wird?
Hallo Matteo! Sie könnten versuchen, dem Container eine Animation hinzuzufügen, die ihn dreht. https://codepen.io/geoffgraham/pen/LajvrK
Wenn Sie dieses wunderschöne Design auf die nächste Stufe heben möchten, können Sie mit dem Winkel des Kreises spielen.
| $angle: (360 / $item-count);
190 Grad ergeben eine Art Halskette.
680 Grad ergeben einen Kreis mit zwei Knoten in 4 gleichen Abschnitten.
Hallo.
Ich habe so lange nach einer Lösung wie dieser gesucht, das ist erstaunlich. Schauen Sie sich das Beispiel auf dieser Seite an, wie kann ich Text in der Mitte des Kreises haben und ihn ändern, indem ich auf jedes Element klicke? Siehe Beispiel auf dieser Seite, scrollen Sie etwas nach unten
https://kriesi.at/
Danke für diese Technik! Ich habe sie aktualisiert, um sie vollständig responsiv zu machen, indem ich nicht auf die Kreisgröße, die Elementgröße oder die Elementanzahl angewiesen bin. Sie können sie hier überprüfen: https://codepen.io/sntran/pen/rNVoEZB
Der Mixin ist in LESS statt in Sass, da ich damit besser vertraut bin, aber die Logik ist dieselbe. Ein paar Techniken, um dies zu ermöglichen
Verwenden Sie
height: 0; padding-bottom: 100%, um den responsiven Kreis zu erstellen.Machen Sie
item-sizezu einem Prozentsatz des Kreisdurchmessers.Verwenden Sie Mengenabfragen (https://alistapart.com/article/quantity-queries-for-css/#section5), um Regeln basierend auf der tatsächlichen Anzahl der Elemente in der Liste zu haben.
Viel Spaß!
Ist es möglich, diesen Kreis responsiv zu gestalten, damit er beispielsweise beim Betrachten von einem Mobilgerät aus die Seite nicht erweitert?
Ich brauche das auch. Ich muss vielleicht auf die JavaScript-Route zurückgreifen.
Ich habe noch kein Beispiel gesehen, das wirklich responsiv ist. Alle Beispiele, die ich gesehen habe, haben eine feste Breite der Gesamthöhe/Breite.
Es ist entweder zu klein für den Desktop oder zu groß für Handys.
Hat jemand eine PostCSS-Version davon?
Sie können auf die Schaltfläche „Kompiliert anzeigen“ in der Mitte unten klicken, um das Vanilla-CSS zu erhalten.
Hier ist eine LESS-Version der Elemente auf einem Kreis