解决 antd5 在低版本浏览器中部分 css 样式丢失问题
2024-09-03
711 字约 3 分钟
...因为解决 antd5 在低版本浏览器的文章始终没有解决我的问题,或者是不够优雅,因此做了一点整理,希望对你有用,至少对我是有用的 😁😁😁
调查原因
结果是 css 中是 where 在低版本 chrome 浏览器不起作用
然后就去 caniuse.com/?search=%3A… , 样式不对的浏览器 console 控制台输入 navigator.userAgent 检测浏览器信息,最终结果是 where 不兼容 chrome 88 以下的版本

解决方法
与 antd 有关直接看官方文档,直接去 antd 搜索 :where ,点击 样式兼容 - Ant Design 根据文档进行如下操作:
参考: Ant Design 的 CSS-in-JS 默认通过
:where选择器降低 CSS Selector 优先级,以减少用户升级时额外调整自定义样式的成本,不过:where语法的兼容性在低版本浏览器比较差。在某些场景下你如果需要支持旧版浏览器,你可以使用@ant-design/cssinjs取消默认的降权操作(请注意版本保持与 antd 一致):
解决非静态方法导致的样式错乱
Umi 中 在 app.tsx 中写入 or 如果是自己创建的就在 root 文件中改造如下代码即可
import { StyleProvider, legacyLogicalPropertiesTransformer } from '@ant-design/cssinjs'
import { ConfigProvider } from 'antd'
export function rootContainer(container: React.ReactNode) {
return (
<ConfigProvider prefixCls="your-antd-prefix-class-name">
// 这个是核心的解决方案,建议不要在项目中多次使用 StyleProvider
<StyleProvider hashPriority="high" transformers={[legacyLogicalPropertiesTransformer]}>
{container}
</StyleProvider>
</ConfigProvider>
)
}
解决 message 等通知静态方法的样式丢失问题
antd 中可以直接
message.xxx、Modal.xxx、notification.xxx静态方法调用展示 UI,但是这些静态方法的样式在低版本浏览器中仍然不支持 :where 愈发, 所以需要优雅降级来解决低版本浏览器 where, gap(flex) 等 css 失效问题, 主要参考 App 包裹组件
- 新建 src/compatible/antd.tsx 文件, 这里的 message 等方法可以直接导出使用(核心就是使用闭包解决)
说明: 兼容低版本的浏览器,antd 的部分组件需要做兼容处理
参考 https://ant-design.antgroup.com/components/app-cn#app-demo-config
*/
import { App } from 'antd'
import { useEffect } from 'react'
import type { MessageInstance } from 'antd/es/message/interface'
import type { ModalStaticFunctions } from 'antd/es/modal/confirm'
import type { NotificationInstance } from 'antd/es/notification/interface'
import { useEventListener } from 'ahooks'
import { detect } from 'detect-browser'
const browser = detect()
let message: MessageInstance
let notification: NotificationInstance
let modal: Omit<ModalStaticFunctions, 'warn'>
const antd5Prefix = 'your-antd-prefix-class-name'
const compatibleCss = `
.${antd5Prefix}-btn .${antd5Prefix}-btn-icon {
display: inline-block !important;
margin-right: 0.25rem !important;
}
`
type CompatibleContainerProps = {
children: React.ReactNode
}
export const CompatibleContainer:React.FC<CompatibleContainerProps> = ({children}) => {
useEffect(() => {
if (browser?.name === 'chrome' && parseFloat(browser.version) <= 80) {
const compatibleStyleTag = document.createElement('style')
compatibleStyleTag.innerHTML = compatibleCss
document.head.appendChild(compatibleStyleTag)
}
}, [])
const staticFunction = App.useApp()
message = staticFunction.message
modal = staticFunction.modal
notification = staticFunction.notification
return children
}
export { message, notification, modal }
- 更新 src/app.tsx(umi版本)其他雷同
import { CompatibleContainer, notification } from './compatible'
import { ClickToComponent } from 'click-to-react-component'
export function rootContainer(container: React.ReactNode) {
return (
<ConfigProvider theme={theme} prefixCls="ant5">
<StyleProvider hashPriority="high" transformers={[legacyLogicalPropertiesTransformer]}>
<App style={{ height: '100%' }}>
<CompatibleContainer>{container}<CompatibleContainer/>
<ClickToComponent />
</App>
</StyleProvider>
</ConfigProvider>
)
}
export const request: RequestConfig = {
errorConfig: {
errorHandler: (e: Record<string, any>) => {
// 这里的 notification 就不会有样式丢失的问题
notification?.error({
message: "请求错误",
description: e.message || "未知错误,请联系xxx解决",
})
}
...
}
}
如果您觉得这篇文章有帮助,请点个赞吧~
相关文章
更多文章 →react2025-12-02
useEffect与useLayoutEffect对比
在 React Hooks 中, 和 都用于处理副作用逻辑,例如订阅、事件监听、DOM 操作等。但它们有着本质性的执行时机差异,这影响到页面渲染、布局抖动、性能表现等关键点。 1\. 执行时机的核心区别 在 React 的渲染流程中: 1. 渲染(Render phase) React 根据 state/props 计算 UI,生成虚拟 DOM,不访问真实 DOM。 2. 提交(Commit phase) React 将虚拟 DOM 变...
学习
react2025-08-03
在 React 中实现倒计时功能会有什么坑
倒计时 倒计时是一个非常常见的业务场景,但是在 React 中实现起来,却不算简单。 首先我们来看这段倒计时代码,它能否正常执行? 来看看实际表现效果 可以看到计时器在不断执行,但是 的值却没有变。 这是一个很经典的问题:React 闭包陷阱 。 我们来详细分析下: 的依赖数组 是空的,这意味着 effect 只会在组件挂载时执行一次,而不会在 状态更新时重新执行。所以 回调函数中捕获的 值始终是初始值 。 这个问题解决起来也很简单,有...
学习面试
react2025-07-30
React性能优化三剑客:memo、useMemo和useCallback详解
前言 在React开发中,性能优化是一个永恒的话题。今天我们就来深入探讨React提供的三个重要性能优化工具: 、 和 ,它们如何帮助我们构建更高效的React应用。 1\. 为什么需要性能优化? 🤔 React的核心机制是当组件的state或props发生变化时,组件会重新渲染。但有时这种重新渲染是不必要的: 父组件更新导致所有子组件重新渲染 ,即使子组件的props没有变化 复杂计算在每次渲染时重复执行 ,消耗大量资源 函数引用在...
学习面试
react2025-06-05
React 中 useDeferredValue 和 startTransition 的核心区别与使用场景
React 中 和 ,两者都用于优化性能,但适用场景和实现方式不同。 核心概念解析 1\. useDeferredValue:延迟值更新 作用 :告诉 React 延迟更新某个值 ,直到所有高优先级渲染任务完成。 适用场景 :当某个值的更新会触发计算密集型渲染(如复杂列表、图表),但需要优先保证其他高优先级 UI(如输入框)的响应。 机制 : 保持旧值显示,后台计算新值。 计算完成后,用新值更新 UI,期间允许用户继续交互。 示例 :...
学习
react2024-12-18
Antd 样式覆盖
目前作者所在的业务正在升级 Antd5.0,不得不说 Antd5.0 真的太香了,但是由于团队的 UE 规范进行了大改版,Antd5.0 所有的 必须对齐最新的规范,因此就需要对 Antd5.0 组件做主题定制。 现状 目前针对项目中使用的 antd 高频组件进行了梳理,并且根据规范基于 design token 对这些高频组件进行样式定制,对于主题色、圆角、边框、字体等用户 高的主题都已经满足团队规范。 虽然 Desig...
学习
react2024-12-06
React 19 终于发布,一大波新功能正式升级
这篇文章主要介绍了 React 19 的新功能,包括 Actions 自动处理数据突变相关状态,新增的 useActionState、useFormStatus、useOptimistic 等 hook,新的 use API 读取渲染资源,新的 React DOM 静态 API 生成静态站点,以及 React 服务器组件中的 RSC 和 RSA 等内容。同时提到后续会分享针对旧版功能的优化和改良。 关联问题: React 19 性能如何...
学习面试
评论
请登录后发表评论
去登录