next/font在除Modal组件外正常,该组件字体失效问题求助
next/font
基于Next.js+TypeScript+Tailwind CSS开发
这是我首次使用新的next/font包,按照Next.js教程完成配置,过程十分简单。我同时使用了Google字体Inter与名为App Takeoff的本地自定义字体,并通过Tailwind CSS将Inter关联到font-sans,App Takeoff关联到font-display。
仅一处组件出现异常
经过多文件测试,我发现这两款字体在所有组件中均正常工作,唯独Modal组件内失效。(底部的「有用更新」说明了问题原因)
示例
index.tsx

通过index.tsx调用的modal.tsx

可见,字体在模态框外显示正常,但进入模态框后就失效了。
相关代码如下:
// app.tsx import '@/styles/globals.css' import type { AppProps } from 'next/app' import { Inter } from 'next/font/google' const inter = Inter({ subsets: ['latin'], variable: '--font-inter' }) import localFont from 'next/font/local' const appTakeoff = localFont({ src: [ { path: '../fonts/app-takeoff/regular.otf', weight: '400', style: 'normal' }, { path: '../fonts/app-takeoff/regular.eot', weight: '400', style: 'normal' }, { path: '../fonts/app-takeoff/regular.woff2', weight: '400', style: 'normal' }, { path: '../fonts/app-takeoff/regular.woff', weight: '400', style: 'normal' }, { path: '../fonts/app-takeoff/regular.ttf', weight: '400', style: 'normal' } ], variable: '--font-app-takeoff' }) const App = ({ Component, pageProps }: AppProps) => { return ( <div className={`${inter.variable} font-sans ${appTakeoff.variable}`}> <Component {...pageProps} /> </div> ) } export default App
// modal.tsx import type { FunctionComponent } from 'react' import type { Modal as ModalProps } from '@/typings/components' import React, { useState } from 'react' import { Fragment } from 'react' import { Transition, Dialog } from '@headlessui/react' const Modal: FunctionComponent<ModalProps> = ({ trigger, place = 'bottom', className, addClass, children }) => { const [isOpen, setIsOpen] = useState(false), openModal = () => setIsOpen(true), closeModal = () => setIsOpen(false) const Trigger = () => React.cloneElement(trigger, { onClick: openModal }) const enterFrom = place === 'center' ? '-translate-y-[calc(50%-12rem)]' : 'translate-y-full sm:-translate-y-[calc(50%-12rem)]' const mainPosition = place === 'center' ? '-translate-y-1/2' : 'translate-y-0 sm:-translate-y-1/2' const leaveTo = place === 'center' ? '-translate-y-[calc(50%+8rem)]' : 'translate-y-full sm:-translate-y-[calc(50%+8rem)]' return ( <> <Trigger /> <Dialog open={isOpen} onClose={closeModal} className='z-50'> {/* Backdrop */} <div className='fixed inset-0 bg-zinc-200/50 dark:bg-zinc-900/50 backdrop-blur-sm cursor-pointer' aria-hidden='true' /> <Dialog.Panel className={` ${className || ` fixed left-1/2 ${ place === 'center' ? 'top-1/2 rounded-2xl' : 'bottom-0 sm:bottom-auto sm:top-1/2 rounded-t-2xl xs:rounded-b-2xl' } bg-zinc-50 dark:bg-zinc-900 w-min -translate-x-1/2 overflow-hidden px-2 xs:px-6 shadow-3xl shadow-primary-400/10 `} ${addClass || ''} `} > {children} </Dialog.Panel> <button onClick={closeModal} className=' fixed top-4 right-4 bg-primary-600 hover:bg-primary-400 rounded-full h-7 w-7 desktop:hover:w-20 overflow-x-hidden transition-[background-color_width] duration-300 ease-in-out group/button ' aria-role='button' > Close </button> </Dialog> </> ) } export default Modal
有用更新
感谢Jonathan Wieben解释了问题原因。问题源于样式作用域以及Headless UI对React Portal组件的使用。若有人能提供修改Portal渲染位置或扩展样式作用域的方法,将十分感激。Jonathan Wieben提出的方案经测试不适配Tailwind CSS。
内容的提问来源于stack exchange,提问作者andrilla
相关产品推荐
相关产品推荐

