Atrybut draggable i zdarzenie dragstart
Umożliwianie przeciągania elementów i reagowanie na dragstart
Atrybut draggable i zdarzenie dragstart to bezpłatna lekcja HTML Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej HTML Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs HTML Academy zawiera 4 lekcji w sumie.
Atrybut draggable
Każdy element staje się źródłem przeciągania po ustawieniu draggable="true". Odnośniki i obrazy można przeciągać domyślnie; pozostałe elementy (div, li, span) wymagają jawnego ustawienia tego atrybutu. draggable="false" wyłącza element z natywnego przeciągania.
<div draggable="true" id="card">Drag me</div>Zdarzenie dragstart
Gdy użytkownik rozpoczyna przeciąganie, element źródłowy emituje zdarzenie dragstart. To właśnie wtedy należy zainicjować przeciąganie: zapisać informację o przenoszonym elemencie, opcjonalnie nadać mu odpowiedni styl i zapisać dane w obiekcie dataTransfer, który odczyta element docelowy.
card.addEventListener("dragstart", (e) => {
e.dataTransfer.setData("text/plain", card.id);
});Bez dragstart nic się nie dzieje
Jeśli oznaczysz element jako przeciągalny, ale nie obsłużysz zdarzenia dragstart, przeglądarka nadal będzie przeciągać jego obraz zastępczy, lecz nie zostaną ustawione żadne dane, więc większość elementów docelowych odrzuci upuszczenie. Zawsze łącz atrybut draggable z listenerem dragstart, który zapisuje przynajmniej identyfikator.
Ustawianie effectAllowed
e.dataTransfer.effectAllowed = "move" w zdarzeniu dragstart ogranicza operację do jednej z wartości: "copy", "move", "link", "copyMove", "all" lub "none". Wpływa to na kursor wyświetlany przez przeglądarkę oraz na wartość dropEffect, którą element docelowy może ustawić później.
Dodawanie wskazówki wizualnej
Dodaj klasę CSS do elementu źródłowego, aby podczas przeciągania był przyciemniony: card.classList.add("dragging"). Usuń tę klasę w zdarzeniu dragend, aby styl został wyczyszczony niezależnie od tego, czy upuszczenie się powiodło, czy zostało anulowane klawiszem Escape.
Niestandardowy obraz przeciągania
Domyślnie przeglądarka przeciąga półprzezroczystą migawkę elementu źródłowego. Możesz to zmienić za pomocą e.dataTransfer.setDragImage(node, offsetX, offsetY) — przekaż ukryty element DOM lub obiekt Image, aby wyświetlać niestandardowy podgląd przy kursorze.
const ghost = document.getElementById("drag-preview");
card.addEventListener("dragstart", (e) => {
e.dataTransfer.setDragImage(ghost, 20, 20);
});Zdarzenie dragend
dragend jest emitowane na elemencie źródłowym po zakończeniu przeciągania — niezależnie od tego, czy upuszczenie się powiodło, nastąpiło na nieprawidłowym elemencie docelowym, czy zostało anulowane. Używaj go do sprzątania: usuwania klasy dragging, ukrywania podglądów i przywracania przezroczystości.
Wykrywanie anulowania
Wewnątrz dragend sprawdź e.dataTransfer.dropEffect. Jeśli wartość wynosi "none", upuszczenie nie nastąpiło (element docelowy je odrzucił, użytkownik nacisnął Escape albo upuścił element poza stroną). W przeciwnym razie odpowiada ona efektowi wybranemu przez element docelowy ("move", "copy", "link").
Przeciąganie na urządzeniach dotykowych
Natywne przeciąganie i upuszczanie jest projektowane przede wszystkim z myślą o komputerach. Na urządzeniach dotykowych API działa bardzo słabo bez polyfillu lub rozwiązania opartego na Pointer Events. W interfejsach zmiany kolejności elementów przeznaczonych na urządzenia mobilne preferuj biblioteki takie jak SortableJS lub dnd-kit, które abstrahują różnice między oboma modelami zdarzeń.
Kwestie dostępności
Natywne przeciąganie i upuszczanie nie jest dostępne z klawiatury — użytkownicy korzystający wyłącznie z klawiatury nie mogą zmieniać kolejności elementów. Zawsze zapewniaj alternatywę: obsługę klawiszy strzałek, przyciski przenoszenia w górę i w dół albo okno dialogowe zmiany kolejności sterowane za pomocą aria. Przeciąganie i upuszczanie powinno rozszerzać możliwości interfejsu, a nie ich zastępować.
Wyłączanie ustawień domyślnych przeglądarki
Zaznaczanie tekstu wewnątrz przeciągalnych elementów może zakłócać przeciąganie. Zastosuj CSS user-select: none oraz -webkit-user-drag: element do elementu źródłowego, aby przeglądarka przeciągała element zamiast zaznaczać znajdujący się w nim tekst.
Sprawdź swoją wiedzę
Dlaczego zazwyczaj trzeba podłączyć listener dragstart, mimo że sam atrybut draggable="true" sprawia, że element można przeciągać?
Podsumowanie
Oznacz źródła za pomocą draggable="true" i użyj dragstart do wypełnienia dataTransfer, ustawienia effectAllowed oraz opcjonalnie niestandardowego obrazu przeciągania. Połącz to ze zdarzeniem dragend, aby wyczyścić style. Zapewnij alternatywy klawiaturowe na potrzeby dostępności i rozważ użycie polyfillu na urządzeniach dotykowych.
Często zadawane pytania
Czy lekcja „Atrybut draggable i zdarzenie dragstart” jest bezpłatna?
Tak — pełny tekst „Atrybut draggable i zdarzenie dragstart” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu HTML Academy, przejdź na CoddyKit PRO. Kurs HTML Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Atrybut draggable i zdarzenie dragstart”?
Umożliwianie przeciągania elementów i reagowanie na dragstart Ćwiczysz HTML Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć HTML Academy?
Nie wymagamy żadnego doświadczenia. HTML Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Atrybut draggable i zdarzenie dragstart”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji HTML Academy?
Tak. Każda lekcja HTML Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Atrybut draggable i zdarzenie dragstart
- Zdarzenia dragover i drop
- Obiekt dataTransfer
- Praktyczna lista sortowana metodą przeciągnij i upuść