console
function createCircularItems(circleContainerSelector, numItems, numLayers, centerX, centerY, initialRadius, layerSpacing) {
const circleContainer = document.querySelector(circleContainerSelector);
if (!circleContainer) {
console.error(`Container ${circleContainerSelector} not found.`);
return;
}
let items = [];
let observer;
let itemIndex = 0;
for (let layer = 0; layer < numLayers; layer++) {
const layerRadius = initialRadius + layer * layerSpacing;
const itemsPerLayer = Math.ceil(numItems * (layer + 1) / ((numLayers + 1) * numLayers / 2));
for (let i = 0; i < itemsPerLayer; i++) {
if (itemIndex >= numItems) break;
const angle = (i / itemsPerLayer) * 2 * Math.PI;
const x = centerX + layerRadius * Math.cos(angle);
const y = centerY + layerRadius * Math.sin(angle);
const item = document.createElement('div');
item.classList.add('circle-item');
item.style.left = `${x}px`;
item.style.top = `${y}px`;
circleContainer.appendChild(item);
items.push(item);
itemIndex++;
if (i === itemsPerLayer - 1 && layer === numLayers - 1) {
const finalAngle = 0;
const finalX = centerX + layerRadius * Math.cos(finalAngle);
const finalY = centerY + layerRadius * Math.sin(finalAngle);
const finalItem = document.createElement('div');
finalItem.classList.add('circle-item');
finalItem.style.left = `${finalX}px`;
finalItem.style.top = `${finalY}px`;
circleContainer.appendChild(finalItem);
items.push(finalItem);
itemIndex++;
}
}
}
observer = new IntersectionObserver((entries, observer) => {
const allOutOfView = entries.every(entry => entry.intersectionRatio === 0);
if (allOutOfView) {
items.forEach(item => {
item.style.transition = 'opacity 0.5s ease-in-out';
item.style.opacity = '0';
});
} else {
items.forEach((item, index) => {
setTimeout(() => {
item.style.transition = 'opacity 0.5s ease-in-out';
item.style.opacity = '1';
}, index * 30);
});
}
}, { threshold: 0 });
observer.observe(circleContainer);
}
createCircularItems('.circle-container', 36, 3, 10, 10, 30, 30);
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Circular Loading Animation</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div class="circle-container">
</div>
<script src="script.js"></script>
</body>
</html>
body {
display: flex;
justify-content: center;
align-items: center;
height: 300vh;
margin: 0;
background-color: #f0f0f0;
}
.circle-container {
position: relative;
width: 200px;
height: 200px;
}
.circle-item {
position: absolute;
left: 50%;;
top: 50%;
transform: translate(-50%,-50%);
width: 24px;
height: 24px;
background-color: #3498db;
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
font-size: 14px;
color: white;
opacity: 0;
transition: opacity 0.5s ease;
}