Создание ползунка для горизонтальной панели навигации, который «скользит» между опциями.CSS

Разбираемся в CSS
Ответить
Anonymous
 Создание ползунка для горизонтальной панели навигации, который «скользит» между опциями.

Сообщение Anonymous »

Я создаю HTML-страницу с панелью навигации вверху, по центру и по горизонтали.
Изображение

Идея состоит в том, чтобы иметь «скользящую» панель выбора, а не границу, которая появляется только на выбранном или наведенном элементе на панели навигации. У меня это работает на странице разработки: например, если я прокручиваю указатель мыши до «кабаре», граница вокруг элемента «разработка» правильно «скользит» вправо от страницы, в конечном итоге обтекая «кабаре».
Изображение

Выше вы можете увидеть мои снимки экрана. на полпути после того, как я навел указатель мыши на «кабаре».
Проблема, с которой я столкнулся, связана с другими страницами, которые по причине, которая сбивала меня с толку в течение нескольких часов, не работает как страница разработки. Вот пример:
Изображение

Как видите, когда я Если вы решите перейти на эту страницу, ползунок не инициализируется правильно, вместо этого он загружается в виде вертикальной линии в середине панели навигации и не отображает никакого дальнейшего поведения, например, если я попытаюсь навести указатель мыши на другой элемент на панели навигации.< /p>
Но почему! Я использовал console.log в своем JS, чтобы гарантировать передачу правильной активной ссылки при выборе опции, и я вижу это при проверке консоли во время выполнения.
Вот то, что я считаю релевантным HTML, CSS и JS:

Код: Выделить всё

// Add event listeners for option clicks
const options = document.querySelectorAll('.option');
let selectedOption = null;

options.forEach((option) => {
option.addEventListener('click', () => {
// Deselect previous option
if (selectedOption) {
selectedOption.classList.remove('selected');
}

// Select the clicked option
option.classList.add('selected');
selectedOption = option;

// Get page ID from data attribute in HTML
const pageId = option.getAttribute('data-page');
const activeLinkId = option.getAttribute('data-active-link');
const activeLink = document.getElementById(activeLinkId);
navigateToPage(pageId, activeLink);
});
});

// PAGE NAVIGATION
function navigateToPage(pageId, activeLink) {
const portfolioPageContent = document.getElementById('portfolio-page').children; // children so not background, goal to swipe text elements up
const selectedPage = document.getElementById(pageId);

if (!selectedPage) {
console.error(`Page with ID "${pageId}" not found.`);
return;
}

// Update navbar links for active state
const links = document.querySelectorAll('.navbar a');
links.forEach(link => link.classList.remove('active'));  // Remove 'active' from all links
if (activeLink) {
activeLink.classList.add('active');  // Add 'active' to the selected link
moveSlider(activeLink); // Move slider to active link
}

// Swipe the portfolio page content up, not the background
gsap.to(portfolioPageContent, {
y: '-200%',
opacity: 0,
duration: 0.8,
ease: 'power2.inOut',
onComplete: () => {

if (selectedPage) {
selectedPage.style.display = 'block';
gsap.to(selectedPage, { opacity: 1, duration: 0});

} else {
console.error(`Page with ID "${pageId}" not found.`);
}

// Fade in new page first, then hide old page
gsap.to(selectedPage, { opacity: 1, duration: 1 }, "fade-in")
.then(() => {
document.getElementById('portfolio-page').style.visibility = 'hidden';
});

console.log(activeLink);
if (activeLink) {
setTimeout(() => {
moveSlider(activeLink);
}, 100);
}

// Add hover-over effect to move the slider
links.forEach(link => {
link.addEventListener('mouseenter', () => moveSlider(link));
});

// Keep slider on the active link when not hovering
navbar.addEventListener('mouseleave', () => {
if (activeLink) moveSlider(activeLink);
});

},
});
}

const navbar = document.querySelector('.navbar');
const slider = document.querySelector('.slider');
const links = document.querySelectorAll('.navbar a');
console.log(links);

// Function to move the slider
function moveSlider(link) {
const rect = link.getBoundingClientRect(); // Get the link's position
const navbarRect = navbar.getBoundingClientRect(); // Get navbar's position

const sliderWidthAdjustment = 1.5; // Shrink the width slightly
const sliderLeftAdjustment = -1.5; // Offset to the left slightly

slider.style.width = `${rect.width - sliderWidthAdjustment}px`; // Adjust width
slider.style.left = `${rect.left - navbarRect.left + sliderLeftAdjustment}px`;  // Adjust position

}

Код: Выделить всё

  #page-development,
#page-messagetomountains,
#page-cabaret {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
color: #202020;
text-align: center;
z-index: 10;
opacity: 0;
transition: opacity 1s ease-in-out;
/* text-shadow: 0.001rem 0 0.1rem #c8fcfc; */
text-shadow: none;
font-family: "Lucida Console", "Courier New", monospace;
}

#page-development {
background: radial-gradient(circle, #f4d4b4 0%, #e9ceb3 100%);
}

#page-messagetomountains {
/* background: radial-gradient(circle, #F5C7C7 0%, #e0bdbd 100%); */
background: radial-gradient(circle, #94d0e8 0%, #82c1db 100%);
color: white ;
}

#page-cabaret {
background: radial-gradient(circle, #8E98F9 0%, #868ed6 100%);
}

.navbar {
position: relative;
display: flex;
justify-content: center;
/* align-items: center;
flex-wrap: wrap; */
background-color: #82c1db;
padding: 10px 20px;
}

.navbar a {
position: relative;
color: white;
text-decoration: none;
padding: 8px 20px;
margin: 0 150px;
border: 2px solid transparent;
border-radius: 20px;
z-index: 1; /* links above slider */
transition: color 0.3s, transform 0.3s;
}

.navbar a:hover {
color: #eeffff;
}

.navbar a.active {
color: #ffffff;
}

/* moving border */
.slider {
position: absolute;
height: calc(100% - 23px); /* try match link padding */
border: 2px solid #ffffff;
border-radius: 20px;
background: none;
transition: all 0.4s ease;
z-index: 0; /* sits behind the links */
}

Код: Выделить всё



[url=#development]development[/url]
[url=#messagetomountains]messagetomountains[/url]
[url=#cabaret]the cabaret[/url]

dev page
this is the development page.




[url=#development]development[/url]
[url=#messagetomountains]messagetomountains[/url]
[url=#cabaret]the cabaret[/url]

messagetomountains page
this is the messagetomountains page.




[url=#development]development[/url]
[url=#messagetomountains]messagetomountains[/url]
[url=#cabaret]the cabaret[/url]

cabaret page
welcome to the cabaret.


Чтобы дать контекст, есть центральная страница портфолио, на которой размещены 3 варианта. При нажатии на опцию страница портфолио исчезает, проведя пальцем по тексту вверх на странице портфолио, а затем исчезает содержимое одной из опций (разработка страницы, страница-кабаре и т. д.). Только при отображении «разработки страницы» слайдер ведет себя правильно, а в двух других случаях — нет.
Что я пробовал?
Я пробовал переписать функцию moveSlider и добился успеха в изменении способа работы слайдера, но он по-прежнему будет работать только для страницы разработки. Независимо от того, какое поведение я пытаюсь выполнить. Я попытался переработать функцию навигацииToPage так, чтобы я пытался инициализировать только панель навигации внутри нее, и это тоже не сработало. Мой код во время этого процесса превратился в беспорядок, к сожалению, из-за того, что я пытался включить этот параметр activeLink, который раньше не был частью кода.
Это произошло Я впервые использовал GSAP, а также имел страницу, которая «появляется» и «затухает» другие страницы поверх нее, а не просто переходит к определенной странице параметров при нажатии на параметр, например. /разработка. Я думаю, что пытаясь сделать это таким образом, я слишком усложнил ситуацию и сделал переход между страницами довольно неудобным.
Я был бы очень признателен за любые рекомендации о том, как исправить ползунок таким образом, чтобы он ведет себя так, как задумано, и так же, как в настоящее время на странице разработки, на всех других страницах, где он присутствует. Еще раз повторим, что выбранная страница будет иметь рамку, и перетаскивание мыши на другой параметр «сдвинет» эту границу к этому параметру. Если ее не щелкнуть и утащить мышь, граница автоматически вернется в исходное положение, остановившись вокруг параметра выбранной в данный момент страницы.
Если ничего другого, мне действительно любопытно. что касается почему это работает только на странице разработки. Меня это так беспокоит! Я предполагаю, что это как-то связано с тем, что это первая страница, указанная в моем HTML… но почему? Большое спасибо за любую помощь :D

Подробнее здесь: https://stackoverflow.com/questions/793 ... en-options
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «CSS»