Gdzie wykorzystać ten przykład?
Narzędzia edycji, zegary i obsługa wskaźnika. Wariant „Karta przesuwana wskaźnikiem” możesz dopasować do kolorów i treści swojej strony.
Jak działa ten efekt?
Pointer Events, canvas i zegary przeglądarki pozwalają sterować elementami i przetwarzać pliki bez serwera.
Jak dodać go na stronę?
- Otwórz przykład w edytorze i podmień tekst oraz kolory.
- HTML wstaw w miejscu, w którym ma pojawić się element.
- CSS przenieś do arkusza stylów swojej strony. Reguły
body z podglądu dopasuj do własnego układu. - JavaScript uruchom po załadowaniu elementów HTML, na przykład przed zamknięciem
</body>. - Sprawdź działanie na telefonie, klawiaturą i z własną treścią.
Na co zwrócić uwagę?
Sprawdź dotyk i klawiaturę. Eksport plików oraz schowek mogą zależeć od możliwości i uprawnień przeglądarki.
Co możesz zmienić w konfiguratorze?
Nagłówek, Kolor akcentu, Zaokrąglenie. W edytorze kodu możesz dodatkowo zmienić całą strukturę i zachowanie przykładu.
Gotowy kod: Karta przesuwana wskaźnikiem
HTML
<section class="lab"><h2>Karta przesuwana wskaźnikiem</h2><div class="drag-board"><div class="drag-card" tabindex="0" role="button" aria-label="Przesuwana karta; użyj strzałek">Przesuń mnie ↔</div></div><button class="drag-reset">Wyśrodkuj</button></section>
CSS
*{box-sizing:border-box}body{margin:0;padding:35px 24px;background:#f4f5ef;color:#293322;font:15px/1.7 Arial,sans-serif;min-height:100vh;display:grid;place-items:center}button,input{font:inherit}button,a{touch-action:manipulation}button{cursor:pointer}button:focus-visible,a:focus-visible,summary:focus-visible{outline:3px solid #738858;outline-offset:4px}h2,h3,p{margin-top:0}[hidden]{display:none!important}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation:none!important;transition:none!important;scroll-behavior:auto!important}}
.lab{max-width:800px;margin:25px auto;padding:25px;border:1px solid #d4dec9;border-radius:14px;background:#fff;color:#273724;font:15px/1.6 system-ui,sans-serif;overflow-wrap:anywhere}.lab *{box-sizing:border-box}.lab h2{font-size:23px;margin:0 0 25px;line-height:1.3}.lab h3{line-height:1.3}.lab label{display:block;margin:10px 0}.lab input:not([type=checkbox]):not([type=radio]),.lab select,.lab textarea{font:inherit;padding:9px;border:1px solid #bac9ad;border-radius:6px;max-width:100%;background:#fff;color:#273724}.lab input[type=range]{width:100%;accent-color:#6f8e58}.lab input[type=color]{height:45px;width:70px}.lab input[type=checkbox]{accent-color:#6f8e58;margin-right:8px}.lab textarea{width:100%}.lab button{font:inherit;font-weight:600;border:0;border-radius:14px;background:#6f8e58;color:#fff;padding:10px 16px;cursor:pointer}.lab button:disabled{opacity:.45;cursor:default}.lab :focus-visible{outline:3px solid #315f8b;outline-offset:3px}.lab pre{white-space:pre-wrap;overflow-wrap:anywhere;background:#f0f4e9;padding:15px;font:12px/1.6 monospace}.lab table{border-collapse:collapse;width:100%}.lab th,.lab td{padding:10px;text-align:left;border-bottom:1px solid #d9e3ce}.lab progress{accent-color:#6f8e58}.lab .lab-hint{font-size:11px;color:#687861;border-top:1px solid #dbe3d0;padding-top:16px;margin-top:25px}.lab [hidden]{display:none!important}@media(max-width:480px){.lab{padding:16px;margin:10px auto}.lab h2{font-size:20px}.lab table{font-size:12px}.lab th,.lab td{padding:7px}}@media(prefers-reduced-motion:reduce){.lab *{animation:none!important;transition:none!important}}
.drag-board{position:relative;height:280px;background:repeating-linear-gradient(0deg,#edf3e5 0 29px,#d9e5cb 30px);overflow:hidden}.drag-card{position:absolute;width:140px;padding:25px 10px;background:#6f8e58;color:white;touch-action:none;cursor:grab;user-select:none;text-align:center}
JavaScript
const board=document.querySelector('.drag-board'),card=document.querySelector('.drag-card');let x=30,y=40,start=null;function place(){x=Math.max(0,Math.min(x,Math.max(0,board.clientWidth-card.offsetWidth)));y=Math.max(0,Math.min(y,Math.max(0,board.clientHeight-card.offsetHeight)));card.style.left=x+'px';card.style.top=y+'px'}card.onpointerdown=e=>{start={x:e.clientX-x,y:e.clientY-y};card.setPointerCapture(e.pointerId);card.focus()};card.onpointermove=e=>{if(!start)return;x=e.clientX-start.x;y=e.clientY-start.y;place()};card.onpointerup=card.onpointercancel=()=>start=null;card.onkeydown=e=>{if(!['ArrowLeft','ArrowRight','ArrowUp','ArrowDown'].includes(e.key))return;e.preventDefault();x+=e.key==='ArrowRight'?10:e.key==='ArrowLeft'?-10:0;y+=e.key==='ArrowDown'?10:e.key==='ArrowUp'?-10:0;place()};document.querySelector('.drag-reset').onclick=()=>{x=(board.clientWidth-card.offsetWidth)/2;y=90;place()};place();