直接修改 body 的样式(最简单、最常用)

这是最直接的方法,适用于全局字体更改,它会将整个页面的默认字体设置为新的字体。

核心思路: 获取 <body> 元素,然后直接修改其 style.fontFamily 属性。

代码示例

// 1. 定义你想要使用的字体
// 注意:这里使用的是 web 安全字体,确保在大多数系统上都能显示
const newFontFamily = "'Helvetica Neue', Helvetica, Arial, sans-serif";
// 2. 获取 body 元素
const bodyElement = document.body;
// 3. 修改 body 的 font-family
bodyElement.style.fontFamily = newFontFamily;
// 如果你想把它打印到控制台确认一下
console.log(`字体已更改为: ${newFontFamily}`);

如何使用

将这段 JavaScript 代码放在你的 HTML 文件的 <script> 标签内即可,通常建议放在 </body> 标签之前,以确保 DOM 已经完全加载。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">改变字体示例</title>
    <style>
        body {
            font-size: 18px;
            line-height: 1.6;
        }
        h1 {
            color: #333;
        }
        p {
            color: #555;
        }
    </style>
</head>
<body>
    <h1>你好,世界!</h1>
    <p>这是一段示例文本,用于展示字体变化,你可以看到,这段文字的字体已经改变了。</p>
    <script>
        // --- 在这里插入上面的 JavaScript 代码 ---
        const newFontFamily = "'Helvetica Neue', Helvetica, Arial, sans-serif";
        const bodyElement = document.body;
        bodyElement.style.fontFamily = newFontFamily;
        console.log(`字体已更改为: ${newFontFamily}`);
    </script>
</body>
</html>

通过 CSS 类切换(更灵活、更推荐)

如果你想让用户可以选择不同的字体,或者在不同场景下切换字体,使用 CSS 类是更好的方式。

核心思路:

  1. 在 CSS 中预先定义好多个字体样式类(.font-serif, .font-sans-serif)。
  2. 在 JavaScript 中,通过添加或移除这些类来改变元素的样式。

步骤 1:在 CSS 中定义字体类

/* 默认字体,或者 body 的基础样式 */
body {
    font-size: 18px;
    transition: font-family 0.3s ease; /* (可选) 添加平滑过渡效果 */
}
/* 衬线字体,适合阅读长文 */
.font-serif {
    font-family: 'Georgia', 'Times New Roman', serif;
}
/* 无衬线字体,现代感强 */
.font-sans-serif {
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Helvetica Neue', Arial, sans-serif;
}
/* 等宽字体,适合代码 */
.font-mono {
    font-family: 'Courier New', Courier, monospace;
}

步骤 2:在 JavaScript 中切换类

// 假设我们有一个按钮,点击它就切换到衬线字体
const serifButton = document.getElementById('serif-button');
serifButton.addEventListener('click', function() {
    // 移除其他字体类(如果需要)
    document.body.classList.remove('font-sans-serif', 'font-mono');
    // 添加新的字体类
    document.body.classList.add('font-serif');
});
// 同样,可以为其他按钮添加事件监听器
const sansSerifButton = document.getElementById('sans-serif-button');
sansSerifButton.addEventListener('click', function() {
    document.body.classList.remove('font-serif', 'font-mono');
    document.body.classList.add('font-sans-serif');
});
const monoButton = document.getElementById('mono-button');
monoButton.addEventListener('click', function() {
    document.body.classList.remove('font-serif', 'font-sans-serif');
    document.body.classList.add('font-mono');
});

完整示例

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">字体切换示例</title>
    <style>
        body { font-size: 18px; line-height: 1.6; transition: font-family 0.3s ease; }
        h1 { margin-bottom: 20px; }
        .controls { margin-bottom: 20px; }
        button { margin-right: 10px; padding: 8px 12px; cursor: pointer; }
    </style>
    <!-- 在这里引入上面的 CSS 类定义 -->
    <style>
        .font-serif { font-family: 'Georgia', 'Times New Roman', serif; }
        .font-sans-serif { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; }
        .font-mono { font-family: 'Courier New', Courier, monospace; }
    </style>
</head>
<body>
    <h1>字体切换演示</h1>
    <div class="controls">
        <button id="serif-button">衬线字体</button>
        <button id="sans-serif-button">无衬线字体</button>
        <button id="mono-button">等宽字体</button>
    </div>
    <p>
        这是一段示例文本,点击上方的按钮,可以实时改变这段文字的字体。
        这种方法比直接修改 style 更加灵活,也更容易维护。
    </p>
    <!-- 在这里引入上面的 JavaScript 代码 -->
    <script>
        document.getElementById('serif-button').addEventListener('click', () => {
            document.body.className = 'font-serif'; // 直接设置类,覆盖其他
        });
        document.getElementById('sans-serif-button').addEventListener('click', () => {
            document.body.className = 'font-sans-serif';
        });
        document.getElementById('mono-button').addEventListener('click', () => {
            document.body.className = 'font-mono';
        });
    </script>
</body>
</html>

使用 document.documentElement 修改 CSS 变量(高级、现代)

如果你的项目使用了 CSS 变量(自定义属性),这是最优雅、最现代的解决方案,它将样式与行为完全分离。

核心思路:

  1. 在 CSS 中定义一个或多个代表字体的 CSS 变量。
  2. 在 JavaScript 中,修改 document.documentElement (即 <html> 标签) 上的 CSS 变量值。

步骤 1:在 CSS 中定义 CSS 变量

:root {
    /* 定义默认字体 */
    --primary-font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
    --secondary-font-family: 'Georgia', serif;
}
/* 将 CSS 变量应用到 body */
body {
    font-family: var(--primary-font-family);
    font-size: 18px;
    line-height: 1.6;
}

步骤 2:在 JavaScript 中修改变量值

// 获取 html 元素
const htmlElement = document.documentElement;
// 函数:改变主字体
function setPrimaryFont(fontFamily) {
    htmlElement.style.setProperty('--primary-font-family', fontFamily);
}
// 函数:改变副字体
function setSecondaryFont(fontFamily) {
    htmlElement.style.setProperty('--secondary-font-family', fontFamily);
}
// --- 使用示例 ---
// 将主字体更改为衬线字体
setPrimaryFont("'Times New Roman', Times, serif");
// 将副字体更改为无衬线字体
setSecondaryFont("Arial, Helvetica, sans-serif");

为什么这种方法好?

  • 关注点分离:JavaScript 只负责“改变值”,而 CSS 负责“如何应用这个值”,代码更清晰。
  • 易于维护:所有字体定义都在 CSS 中,修改时无需动 JavaScript 代码。
  • 作用域清晰:CSS 变量可以定义在 root(全局)或任何选择器下,作用域控制非常灵活。

总结与最佳实践

方法 优点 缺点 适用场景
直接修改 style 简单直接,代码少 不够灵活,难以维护,无法平滑过渡 一次性设置,或非常简单的脚本
切换 CSS 类 灵活、可维护性好、可添加过渡动画 需要预先在 CSS 中定义类 推荐用于大多数场景,特别是需要用户交互切换字体时
修改 CSS 变量 最现代、最优雅、关注点分离、作用域灵活 需要项目支持 CSS 变量 大型项目、现代前端框架、需要高度样式管理的场景

对于绝大多数网页应用,方法二(通过 CSS 类切换) 是最佳选择,因为它在易用性、灵活性和可维护性