Navbar元素的动态颜色变化NextJS

de90aj5v  于 2023-10-18  发布在  其他
关注(0)|答案(1)|浏览(186)

这是一个酒店网站导航栏的代码,我想让导航栏元素的颜色根据固定导航栏所在的背景动态变化,即。例如,如果第一个屏幕是暗的,元素采用白色颜色#fff,我们向下滚动,或者切换到另一个页面(/lodge),其中背景已经是白色,导航栏元素应该将颜色更改为更暗的#313131,以免与背景颜色合并。
希望对您有所帮助,我想知道这样的功能如何才能实现?也许有一些方法可以根据导航栏元素后面的背景反转颜色?

Codesandbox.io

  1. 'use client';
  2. import Image from "next/image";
  3. import Link from "next/link";
  4. const Navbar = () => {
  5. return (
  6. <div className="fixed w-full backdrop-blur-sm z-10 lg:px-[100px] md:px-[70px] sm:px-[35px] xs:px-[15px]">
  7. <div className="border-b-[2px] border-[#313131]">
  8. <div className="lg:pb-5 lg:pt-7 md:pb-5 md:pt-6 sm:pt-5 sm:pb-4 xs:pt-10 xs:pb-[10px]">
  9. <div className="flex flex-row items-center">
  10. {/* logo */}
  11. <div className="relative lg:w-[146px] lg:h-[64px] md:w-[132px] md:h-[58px] sm:w-[90px] sm:h-[50px] xs:w-[68px] xs:h-[30px]">
  12. <Link href="/">
  13. <Image
  14. src="/images/navbar/logo-b.svg"
  15. alt="logo-b"
  16. layout="fill"
  17. />
  18. </Link>
  19. </div>
  20. {/* lodge */}
  21. <div className="lg:text-[28px] md:text-[24px] lg:block md:block sm:hidden xs:hidden font-medium leading-normal uppercase text-[#313131] lg:pl-[610px] md:pl-[284px] lg:pr-[80px] md:pr-[80px]">
  22. <Link href="/lodge">
  23. LODGE
  24. </Link>
  25. </div>
  26. {/* our blog */}
  27. <div className="lg:text-[28px] md:text-[24px] md:block sm:hidden xs:hidden font-medium leading-normal uppercase text-[#313131]">
  28. <Link href="/#ourblog">
  29. OUR BLOG
  30. </Link>
  31. </div>
  32. {/* num */}
  33. <div className="flex flex-row items-center lg:gap-5 md:gap-5 sm:gap-3 lg:pl-[100px] md:pl-[80px] sm:pl-[162px]">
  34. <div className="relative lg:w-[24px] lg:h-[24px] md:w-[24px] md:h-[24px] sm:w-[20px] sm:h-[20px] lg:block md:block sm:block xs:hidden">
  35. <Image
  36. src="/images/navbar/tel-b.svg"
  37. alt="tel"
  38. layout="fill"
  39. />
  40. </div>
  41. <div className="lg:text-[28px] md:text-[24px] sm:text-[20px] font-medium leading-normal uppercase text-[#313131] lg:block md:block sm:block xs:hidden">
  42. +57 (316) 893-1653
  43. </div>
  44. </div>
  45. {/* lang switch */}
  46. <div className="lg:text-[28px] md:text-[24px] sm:text-[20px] font-medium leading-normal uppercase text-[#313131] lg:pl-[100px] md:pl-[132px] sm:pl-[50px] xs:pl-[139px]">
  47. <div className="flex flex-row items-center">
  48. <div className="cursor-pointer underline">
  49. EN
  50. </div>
  51. <div className="lg:px-4 md:px-[15px] sm:px-[10px] xs:px-[10px] cursor-default">
  52. |
  53. </div>
  54. <div className="cursor-pointer">
  55. ES
  56. </div>
  57. </div>
  58. </div>
  59. <div className="lg:hidden md:hidden sm:block xs:block sm:pl-[60px] xs:pl-[30px]">
  60. <Image
  61. className="cursor-pointer"
  62. src="/images/navbar/burger_menu_b.svg"
  63. alt="burger menu"
  64. width={24}
  65. height={24}
  66. />
  67. {/* <BurgerMenu onClose={() => setShowBurgerMenu(false)} /> */}
  68. </div>
  69. </div>
  70. </div>
  71. </div>
  72. </div>
  73. )
  74. }
  75. export default Navbar;

我试着通过滚动条上的useRouterwindow.addEventListener来实现这一点(滚动条上的颜色上下变化一定的px),但是这种方法有延迟(当切换到另一个页面时,颜色不会立即更新,而是在滚动操作之后),我意识到这不是最好的方法,因为它也增加了自适应设计的工作量。

k5ifujac

k5ifujac1#

要根据背景动态更改导航栏元素的颜色,可以使用Intersection Observer API,类似于:

  • 创建一个函数来处理相交观察点
  1. const handleIntersection = (entries) => {
  2. entries.forEach((entry) => {
  3. if (entry.isIntersecting) {
  4. // Set the Navbar color for dark background
  5. // Set the color to #fff for example
  6. } else {
  7. // Set the Navbar color for light background
  8. // Set the color to #313131 for example
  9. }
  10. });
  11. };
  • 初始化交点观察点
  1. useEffect(() => {
  2. const observer = new IntersectionObserver(handleIntersection, {
  3. threshold: 0.5, // Adjust as needed
  4. });
  5. const targetElement = document.getElementById("targetElementId"); // Replace with your target element's ID
  6. if (targetElement) {
  7. observer.observe(targetElement);
  8. }
  9. return () => observer.disconnect(); // Cleanup observer on component unmount
  10. }, []);
  • 在JSX中,将ID应用于其背景决定导航栏颜色的元素。举例来说:
  1. <div id="targetElementId" className="...">Content with changing background</div>
展开查看全部

相关问题