尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
React Native鸿蒙版Modal底部抽屉:动画、手势与踩坑实录
最近在做跨端项目的鸿蒙适配界面组件里第一个翻车的就是 Modal。原本以为 RN 生态里 Modal 在 iOS 和 Android 上都很成熟鸿蒙适配层应该也不会差太远结果底部抽屉这种最常见的交互直接暴露出了动画缺失、层级异常、返回键不响应三个问题。这篇文章会把我在 React Native 鸿蒙版里用 Modal 实现底部抽屉的过程完整拆开来讲——为什么不能照搬老写法、核心代码怎么组织、鸿蒙上有哪些绕不开的坑以及最后怎么封装成一个通用组件。适合正在做鸿蒙端适配的 RN 开发者或者准备把现有 App 扩展到鸿蒙的团队参考。1. 鸿蒙版React Native的Modal和你以为的不太一样先说结论RN 的 Modal 组件在鸿蒙适配层里的实现和 iOS / Android 有相当大的差异。这个差异不是接口层面的而是底层渲染机制层面的。你要是不信拿一个现成的、在 Android 上跑得好好的底部抽屉代码直接丢到鸿蒙真机上大概率会看到抽屉瞬间弹出、遮罩若有若无、退出动画直接消失这些诡异现象。1.1 一套代码跨三端的愿望在Modal这里打了个折很多团队对RN 一套代码跑三端的认知是组件 API 一样底层由各端自行适配业务层无感知。这个说法在大面上成立但 Modal 这种依赖窗口层级的组件恰恰是个例外。iOS 上 Modal 走的是原生UIViewController的 present 机制它是真的从视图控制器层面盖了一层。Android 上 Modal 走的是Dialog或DialogWindow也是一个独立的窗口。这两者的共同特点是Modal 内容天然处于页面之上遮罩、动画、返回键都有系统级支持。鸿蒙适配层实现的 Modal本质上是在 ArkUI 的组件树里模拟了一个顶层页面它并不是真正的新窗口。问题就出在这个模拟上——层级、动画、返回键处理都会和宿主页面发生联动而底部抽屉恰好把这三个雷全踩了一遍。所以在鸿蒙版里做底部抽屉第一条原则就是不要依赖 Modal 自带的能力把控制权拿回到自己手里。能自己用动画实现的就不要指望animationType能自己处理遮罩的就不要相信系统默认行为。1.2 从底层实现看差异三种动画类型的真实表现animationType是 Modal 最常用的属性取值一般就三个none、fade、slide。iOS 和 Android 上这三个值表现都很稳定但鸿蒙适配层上我实际遇到的情况是动画类型iOS 表现Android 表现鸿蒙适配层表现none无动画直接显示/消失无动画直接显示/消失无动画显示/消失正常fade透明度渐入渐出约 300ms透明度渐入渐出有渐入退出阶段可能瞬间消失slide从底部推入带弹簧感从底部滑入动画较硬早期版本映射异常可能出现从顶部掉入或直接闪现这个表格里的鸿蒙适配层表现不完全代表所有版本但足以说明一个趋势slide 动画在鸿蒙上最不可控。底部抽屉要的就是从底部滑入的效果如果指望animationTypeslide就是在拿稳定性打赌。我的做法是Modal 的animationType固定用none进出场动画完全由内部Animated控制。这样动画的时长、缓动函数、是否启停都由业务代码掌控跟 Modal 的底层实现解耦。代码上只多了一点点工作量但换来了三个端的稳定表现。2. 底部抽屉的核心骨架遮罩、容器与进出场动画下面说正题。一个底部抽屉不管在哪一端结构和交互逻辑都是固定的半透明遮罩、底部对齐的内容容器、内容区从下方滑入、点击遮罩关闭、可选的下滑手势关闭。难点不在想清楚而在写出来的代码在鸿蒙上真的能跑。2.1 布局结构三层关系拆明白底部抽屉的 View 结构可以拆成三层最外层是Modal负责盖在页面之上这个基本事实第二层是遮罩和抽屉容器的组合——遮罩用绝对定位铺满抽屉容器靠在底部第三层是抽屉内部内容区和手势条这里有个容易忽略的点transparent{true}和animationTypenone必须同时设置。如果只写transparent不写animationType在鸿蒙适配层某些版本里Modal 的默认动画行为会覆盖你的预期。反过来如果写了animationType不写transparentModal 背景会默认不透明遮罩就废了。抽屉容器的对齐方式我用的是最直接的方案View style{styles.overlay} TouchableOpacity style{styles.mask} activeOpacity{1} onPress{handleClose} / Animated.View style{[styles.drawer, { transform: [{ translateY }] }]} View style{styles.handle} / {children} /Animated.View /Viewconst styles StyleSheet.create({ overlay: { flex: 1, justifyContent: flex-end, }, mask: { ...StyleSheet.absoluteFillObject, backgroundColor: rgba(0, 0, 0, 0.4), }, drawer: { height: 400, backgroundColor: #fff, borderTopLeftRadius: 16, borderTopRightRadius: 16, padding: 16, paddingBottom: 24, }, handle: { width: 36, height: 4, borderRadius: 2, backgroundColor: #ddd, alignSelf: center, marginBottom: 12, }, });overlay容器用justifyContent: flex-end抽屉容器自然贴底。遮罩是绝对定位置于最底层在抽屉之前渲染抽屉在上层。这里要注意遮罩和抽屉在同一个父容器里遮罩用绝对定位铺满抽屉是普通文档流中靠底部的元素两者互不遮挡。TouchableOpacity的activeOpacity{1}是为了避免点击遮罩时出现透明度闪烁。2.2 为什么用 translateY 而不是 height 过渡实现抽屉滑入有两种常见方案一种是动态改抽屉的高度或 marginBottom另一种是固定抽屉的位置用transform: translateY从屏幕外移入。我强烈建议用translateY原因很实在第一height和margin的变化会触发 ArkUI 的布局计算每一次动画帧都可能重新测量子组件页面复杂一点就会出现掉帧。transform走的是渲染树的合成层不触发布局重算性能要稳一个量级。第二translateY的动画起点和终点非常清晰初始状态是屏幕高度即抽屉完全在屏幕下方目标状态是0。动画过程就是从屏幕外移入到位逻辑直观排查问题也容易。第三手势下拉关闭时直接把gestureState.dy的值塞进translateY即可天然就是手指拖到哪、抽屉跟到哪的跟手效果。如果用 height 方案手势位移还得反向换算成高度差多一道不必要的数学。关于抽屉高度这里有个经验:优先用固定高度或按设计稿定值。不要依赖onLayout动态测量内容高度来驱动抽屉高度因为在鸿蒙适配层里首次onLayout的触发时机可能在进入动画已经开始之后高度从默认值跳到实际值时抽屉位置会明显跳动一下。后续如果想支持可变高度也应该在动画开始前就把高度算好而不是边滑边量。2.3 一份可以直接跑的 BottomDrawer 代码下面这份代码是我在鸿蒙真机上验证过的基础版本去掉了所有业务干扰只保留抽屉的核心行为。import React, { useEffect, useRef } from react; import { Animated, Dimensions, Modal, PanResponder, StyleSheet, TouchableOpacity, View, } from react-native; const { height: SCREEN_HEIGHT } Dimensions.get(window); const DEFAULT_HEIGHT 400; const BottomDrawer ({ visible, onClose, children, drawerHeight DEFAULT_HEIGHT }) { const translateY useRef(new Animated.Value(SCREEN_HEIGHT)).current; const showDrawer () { Animated.timing(translateY, { toValue: 0, duration: 260, useNativeDriver: true, }).start(); }; const closeDrawer () { // 先播放退出动画动画结束后再把 visible 交给父组件置为 false Animated.timing(translateY, { toValue: SCREEN_HEIGHT, duration: 220, useNativeDriver: true, }).start(() { onClose onClose(); }); }; useEffect(() { if (visible) { showDrawer(); } }, [visible]); const panResponder useRef( PanResponder.create({ onMoveShouldSetPanResponder: (_, gestureState) { return ( gestureState.dy 8 gestureState.dy Math.abs(gestureState.dx) ); }, onPanResponderMove: (_, gestureState) { if (gestureState.dy 0) { translateY.setValue(gestureState.dy); } }, onPanResponderRelease: (_, gestureState) { if (gestureState.dy 100) { closeDrawer(); } else { Animated.spring(translateY, { toValue: 0, useNativeDriver: true, }).start(); } }, }) ).current; return ( Modal visible{visible} transparent animationTypenone onRequestClose{closeDrawer} View style{styles.overlay} TouchableOpacity style{styles.mask} activeOpacity{1} onPress{closeDrawer} / Animated.View style{[ styles.drawer, { height: drawerHeight, transform: [{ translateY }] }, ]} {...panResponder.panHandlers} View style{styles.handle} / {children} /Animated.View /View /Modal ); };代码里藏了几个关键细节展开说一下。第一是closeDrawer的时序。这是底部抽屉最容易写错的地方如果直接在父组件里把visible置为falseModal 会立刻卸载子组件退出动画根本来不及播抽屉唰一下就没了。正确做法是抽屉内部先把translateY动画拉回屏幕底部等动画完成的回调里再调用onClose去通知父组件关掉visible。这样退出动画完整视觉上才像一个真正的抽屉。第二是useEffect里只在visible为true时执行 showDrawer。visible为false时不做任何事因为此时 Modal 内部组件已经卸载动画也没有意义。如果你想让关闭动画也统一由父组件触发那就在父组件里等抽屉的退出动画回调后再改变可见性二选一即可不要两套逻辑都写。第三是onRequestClose{closeDrawer}。这个属性在 Android 上对应物理返回键在鸿蒙上对应系统返回手势。把它绑到closeDrawer而不是直接绑onClose可以保证无论是点遮罩、下滑手势还是系统返回都先播退出动画再关 Modal交互体验一致。3. 手势关闭、遮罩点击与键盘避让把交互做扎实基础骨架跑通之后底部抽屉才算完成了一半。真正考验细节的是交互层手势响不跟手、点击遮罩有没有误触、键盘弹出来的时候抽屉会不会顶飞。这三个问题我在鸿蒙上都踩过逐个说。3.1 PanResponder 下拉手势方向判断、阈值与回弹下拉关闭手势用PanResponder实现重点是两个判断什么情况下响应手势什么情况下触发关闭。响应判断我写在onMoveShouldSetPanResponder里三个条件缺一不可gestureState.dy 8纵向位移超过 8 个像素才判定为手势避免点击操作被误判gestureState.dy Math.abs(gestureState.dx)纵向位移必须大于横向位移确保是下拉而不是横向滑动onMoveShouldSetPanResponder而不用onStartShouldSetPanResponder等用户真的开始移动了再接管触摸抽屉内部的按钮、滚动列表不会因为点了一下就被抢占事件释放手势的时候判断要不要关闭我用的阈值是gestureState.dy 100。这个数值不是随手写的抽屉高度如果是 400100 正好是四分之一用户拖过了这个位置松手说明关闭意图明确没到这个位置说明只是误触或者试探应该回弹。如果抽屉高度可变也可以用drawerHeight * 0.25动态计算更稳。回弹动画我用的Animated.spring而不是timing。spring 自带一个过冲回弹的物理感视觉效果上更接近原生抽屉。不过要注意spring 和 show/close 用的 timing 的useNativeDriver要保持一致不要一个 true 一个 false鸿蒙适配层在切换驱动模式时可能出现动画节点状态同步问题。3.2 遮罩点击关闭事件冒泡和动画时序遮罩点击关闭有个隐蔽问题遮罩用TouchableOpacity铺满全屏但抽屉内容是渲染在遮罩之上的普通 View。如果抽屉内容里也有点击事件理论上 TouchableOpacity 不会拦截它——因为事件冒泡是从最上层的响应者开始的。但我在鸿蒙上遇到过一次异常某个版本里遮罩的onPress在抽屉内容被点击时也被触发了。排查到最后原因不是遮罩本身而是activeOpacity{1}没有生效TouchableOpacity 在点击任意位置时改变了遮罩的透明度视觉上像是被触发了。后来我干脆把遮罩改成了Pressable加style的方式或者用View外包一层PanResponder处理点击彻底绕开 TouchableOpacity 在鸿蒙上透明度重置的怪异行为。如果你不想引入额外组件也可以保持 TouchableOpacity但记得手动验证真机上点击抽屉内部控件时遮罩的onPress是否被误触发。我这边最后的结论是遮罩点击这种纯点击无视觉反馈的场景用Pressable更省心。时序上的坑上面提到过点遮罩触发closeDrawer退出动画播完再调用onClose。这里再补充一点——如果用户连续快速点击遮罩多次closeDrawer会被调用多次多条Animated.timing同时往translateY上跑动画会打架。我通常会在组件里加一个closingRef标志位const closingRef useRef(false); const closeDrawer () { if (closingRef.current) return; closingRef.current true; Animated.timing(translateY, { toValue: SCREEN_HEIGHT, duration: 220, useNativeDriver: true, }).start(() { onClose onClose(); closingRef.current false; }); };这个细节看着小但真机上快速连点带来的动画错乱很影响体验。加上标志位之后同一时间只允许一次关闭动画。3.3 键盘弹起和底部安全区两处高度修正如果抽屉里有输入框比如评论、筛选条件键盘弹起时要注意鸿蒙的 windowInsets 行为和 Android 不完全一样。Android 上 Modal 里的内容往往会被默认的 adjustResize 顶起鸿蒙适配层上则可能完全不动作输入框直接被键盘盖住。我的处理方式是在抽屉内部监听键盘事件Keyboard.addListener(keyboardDidShow, callback)里拿到键盘高度把抽屉内容区加一个paddingBottom高度等于键盘高度keyboardDidHide时把 paddingBottom 归零注意两个细节第一keyboardDidShow和keyboardWillShow在鸿蒙上不一定都可用我实测keyboardDidShow更稳定第二不要用KeyboardAvoidingView来包整个抽屉它的behavior参数在鸿蒙适配层上支持不完整padding模式经常无效height模式会直接把抽屉整个顶出屏幕外比不用还糟。底部安全区同样是高度修正问题。鸿蒙的手势导航条底部横条和全面屏的圆角区域会让抽屉内容贴边后显得陷进去。我在抽屉容器上加paddingBottom 固定值兜底再结合Dimensions.get(screen)或者网罗一下根据设备型号判断是否需要额外补偿。这里不用过度设计给个默认的 24 再加一个可配置属性就够。4. 鸿蒙上的真坑记录返回键、状态栏与动画驱动跨端适配的乐趣就在于看起来一样跑起来全是意外。这一章把我踩过的、以及身边同行遇到过的鸿蒙专属问题汇总一下算是这个组件的踩坑日志。4.1 物理返回键onRequestClose 在鸿蒙上的触发行为RN Modal 的onRequestClose在 Android 上对应物理返回键按下就会触发。鸿蒙手机大多数机型没有底部实体返回键用的是屏幕边缘侧滑返回手势。问题来了侧滑返回手势触发时Modal 组件并不一定能拦截到。我遇到的情况是抽屉打开时用户从屏幕左侧边缘右滑页面居然跟着返回手势一起退出了Modal 的onRequestClose压根没被调用。这个问题的根因是鸿蒙适配层的 Modal 不是独立窗口它的触摸事件分发和页面级手势存在竞争关系。处理方案是双保险Modal 里绑onRequestClose的同时在抽屉所在页面容器上也监听返回事件。当抽屉的visible为 true 时把返回事件拦截下来手动触发closeDrawervisible 为 false 时不拦截让返回手势作用于页面本身。这样即使 Modal 层没拦截住页面层也能兜底。具体到代码就是在页面组件的useEffect里按需添加和移除返回监听。注意不要在整个页面生命周期里都挂着拦截否则会影响其他页面的正常返回。4.2 状态栏穿透沉浸式布局下的遮罩失灵这个坑特别隐蔽。鸿蒙的沉浸式布局状态栏透明、内容延伸到状态栏下面在 RN 页面里很常见但底部抽屉打开时遮罩的透明度区域可能只覆盖到状态栏下缘状态栏那一块依然是页面内容看起来就像遮罩缺了一条边。排查过程大概是最初我以为是rgba(0,0,0,0.4)的颜色值在鸿蒙上解析出了问题后来逐个验证发现问题出在 Modal 内部的容器没有延伸到安全区之外。鸿蒙适配层的页面内容默认会避让状态栏除非你显式设置了StatusBar相关属性。处理上我给 Modal 内部最外层容器加一个顶部 padding高度等于状态栏高度同时强制容器的背景色跟随遮罩颜色。这样即使状态栏区域独立于 Modal 渲染视觉上也是统一的遮罩效果// 状态栏高度需要从原生侧获取RN 里可以用 StatusBar.currentHeight const STATUSBAR_HEIGHT StatusBar.currentHeight || 24; const overlayStyle { flex: 1, justifyContent: flex-end, paddingTop: STATUSBAR_HEIGHT, backgroundColor: rgba(0, 0, 0, 0.4), };顺带注意一个相关现象鸿蒙深色主题下如果遮罩颜色写的是rgba(0, 0, 0, x)在某些主题切换场景下遮罩会变得异常亮。稳妥的做法是遮罩颜色固定用一个不变量不要根据主题动态切换否则抽屉打开瞬间遮罩颜色会突变。4.3 useNativeDriver 在鸿蒙的兼容性先跑真机再决定RN 动画里useNativeDriver: true意味着动画逻辑由原生侧驱动不经过 JS 线程帧率更高。iOS 和 Android 上这个优化在 transform 动画上是标配。鸿蒙适配层对 native driver 的支持不同版本差别很大早期版本基本形同虚设直接回退到 JS 驱动后期版本虽然支持了但曲线参数easing和 RN 的枚举不是一一对应的。我的建议是分两步验证第一步先用useNativeDriver: false把整个抽屉跑通。JS 驱动的动画在鸿蒙上反而是最稳妥的因为 ArkUI 对 JS 线程的调度优化不算差底部抽屉这种轻量动画肉眼几乎看不出帧率差别。第二步如果页面里同时跑着其他复杂动画JS 线程有明显压力再把抽屉动画切成useNativeDriver: true做真机对比。重点看两处进入动画是否平滑、退出动画是否完整播完。只要有一处异常果断切回 false不要为了理论性能牺牲实际体验。我最后留在线上版本里的方案是默认 false且提供一个useNativeDriver的 props 让业务方根据真机表现自行切换。组件库层面的默认值选保守的那个永远更明智。5. 从Demo到组件封装一个谁都能用的Drawer写到这里底部抽屉的核心问题都解决了。但如果你只是把上面的代码复制进业务页面下一个页面、下一个人、下一个项目还得再来一遍。花十几分钟把它封装成一个正经组件短期看是多余工作长期看是省所有人的时间。5.1 组件的API设计什么都暴露 什么都管不住封装组件的核心矛盾是既要让使用者有定制空间又要保证核心行为不被改坏。我的建议是暴露少数几个高频参数把容易出错的内部逻辑全部藏起来。参考这个参数表参数类型默认值说明visibleboolean必传抽屉是否显示由父组件控制onClosefunction必传关闭回调所有关闭路径最终都会走到这里heightnumber400抽屉高度maskColorstringrgba(0,0,0,0.4)遮罩颜色enableGesturebooleantrue是否启用下拉手势关闭animationDurationnumber260进/出场动画时长useNativeDriverbooleanfalse是否使用原生驱动动画height一定要暴露因为不同页面里的抽屉内容高度差异很大。maskColor暴露出来是因为业务上有时需要更深的遮罩比如弹窗场景或者几乎透明的遮罩比如轻提示。enableGesture也要有——抽屉内部如果放了横向滚动的列表不加开关的话手势冲突会很麻烦。不暴露的包括translateY动画值、PanResponder的判断条件、遮罩点击和返回键的具体处理。这些是稳定的内部行为放出去反而容易被改出各自为政的版本。实现上有两个小技巧第一个抽屉内部的内容区应该包一个支持滚动的ScrollView。因为抽屉高度固定内容一旦超过高度就得能滚动否则被裁剪的内容摸不到。注意给ScrollView设置keyboardShouldPersistTapshandled这样用户输入时点击键盘区域不会立即让键盘收起体验更接近原生。第二个遮罩点击在启用enableGesture时不要直接在TouchableOpacity上挂onPress而是在抽屉容器的手势回调里判断触摸位置。我最后实现的方案是用一个PanResponder同时管理遮罩区域和手势区域遮罩区域内的点击通过onPanResponderRelease里位移量为 0 来识别这样逻辑统一也规避了 TouchableOpacity 在鸿蒙上的透明度异常问题。5.2 性能取舍与第三方库对比什么时候该自己写市面上有很多成熟的三方底部抽屉库有些在 iOS 和 Android 上确实做得不错。但鸿蒙适配是另一回事三方库大概率没有针对鸿蒙适配层做专项测试你在 iOS 上依赖的某个手势库特性到鸿蒙上可能触发未知行为。我在实际项目中对比下来给自己的结论是如果项目只跑 iOS 和 Android三方库完全够用没必要自己造轮子如果项目要上鸿蒙且抽屉作为基础组件被多个页面复用自己封装一个轻量组件更可控如果只是某个页面临时用一次直接复制上面的 Demo 代码改到能跑为止不要过度设计判断标准就一条这个组件在你的项目里是基础设施还是一次性工具。基础设施自己掌握核心逻辑一次性工具优先求快。底部抽屉这种交互代码量并不大自己维护的成本远低于出了 bug 后去三方库里翻代码的成本。最后分享一个我自己编码之外的习惯组件写好之后单独搞一个演示页把开关、高度、遮罩透明度、手势开关、键盘弹起这几个场景全部列出来真机上逐个试一遍。这个演示页不删留给后来者看一眼就能理解组件的能力边界。跨端组件的价值一半在代码里另一半在谁接手都能快速摸清脾气的文档和演示里。
RELATED

相关推荐

高中英语Developing Ideas课件的思维脚手架设计与技术适配

高中英语Developing Ideas课件的思维脚手架设计与技术适配

简介:本资源是一份专为高中英语教学设计的新外研版必修一Unit 23“Developing Ideas”精品课件,面向一线英语教师及高一学生,聚焦英语习语理解、英美表达差异辨析与跨文化交际能力培养。课件通过五大核心活动系统训练:Activity 1以…

📅 2026/10/17 9:29:27
Unity3D飞机投弹模拟系统:抛体运动到落点预测的实现

Unity3D飞机投弹模拟系统:抛体运动到落点预测的实现

做飞机投弹这件事,最早源于一个军事题材游戏项目里卡了挺久的玩法需求:飞机在地面目标上空盘旋,怎么设计才能让炸弹落在该落的位置,同时炮手飞行员的屏幕提示又不会太“作弊”?后来我意识到,这个问题本身就…

📅 2026/10/17 9:29:27
Prompt注入红队回归集:大模型上线前的安全闸门

Prompt注入红队回归集:大模型上线前的安全闸门

(这里要避免任何套话,直接进入内容。用从业者的口吻,先从一个真实场景切入,把“只测对不对”的问题点破。)最近接手了一个大模型客服系统的上线评估,团队自测报告很漂亮:意图识别准确率95%&…

📅 2026/10/17 9:24:27
MORE NEWS

更多资讯

📰

ARM架构Mac安装MySQL 5.7实战指南:兼容性、编译与容器方案

1. 项目概述:为什么在ARM架构Mac上装MySQL 5.7不是“怀旧”,而是刚需你手头那台M1或M2芯片的Mac,跑着最新版macOS,开发环境里却卡着一个必须用MySQL 5.7的老系统——可能是某套遗留金融清算模块的测试脚本只认mysql_real_escape_s…

📰

Dev-C++临时编译标志怎么加?三种方法详解与踩坑记录

在 Dev-C 里想临时给某次编译加个参数,最直接的反应往往是打开“工具 → 编译器选项”或者“项目 → 项目属性”,在输入框里敲一行参数,编译完再删掉。这个操作本身没毛病,但问题是:Dev-C 的编译参数入口大多管的是持久…

📰

HBase Master与RegionServer JVM调优实战

做HBase运维的人迟早都会面对一个问题:机器配置一样,角色不同,到底该怎么给Master和RegionServer分配JVM内存?我见过不止一个团队把Master和RegionServer的JVM参数配成完全一样,32GB堆一把梭,结果集群状态看…

📰

代码化图表设计:让架构图、流程图和ER图成为可维护的代码

今天想认真聊聊 diagram-design 这个技术实践。简单说,它属于“用代码来画架构图、流程图、这些日常要用的图”这一大类需求。说得白话一点,就是把以前在画布上拖拽方框、连线的方式,换成写文本、跑命令、出图的方式,让整套流程图…

📰

Claude + IDEA + CC-GUI:Java开发的最佳AI组合神装!TaoToken统一Key接入实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

AI赋能计算力学:从物理信息神经网络到代理模型的落地路线

做计算力学的朋友,这两年肯定绕不开一个高频词——AI for Science。我最近整理了一批相关方向的论文,越看越有一种感觉:计算力学与机器学习之间的边界,正在被快速磨平。AI赋能力学计算已经不是一个概念层面的讨论,而是…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬