You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何为WebView加载的外部HTTP URL内容自定义字体族与字号?

嘿,这个需求我帮很多开发者解决过,核心就是通过注入自定义CSS来覆盖网页默认的字体和字号,不同平台的WebView实现方式略有差异,我分几个常见场景给你详细说:

Android 平台实现
  • 第一步:准备自定义字体文件,把.ttf.otf格式的字体放到项目的assets/fonts目录下(没有就新建这两个层级的文件夹)。
  • 第二步:编写包含字体声明和样式覆盖的CSS字符串:
var customCss = "@font-face { font-family: 'MyCustomFont'; src: url('file:///android_asset/fonts/MyCustomFont.ttf') format('truetype'); } " +
                "body, p, div, span, h1, h2, h3, h4, h5, h6 { font-family: 'MyCustomFont' !important; font-size: 16px !important; }";
  • 第三步:配置WebView并注入CSS:
WebView webView = findViewById(R.id.your_webview_id);
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setAllowFileAccess(true);
webSettings.setDomStorageEnabled(true);

webView.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        // 页面加载完成后注入CSS脚本
        String injectJs = "var style = document.createElement('style'); style.innerHTML = '" + customCss + "'; document.head.appendChild(style);";
        view.evaluateJavascript(injectJs, null);
    }
});

// 加载目标URL
webView.loadUrl("https://your-target-url.com");
iOS 平台实现(WKWebView)
  • 第一步:把字体文件拖进Xcode项目,确保勾选了对应的target,并且在Target -> Build Phases -> Copy Bundle Resources里能看到该字体文件。
  • 第二步:在Info.plist中添加Fonts provided by application数组项,把字体文件名(比如MyCustomFont.ttf)添加进去。
  • 第三步:配置WKWebView并注入自定义样式:
import WebKit

class YourViewController: UIViewController, WKNavigationDelegate {
    private var webView: WKWebView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let config = WKWebViewConfiguration()
        webView = WKWebView(frame: view.bounds, configuration: config)
        webView.navigationDelegate = self
        view.addSubview(webView)
        
        // 构建自定义CSS
        guard let fontUrl = Bundle.main.url(forResource: "MyCustomFont", withExtension: "ttf") else { return }
        let cssString = """
        @font-face {
            font-family: 'MyCustomFont';
            src: url('\(fontUrl.absoluteString)') format('truetype');
        }
        body, p, div, span, h1, h2, h3, h4, h5, h6 {
            font-family: 'MyCustomFont' !important;
            font-size: 16px !important;
        }
        """
        
        // 创建用户脚本,在页面加载完成后注入CSS
        let userScript = WKUserScript(source: cssString, injectionTime: .atDocumentEnd, forMainFrameOnly: true)
        config.userContentController.addUserScript(userScript)
        
        // 加载目标URL
        if let targetUrl = URL(string: "https://your-target-url.com") {
            webView.load(URLRequest(url: targetUrl))
        }
    }
}
React Native 平台实现(react-native-webview)
  • 第一步:把字体文件放到项目的assets/fonts目录,然后在react-native.config.js中配置资源路径:
module.exports = {
  assets: ['./assets/fonts/'],
};

运行npx react-native link完成字体资源的链接(新版RN可能自动链接,可跳过)。

  • 第二步:在WebView组件中注入自定义CSS:
import React from 'react';
import { WebView } from 'react-native-webview';

const CustomFontWebView = () => {
  const customStyle = `
    @font-face {
      font-family: 'MyCustomFont';
      src: url('MyCustomFont.ttf') format('truetype');
    }
    * {
      font-family: 'MyCustomFont' !important;
      font-size: 16px !important;
    }
  `;

  const injectCssScript = `
    const styleEl = document.createElement('style');
    styleEl.innerHTML = \`${customStyle}\`;
    document.head.appendChild(styleEl);
    true; // 必须返回true,避免脚本重复执行
  `;

  return (
    <WebView
      source={{ uri: 'https://your-target-url.com' }}
      injectedJavaScript={injectCssScript}
      javaScriptEnabled={true}
    />
  );
};

export default CustomFontWebView;
通用注意事项
  • !important是为了强制覆盖网页自身的样式优先级,确保自定义字体和字号生效。
  • 字体格式尽量选.ttf,兼容性覆盖绝大多数设备;如果用其他格式,记得修改CSS中format()的参数(比如.otf对应opentype)。
  • 部分网站可能有CSP(内容安全策略)限制,禁止注入脚本或加载本地字体,这时候需要调整WebView的配置:比如Android开启webSettings.setAllowUniversalAccessFromFileURLs(true),iOS可以通过WKWebView的配置修改CSP规则。

内容的提问来源于stack exchange,提问作者Anu

火山引擎 最新活动