在Bootstrap中使用Next.js加载google字体

cigdeys3  于 2023-03-29  发布在  Bootstrap
关注(0)|答案(1)|浏览(175)

我想加载谷歌字体如下所述:https://nextjs.org/docs/basic-features/font-optimization
如果我按照文档并像这样加载,一切都很好:

import { Open_Sans } from '@next/font/google';

const openSans = Open_Sans ({
    subsets: ['latin']
})

function MyApp({ Component, pageProps }) {
    return (
        <main className={openSans.className}>
            <Component {...pageProps} />
        </main>
    )
}

export default MyApp

这个版本正在加载字体并生成一个类名,类似于这样:

.__className_d8c39e {
    font-family: '__Open_Sans_d8c39e', '__Open_Sans_Fallback_d8c39e';
    font-style: normal;
}

但是,如果可能的话,我想使用Bootstrap CSS变量,正如我在自定义_variables.scss中使用$font-family-sans-serif: "Open Sans";定义的那样,因此Bootstrap将在前端呈现:root{--bs-font-sans-serif: "Open Sans";}
我也知道我可以在next中使用变量,比如:

const openSans = Open_Sans ({
    subsets: ['latin'],
    variable: '--bs-font-sans-serif'
})

function MyApp({ Component, pageProps }) {
    return (
        <main className={openSans.variable}>
            <Component {...pageProps} />
        </main>
    )
}

但这只会用给定的变量名创建另一个类名:

.__variable_d8c39e {
    --bs-font-sans-serif: '__Open_Sans_d8c39e', '__Open_Sans_Fallback_d8c39e';
}

我不能不添加className,但仍然在Bootstrap源文件中使用优化的google字体吗?

62o28rlo

62o28rlo1#

我也遇到了同样的问题。我使用了一个CSS变量:

const openSans = Open_Sans ({
    subsets: ['latin'],
    variable: '--body-font'
})

function MyApp({ Component, pageProps }) {
    return (
        <main className={openSans.variable}>
            <Component {...pageProps} />
        </main>
    )
}

主容器现在有了变量--body-font,它引用了字体家族。然后我尝试在Bootstrap中使用它:

$font-family-sans-serif: var(--body-font);

不幸的是,这不起作用,因为Bootstrap --bs-body-font-family的CSS变量已经在:root中定义,而 next/font 的CSS变量只在主容器中分配。

我现在通过在主容器中定义属性font-family(CSS变量在这里可用)来解决整个问题:

main {
    font-family: var(--body-font);
}

因此,我只覆盖 Bootstrap 样式。不幸的是,似乎没有其他解决方案。

相关问题