JS30. Задание 22 Follow Along Link Highlighter
Демо https://js3022.github.io/
Код https://github.com/js3022/js3022.github.io
Подсветка ссылок, которая следует вслед за курсором. Небольшое вступительное задание, одно из нескольких, результатом которых будет реализация выпадающего меню.
Сначала нам нужно получить доступ ко всем ссылкам на странице и слушатель события, когда курсор находится над ссылкой.
var triggers = document.querySelectorAll("a");
var highlight = document.createElement("span");
highlight.classList.add("highlight");
document.body.appendChild(highlight);
function highlightLink(e) {
console.log("Highlight", e)
}
triggers.forEach(a => a.addEventListener("mouseenter", highlightLink))
Теперь нам нужно определить размеры ссылки: её ширину и высоту, а также положение на странице. Для этого используем метод .getBoundingClientRect()
function highlightLink() {
var link = this.getBoundingClientRect();
console.log(link)
}
Используя эту информацию, мы можем изменить код, чтобы выделение соответствовало размерам и расположению ссылки:
function highlightLink() {
var link = this.getBoundingClientRect();
console.log(link)
highlight.style.width = `${link.width}px`;
highlight.style.height = `${link.height}px`;
highlight.style.transform = `translate(${link.left}px, ${link.top}px)`;
}
Последний штрих - учитывать прокрутку страницы при определении местоположения ссылки. Для этого определяем window.scrollY и прибавляем его к величине link.top. Заодно определим на всякий случай window.scrollХ и прибавляем его к величине link.left (мало ли. вдруг у страницы есть горизонтальная полоса прокрутки)
highlight.style.transform = `translate(${link.left + window.scrollX}px, ${link.top + window.scrollY}px)`;
Код полностью:
var triggers = document.querySelectorAll("a");
var highlight = document.createElement("span");
highlight.classList.add("highlight");
document.body.appendChild(highlight);
function highlightLink() {
var link = this.getBoundingClientRect();
console.log(link)
highlight.style.width = `${link.width}px`;
highlight.style.height = `${link.height}px`;
highlight.style.transform = `translate(${link.left + window.scrollX}px, ${link.top + window.scrollY}px)`;
}
triggers.forEach(a => a.addEventListener("mouseenter", highlightLink));
Всё работает, всё хорошо. Единственное сомнение - зачем это было нужно, если почти такого же эффекта можно было добиться гораздо проще.
Достаточно было добавить в css свойство
a:hover {
transition: all 0.2s;
background: #64BEC2;
background: linear-gradient(to bottom, #A5DEE1 5%, #8FDDE1 20%, #64BEC2 30%, #207A7E 50%);
}
Здесь похожий эффект: https://codepen.io/kathykato/pen/RgZrZM
А здесь - подборки подобных эффектов. Некоторые интересные: http://css-live.ru/cssjssvg-s-podvypodvertom/ezhenedelnaya-podborka-krasivyx-effektov-nacsssvgjs-46.html