選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

TopNavigation.js 2.9KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. document.addEventListener('DOMContentLoaded', () => {
  2. for (const dropdown of document.querySelectorAll('.fi-topbar-dropdown, .fi-topbar-dropdown .fi-dropdown-trigger')) {
  3. const observer = new MutationObserver((mutations) => {
  4. for (const { attributeName } of mutations) {
  5. if (attributeName === 'aria-expanded') {
  6. updateBorder(dropdown);
  7. }
  8. }
  9. });
  10. observer.observe(dropdown, { attributes: true });
  11. }
  12. document.querySelectorAll('.fi-topbar-item > a').forEach(item => {
  13. item.addEventListener('mouseenter', () => updateBorderOnHover(true, item));
  14. item.addEventListener('mouseleave', () => updateBorderOnHover(false, item));
  15. });
  16. insertBgDiv();
  17. handleTopbarAndSidebarHover();
  18. handleScroll();
  19. });
  20. const updateBorder = (dropdown) => {
  21. const activeItem = document.querySelector('.fi-topbar-item-active > *');
  22. const hoveredItem = dropdown.querySelector('.fi-topbar-item > *');
  23. if (activeItem && hoveredItem !== activeItem) {
  24. activeItem.style.borderBottomColor = dropdown.getAttribute('aria-expanded') === 'true' ? 'transparent' : '';
  25. }
  26. };
  27. const updateBorderOnHover = (isHovered, hoveredItem) => {
  28. const activeItem = document.querySelector('.fi-topbar-item-active > *');
  29. if (activeItem && hoveredItem !== activeItem) {
  30. activeItem.style.borderBottomColor = isHovered ? 'transparent' : '';
  31. }
  32. };
  33. const insertBgDiv = () => {
  34. document.querySelectorAll('a.fi-topbar-dropdown-list-item').forEach(anchor => {
  35. anchor.insertAdjacentHTML('beforeend', '<div class="bg"></div>');
  36. });
  37. };
  38. const handleTopbarAndSidebarHover = () => {
  39. const topbarNav = document.querySelector('.fi-topbar > nav');
  40. const sidebarHeader = document.querySelector('.fi-sidebar-header');
  41. const addHoveredClass = () => {
  42. topbarNav.classList.add('topbar-hovered');
  43. sidebarHeader.classList.add('topbar-hovered');
  44. };
  45. const removeHoveredClass = () => {
  46. topbarNav.classList.remove('topbar-hovered');
  47. sidebarHeader.classList.remove('topbar-hovered');
  48. };
  49. topbarNav.addEventListener('mouseenter', addHoveredClass);
  50. sidebarHeader.addEventListener('mouseenter', addHoveredClass);
  51. topbarNav.addEventListener('mouseleave', removeHoveredClass);
  52. sidebarHeader.addEventListener('mouseleave', removeHoveredClass);
  53. };
  54. const handleScroll = () => {
  55. const topbarNav = document.querySelector('.fi-topbar > nav');
  56. const sidebarHeader = document.querySelector('.fi-sidebar-header');
  57. window.addEventListener('scroll', () => {
  58. if (window.scrollY > 0) {
  59. topbarNav.classList.add('topbar-scrolled');
  60. sidebarHeader.classList.add('topbar-scrolled');
  61. } else {
  62. topbarNav.classList.remove('topbar-scrolled');
  63. sidebarHeader.classList.remove('topbar-scrolled');
  64. }
  65. });
  66. }