<div class="Container"> <!-- last card --> <div class="Picture"> <img class="Picture-img" src="https://images.unsplash.com/photo-1684857580926-600f51d54175?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=687&q=80" alt="" /> <div class="Picture-note"><span> Web girls <a class="Network" href="" target="_top"> </a><a class="Network" href="#" target="_top"><img src="https://www.freepnglogos.com/uploads/twitter-logo-png/twitter-logo-vector-png-clipart-1.png" alt="twitter" /></a></span></div> </div> <!-- other cards --> <div class="Picture"> <img class="Picture-img" src="https://picsum.photos/id/733/400" alt="" /> <div class="Picture-note"><span>Over the clouds</span></div> </div> <div class="Picture"> <img class="Picture-img" src="https://picsum.photos/id/613/400" alt="" /> <div class="Picture-note"><span>Golden Gate Bridge - San Francisco</span></div> </div> <div class="Picture"> <img class="Picture-img" src="https://picsum.photos/id/40/400" alt="" /> <div class="Picture-note"><span>Cat nose</span></div> </div> <div class="Picture"> <img class="Picture-img" src="https://picsum.photos/id/465/400" alt="" /> <div class="Picture-note"><span>Mountain</span></div> </div> <div class="Picture"> <img class="Picture-img" src="https://picsum.photos/id/1029/400" alt="" /> <div class="Picture-note"><span>Central Park - New York</span></div> </div> <div class="Picture"> <img class="Picture-img" src="https://picsum.photos/id/923/400" alt="" /> <div class="Picture-note"><span>Autumn</span></div> </div> <div class="Picture"> <img class="Picture-img" src="https://picsum.photos/id/425/400" alt="" /> <div class="Picture-note"><span>Coffee</span></div> </div> <div class="Picture"> <img class="Picture-img" src="https://picsum.photos/id/200/400" alt="" /> <div class="Picture-note"><span>An Irish cow enjoying the wind on the beach</span></div> </div> <div class="Picture"> <img class="Picture-img" src="https://picsum.photos/id/244/400" alt="" /> <div class="Picture-note"><span>pelicans at the water's edge</span></div> </div> <div class="Picture"> <img class="Picture-img" src="https://picsum.photos/id/15/400" alt="" /> <div class="Picture-note"><span>Waterfall</span></div> </div> </div> @import url("https://fonts.googleapis.com/css2?family=Caveat"); .Container { position: absolute; top: 50%; left: 50%; } .Picture { display: inline-block; position: absolute; top: 0; left: 0; border: 5px solid #fff; border-radius: 3px; background: #fff; box-shadow: 0 0 20px rgba(0, 0, 0, 0.3); transform: translate(-50%, -50%); user-select: none; cursor: pointer; } .Picture-img { display: block; width: 300px; height: 300px; pointer-events: none; } .Picture-note { display: flex; align-items: center; justify-content: center; width: 300px; height: 70px; padding: 12px 24px; font-size: 1.5rem; text-align: center; } .Network { display: inline-block; padding: 0 5px; } .Network img { width: 1.5rem; aspect-ratio: 1 / 1; vertical-align: middle; } /* --------------------- */ /* Other styles */ /* --------------------- */ * { box-sizing: border-box; } body { margin: 0; font-family: 'Caveat', serif; overflow: hidden; } const pictures = document.querySelectorAll('.Picture'); var previousTouch = undefined; function updateElementPosition(element, event) { var movementX, movementY; if (event.type === 'touchmove') { const touch = event.touches[0]; movementX = previousTouch ? touch.clientX - previousTouch.clientX : 0; movementY = previousTouch ? touch.clientY - previousTouch.clientY : 0; previousTouch = touch; } else { movementX = event.movementX; movementY = event.movementY; } const elementY = parseInt(element.style.top || 0) + movementY; const elementX = parseInt(element.style.left|| 0) + movementX; element.style.top = elementY + "px"; element.style.left = elementX + "px"; } function startDrag(element, event) { const updateFunction = (event) => updateElementPosition(element, event); const stopFunction = () => stopDrag({update: updateFunction, stop: stopFunction}); document.addEventListener("mousemove", updateFunction); document.addEventListener("touchmove", updateFunction); document.addEventListener("mouseup", stopFunction); document.addEventListener("touchend", stopFunction); } function stopDrag(functions) { previousTouch = undefined; document.removeEventListener("mousemove", functions.update); document.removeEventListener("touchmove", functions.update); document.removeEventListener("mouseup", functions.stop); document.removeEventListener("touchend", functions.stop); } pictures.forEach(picture => { const range = 100; const randomX = Math.random() * (range * 2) - range; const randomY = Math.random() * (range * 2) - range; const randomRotate = Math.random() * (range / 2) - range / 4; const startFunction = (event) => startDrag(picture, event); picture.style.top = `${randomY}px`; picture.style.left = `${randomX}px`; picture.style.transform = `translate(-50%, -50%) rotate(${randomRotate}deg)`; picture.addEventListener("mousedown", startFunction); picture.addEventListener("touchstart", startFunction); }); Навигация по записям Before/After viewer Backdrop Filters