2020 समाधान
यहां एक और आधुनिक समाधान है जो मैं इन दिनों उपयोग करता हूं।
मैं छवियों की एक सरणी से शुरू होने वाले HTML को उत्पन्न करके बंद करता हूं। चाहे HTML PHP, JS, कुछ HTML प्रीप्रोसेसर का उपयोग करके उत्पन्न होता है, जो भी ... यह कम महत्वपूर्ण है क्योंकि मूल विचार के पीछे एक ही है।
यहाँ पग कोड है कि यह करना होगा:
//- 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>
CSS में, हम छवियों के लिए एक आकार तय करते हैं, आइए बताते हैं 8em। --mआइटम एक चक्र पर स्थान दिया जाता है और यदि वे की एक बहुभुज के किनारों के बीच में कर रहे हैं यह है --mकिनारों, जो सभी के चक्र को स्पर्श कर रहे हैं।
यदि आपके पास एक कठिन समय है, तो आप इस इंटरेक्टिव डेमो के साथ खेल सकते हैं, जो विभिन्न पॉलीगनों के लिए अंतर्वृत्त और परिधि का निर्माण करता है, जिनकी संख्या आप स्लाइडर को खींचकर उठाते हैं।

यह हमें बताता है कि कंटेनर का आकार सर्कल के त्रिज्या से दोगुना होना चाहिए और छवियों का आधा आधा गुना होना चाहिए।
हम अभी तक त्रिज्या को नहीं जानते हैं, लेकिन यदि हम किनारों की संख्या (और इसलिए आधा आधार कोण की स्पर्शरेखा, पूर्वनिर्धारित और एक कस्टम गुण के रूप में सेट --tan) और बहुभुज किनारे जानते हैं तो हम इसकी गणना कर सकते हैं । हम शायद बहुभुज किनारे को कम से कम छवियों के आकार के रूप में चाहते हैं, लेकिन हम पक्षों पर कितना छोड़ते हैं वह मनमाना है। मान लें कि हमारे पास प्रत्येक तरफ आधा छवि आकार है, इसलिए बहुभुज किनारे छवि का आकार दोगुना है। यह हमें निम्नलिखित सीएसएस देता है:
.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% }
परिवर्तन श्रृंखला कैसे काम करती है, इसकी व्याख्या के लिए पुराना समाधान देखें।
इस तरह, छवियों के सरणी से एक छवि को जोड़ना या निकालना स्वचालित रूप से एक सर्कल पर छवियों की नई संख्या को व्यवस्थित करता है, जैसे कि वे समान रूप से बाहर होते हैं और कंटेनर के आकार को भी समायोजित करते हैं। आप इस डेमो में इसका परीक्षण कर सकते हैं ।
OLD समाधान (ऐतिहासिक कारणों से संरक्षित)
हाँ, यह बहुत ही संभव है और बहुत सरल बस CSS का उपयोग कर रहा है। आपको केवल उन कोणों को ध्यान में रखना होगा, जिन पर आप चित्रों के साथ लिंक चाहते हैं (मैंने कोणों को दिखाने के लिए अंत में कोड का एक टुकड़ा जोड़ा है जब भी आप उनमें से किसी एक को हॉवर करते हैं)।
आपको सबसे पहले एक रैपर चाहिए। मैंने इसका व्यास 24em( width: 24em; height: 24em;ऐसा करता है) होने के लिए सेट किया है , आप इसे अपनी इच्छानुसार सेट कर सकते हैं। आप दे दो position: relative;।
फिर आप अपने लिंक को उस रैपर के केंद्र में क्षैतिज और लंबवत दोनों तरह से लगाते हैं। आप सेटिंग करके position: absolute;और फिर top: 50%; left: 50%;और margin: -2em;(जहां 2emछवि के साथ लिंक की आधी चौड़ाई है, जिसे मैंने सेट किया है4em - फिर से, आप इसे अपनी इच्छानुसार बदल सकते हैं, लेकिन इसमें मार्जिन बदलना न भूलें उस मामले में)।
इसके बाद आप कोण जिस पर आप छवियों के साथ अपने लिंक करना चाहते हैं पर फैसला है और आप एक वर्ग को जोड़ने deg{desired_angle}(उदाहरण के लिए deg0या deg45या जो कुछ भी)। फिर इस तरह के प्रत्येक वर्ग के लिए आप जंजीर सीएसएस रूपांतर लागू करते हैं, जैसे:
.deg{desired_angle} {
transform: rotate({desired_angle}) translate(12em) rotate(-{desired_angle});
}
जहां की जगह {desired_angle}के साथ 0, 45, और इतने पर ...
पहला रोटेट ट्रांसफ़ॉर्म ऑब्जेक्ट और उसके एक्सिस को घुमाता है, ट्रांसलेट ट्रांसफ़ॉर्म ऑब्जेक्ट को रोटेटेड एक्स एक्सिस के साथ ट्रांसलेट करता है और दूसरा रोटेट ट्रांसफ़ॉर्म ऑब्जेक्ट को स्थिति में वापस लाता है।
इस पद्धति का लाभ यह है कि यह लचीला है। आप वर्तमान संरचना को बदलने के बिना विभिन्न कोणों पर नई छवियां जोड़ सकते हैं।
सांकेतिक टुकड़ा
.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>
इसके अलावा, आप imgटैग का उपयोग करने के बजाय लिंक के लिए पृष्ठभूमि छवियों का उपयोग करके HTML को और सरल बना सकते हैं ।
संपादित करें : IE8 और पुराने (IE8 और IE7 में परीक्षण) के लिए कमबैक के साथ उदाहरण