无法使NextJS Image组件正确转换高度

7kjnsjlb  于 2023-06-22  发布在  其他
关注(0)|答案(1)|浏览(172)

我有一个页面,当用户向下滚动时,标题栏会改变大小(从120 px变为70 px)。我添加了这个过渡作为Tailwind类之间的交换,并添加了一个高度过渡,效果很好。我现在试图让网站的标志,这是在头部,以调整大小与它。我尝试使用NextJS Image组件,但似乎无法让它工作。

export default function Header() {
    const baseClasses = classNames(
        "transition-[height] border-b border-b-black fixed top-0 left-0 w-full z-[100] bg-header-gray flex justify-center shadow-[0_1px_20px_1px_#777] px-4 py-2"
    );
    const imgClasses = classNames("transition-[height]");
    const stdClasses = `${baseClasses} h-[70px]`,
        fullClasses = `${baseClasses} h-[120px]`,
        stdImageHeight = 53,
        fullImageHeight = 100;

    const pathname = usePathname();
    const [classes, setClasses] = useState<string>(
        pathname !== "/" ? stdClasses : fullClasses
    );
    const [imgHeight, setImgHeight] = useState<number>(
        pathname !== "/" ? stdImageHeight : fullImageHeight
    );

    const updateClasses = () => {
        if (window.scrollY <= 50) {
            setClasses(fullClasses);
            setImgHeight(fullImageHeight);
        } else {
            setClasses(stdClasses);
            setImgHeight(stdImageHeight);
        }
    };

    useEffect(() => {
        if (pathname === "/") {
            updateClasses();
            document.addEventListener("scroll", updateClasses);
        } else {
            setClasses(stdClasses);
            document.removeEventListener("scroll", updateClasses);
        }
    }, [pathname]);

    return (
        <header id="site_header" className={classes}>
            <div className="w-full max-w-screen-xl">
                <div className={`h-[${imgHeight}px] relative`}>
                    <Image
                        className={imgClasses}
                        src={gp_logo}
                        alt="Gamers' Plane Logo"
                        fill={true}
                    />
                </div>
            </div>
        </header>
    );
}

我尝试将imgHeight设置为样式并作为Tailwind类(h-[${imgHeight}px])。我还尝试为Image fill={true}指定一个div父对象,但由于div父对象占据了页面的全部宽度,所以它被压扁了。我还在div上尝试了width: fit-content,但因为图像是内容,所以它保持完整大小。
我想有图像计算其各自的高度/宽度的基础上可用的空间。我可以用Image组件来做这件事吗?还是应该回到img标签?

lh80um4z

lh80um4z1#

这实际上是一个顺风问题。Tailwinds不能在运行时使用模板文本插入自定义类名。您正在执行h-[${imgHeight}px]
如果你只是改变你的变量的高度为完整的顺风类,并使用这些在您的div,一切都应该工作。我把它送到了本地。

const  stdImageHeight = "h-[53px]",
        fullImageHeight = "h-[100px]";

<div className={`${imgHeight} relative`}>

一旦您调整了自定义类,有几种方法可以解决大小调整问题。传统上,我们会设置宽度,而不是高度。我的建议是这样的。

<div className="w-full max-w-screen-xl">
 <div className={`${imgWidth} relative`}>
  <Image 
     className={imgClasses}                   
     src="https://placekitten.com/200/100"
     alt="Gamers' Plane Logo"
     width={200}
     height={100}
   />
 </div>
</div>

它不使用填充,而是定义了图像的较大尺寸并具有变化的宽度。请务必保留relative。这应该可以很好地扩展。
或者,如果你想使用填充,你可以只设置一个imgHeight和imgWidth使用您的当前进程。

<div className="w-full max-w-screen-xl">
  <div className={`${imgWidth} ${imgHeight} relative`}>
   <Image
     className={imgClasses}
     src="https://placekitten.com/400/200"
     alt="Gamers' Plane Logo"
     fill={true}
   />
 </div>
</div>

相关问题