2020 çözümü
İşte bugünlerde kullandığım daha modern bir çözüm.
Bir dizi görüntüden başlayarak HTML oluşturarak başlarım. HTML ister PHP, JS, ister HTML ön işlemcisi kullanılarak oluşturulmuş olsun, her neyse ... arkasındaki temel fikir aynı olduğu için bu daha az önemli.
İşte bunu yapacak Pug kodu:
- let imgs = [
- {
- src: 'image_url.jpg',
- alt: 'image alt text'
- }
- ];
- let n_imgs = imgs.length;
- let has_mid = 1;
- let m = n_imgs - has_mid;
- let tan = Math.tan(Math.PI/m);
.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)
Oluşturulan HTML aşağıdaki gibi görünür (ve evet, HTML'yi manuel olarak da yazabilirsiniz, ancak daha sonra değişiklik yapmak zor olacaktır):
<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>
</div>
CSS'de görseller için bir boyut belirledik diyelim 8em. --mÜrün bir daire üzerinde yer aldıkları ve bir çokgenin kenarlarının orta iseniz öyle --mdaireye teğet hepsi kenarlarına.
Bunu hayal etmekte zorlanıyorsanız , kaydırıcıyı sürükleyerek kenar sayısını seçtiğiniz çeşitli çokgenler için incircle ve çevresel çemberi oluşturan bu etkileşimli demo ile oynayabilirsiniz .

Bu bize, kabın boyutunun dairenin yarıçapının iki katı artı görüntülerin yarısı kadar olması gerektiğini söyler.
Henüz yarıçapı bilmiyoruz, ancak kenarların sayısını (ve dolayısıyla, önceden hesaplanan ve özel bir özellik olarak ayarlanmış taban açısının yarısının tanjantını --tan) ve çokgen kenarını biliyorsak bunu hesaplayabiliriz . Muhtemelen poligon kenarının en azından görüntü boyutunda olmasını istiyoruz, ancak kenarlarda ne kadar bıraktığımız keyfi. Diyelim ki her bir tarafta yarı görüntü boyutumuz var, bu yüzden çokgen kenar görüntü boyutunun iki katı. Bu bize aşağıdaki CSS'yi verir:
.container {
--d: 6.5em;
--rel: 1;
--r: calc(.5*(1 + var(--rel))*var(--d)/var(--tan));
--s: calc(2*var(--r) + var(--d));
position: relative;
width: var(--s); height: var(--s);
background: silver
}
.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% }
Dönüşüm zincirinin nasıl çalıştığına dair bir açıklama için eski çözüme bakın.
Bu şekilde, görüntü dizisinden bir görüntü eklemek veya çıkarmak, yeni görüntü sayısını bir daire üzerinde eşit aralıklarla yerleştirilecek şekilde otomatik olarak düzenler ve ayrıca kabın boyutunu ayarlar. Bunu bu demoda test edebilirsiniz .
ESKİ çözüm (tarihsel nedenlerle korunmuştur)
Evet, sadece CSS kullanarak çok mümkün ve çok basit. Görsellerle bağlantı kurmak istediğiniz açıları aklınızda tutmanız yeterlidir (Sonuna, sadece birinin üzerine geldiğinizde açıları göstermek için bir kod parçası ekledim).
Önce bir paketleyiciye ihtiyacınız var. Çapını 24em( width: 24em; height: 24em;bunu yapar) olarak ayarlıyorum, istediğiniz gibi ayarlayabilirsiniz. Sen ver position: relative;.
Ardından, bağlantılarınızı hem yatay hem de dikey olarak bu sarmalayıcının ortasına yerleştirirsiniz. Bunu ayarlayarak yaparsınız position: absolute;ve sonra top: 50%; left: 50%;ve margin: -2em;( 2embenim ayarladığım resimle bağlantının genişliğinin yarısı nerede 4em- yine, istediğiniz gibi değiştirebilirsiniz, ancak kenar boşluğunu değiştirmeyi unutmayın. O vaka).
Daha sonra resimlerle bağlantıları istediğiniz hangi açılardan karar ve Sınıf eklemek deg{desired_angle}(örneğin deg0ya deg45ya da her neyse). Daha sonra bu tür her bir sınıf için zincirleme CSS dönüşümleri uygularsınız, örneğin:
.deg{desired_angle} {
transform: rotate({desired_angle}) translate(12em) rotate(-{desired_angle});
}
nereye değiştirmek {desired_angle}ile 0, 45ve benzeri ...
İlk döndürme dönüşümü nesneyi ve eksenlerini döndürür, çeviri dönüşümü nesneyi döndürülen X ekseni boyunca çevirir ve ikinci döndürme dönüşümü nesneyi tekrar konumuna getirir.
Bu yöntemin avantajı esnek olmasıdır. Mevcut yapıyı değiştirmeden farklı açılardan yeni görüntüler ekleyebilirsiniz.
KOD SNIPPET
.circle-container {
position: relative;
width: 24em;
height: 24em;
padding: 2.8em;
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); }
.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>
Ayrıca, imgetiketler kullanmak yerine bağlantılar için arka plan resimleri kullanarak HTML'yi daha da basitleştirebilirsiniz .
DÜZENLEME : IE8 ve daha eski sürümler için yedek ile örnek (IE8 ve IE7'de test edilmiştir)