@下一个/font
将Next.js与TypeScript和Tailwind CSS结合使用
这是我第一次使用新的@next/font
包。我遵循了Next.js的教程,它很容易设置。我使用Inter和一个名为App Takeoff的自定义本地字体。为了实际使用这两种字体,我使用Tailwind CSS,其中Inter连接到font-sans
,App Takeoff连接到font-display
。
除了一个地方,一切都正常
我已经在文件之间做了大量的测试,由于某种原因,除了我的Modal
组件之外,这两种字体在任何地方都可以工作。
示例
- 索引. tsx**
- 模态. tsx通过索引. 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
我希望这些信息能有所帮助。如果有任何其他的信息需要了解,请告诉我。
1条答案
按热度按时间58wvjzkj1#
您正在使用的
Dialog
组件在门户中呈现(请参阅此处)。您通常希望将它们呈现为React应用程序最根节点的兄弟节点,这样您就可以依靠自然的DOM排序来确保它们的内容呈现在现有应用程序UI之上。
您可以通过检查浏览器中的模态DOM元素来确认这一点,并查看它是否确实位于
App
组件的div
Package 器之外(我怀疑是这样)。如果是这样,下面是模态内容不以预期字体呈现的原因:它在定义字体的组件外部呈现。
为了解决这个问题,你可以在更高的层次上定义你的字体,例如,在你的头脑中,如下所述:下一个文件。