移动端适配团队规范:动态根字号与rem实战方案
移动端适配这件事做了这么多年我最大的感受就是方案本身不难难的是团队里每个人对适配的理解都不一样。有人觉得用rem就万事大吉有人觉得flexbox天下无敌还有人觉得viewport一把梭就行。结果就是各写各的最后拼到一起在某个特定机型上直接崩掉。这套方案的核心思路是把适配这件事从个人经验变成团队规范用一套可量化、可复用的机制来兜底。1. 为什么移动端适配总在同一个坑里翻车1.1 适配问题的本质是什么很多人把移动端适配理解成让页面在手机上看起来正常这个定义太模糊了。真正的问题在于设计稿只有一张但用户手里的设备有几千种屏幕规格。宽度从320px到480px甚至更宽像素密度从1倍到4倍浏览器渲染引擎还各有各的脾气。我见过太多项目设计师给一张750px宽的设计稿前端直接用px写死。在iPhone上看着还行到了某些安卓机上要么元素挤成一团要么留白大到离谱。根本原因就是px是物理像素单位但不同设备的逻辑像素和物理像素之间的映射关系完全不同。举个具体的例子。同样一个100px宽的按钮在1倍屏上占100个物理像素在2倍屏上占200个物理像素在3倍屏上占300个物理像素。但用户感知的大小是按逻辑像素来的所以如果你不做任何处理这个按钮在不同设备上的视觉大小其实是一致的——问题出在布局宽度上。设计稿是按750px画的但设备的逻辑宽度可能是375px、414px、360px你按750px写死的布局到了375px的设备上就会溢出。1.2 常见方案的局限性市面上流行的适配方案大概有这么几种我逐个说说它们的问题。固定viewport方案把viewport的width设成固定值比如750。这种做法简单粗暴页面按750px布局然后整体缩放。问题是所有设备都按同一个比例缩放在大屏手机上字会变得特别小在小屏手机上字又特别大。而且用户双指缩放的手势会被干扰体验很差。媒体查询方案针对不同断点写不同的CSS。这种做法在响应式布局里很常见但移动端设备碎片化太严重你不可能为每个尺寸都写一套样式。而且媒体查询只能处理几个断点断点之间的设备就被忽略了。百分比布局方案所有宽度都用百分比。问题是高度没法用百分比而且百分比是相对于父元素的嵌套深了之后计算起来非常痛苦。更致命的是百分比布局无法保证元素之间的比例关系设计稿上1:2的宽高比到了实际页面上可能变成1:1.5。flexible方案这是早期比较流行的一种方案通过动态设置根元素的font-size配合rem来实现等比缩放。思路是对的但早期版本依赖viewport的scale属性在某些安卓浏览器上有兼容性问题。这套方案的核心改进就是放弃了viewport缩放改用纯rem动态根字号的方式来实现等比适配。这样做的好处是不干扰用户的缩放行为兼容性更好而且计算逻辑更清晰。1.3 核心思路拆解整套方案的逻辑链条是这样的设计师按750px宽度出设计稿这是行业惯例因为750是iPhone 6/7/8的物理像素宽度也是2倍屏的逻辑宽度375的两倍前端在页面加载时动态计算根元素的font-size所有需要等比缩放的尺寸都用rem单位来表示rem的值 设计稿上的px值 / 75因为750px设计稿对应7.5rem的根字号基准为什么除以75因为750 / 10 75也就是说把设计稿分成10等份每份75px。这样1rem就等于设计稿上的75px一个100px的元素就是100/75 1.333rem。当设备宽度变化时根字号按比例调整所有rem单位就会等比缩放。这个思路的关键在于根字号的基准值是可以动态计算的。在375px宽的设备上根字号设为37.5px375/10在414px宽的设备上根字号设为41.4px414/10。这样1rem在不同设备上对应的物理宽度不同但相对于屏幕宽度的比例是恒定的。2. 核心机制动态根字号与rem的配合2.1 根字号的计算逻辑根字号的计算公式其实很简单根字号 设备逻辑宽度 / 10但这里有几个细节需要注意。第一设备逻辑宽度怎么获取。最可靠的方式是用document.documentElement.clientWidth这个值不受滚动条影响也不受缩放影响。有些人用window.innerWidth但在某些浏览器上这个值会包含滚动条的宽度导致计算偏差。第二要不要限制最大宽度。在平板或折叠屏设备上如果屏幕宽度超过一定值比如750px继续按比例放大根字号会导致页面元素过大。通常的做法是设置一个上限比如当设备宽度超过750px时根字号固定为75px页面居中显示两侧留白。第三DPR的处理。DPR设备像素比影响的是图片的清晰度不影响布局。但在设置viewport时需要把initial-scale设为1让页面按逻辑像素渲染。图片的适配是另一个话题后面会单独讲。2.2 rem单位的换算方法换算规则很简单设计稿上的px值除以75就是rem值。比如设计稿上一个按钮宽200px高80px圆角20px那么CSS里就写.button { width: 2.667rem; /* 200 / 75 */ height: 1.067rem; /* 80 / 75 */ border-radius: 0.267rem; /* 20 / 75 */ }这里有个实操中的小技巧不要手动算用CSS预处理器或者PostCSS插件自动转换。手动算不仅容易出错而且后期改设计稿的时候会非常痛苦。我一般用PostCSS的postcss-pxtorem插件配置好基准值75写CSS的时候直接写px构建的时候自动转成rem。但要注意不是所有px都要转rem。边框宽度border-width通常保持px因为1px的边框在rem下可能会变成0.5px或1.5px渲染出来要么消失要么变粗。字体大小可以用rem但最小字号要限制避免在高分屏上字太小看不清。2.3 viewport的正确设置viewport的meta标签写法meta nameviewport contentwidthdevice-width, initial-scale1.0, maximum-scale1.0, user-scalableno逐个参数解释widthdevice-width让viewport宽度等于设备逻辑宽度initial-scale1.0初始缩放比例为1maximum-scale1.0最大缩放比例为1user-scalableno禁止用户手动缩放关于user-scalableno业界有争议。从可访问性角度来说禁止缩放对视力障碍用户不友好。但在实际项目中移动端页面通常有固定的布局结构允许缩放会导致布局错乱。我的建议是如果是工具类、电商类页面禁止缩放如果是内容阅读类页面允许缩放。另外iOS 10以上的Safari会忽略user-scalableno需要用JavaScript来阻止双击缩放和双指缩放。这部分代码后面会给出。2.4 动态根字号的实现代码核心代码其实很短(function() { var docEl document.documentElement; var designWidth 750; // 设计稿宽度 var maxWidth 750; // 最大适配宽度 function setRootFontSize() { var clientWidth docEl.clientWidth; if (clientWidth maxWidth) { clientWidth maxWidth; } var fontSize clientWidth / (designWidth / 75); docEl.style.fontSize fontSize px; } setRootFontSize(); // 监听窗口变化 window.addEventListener(resize, setRootFontSize); window.addEventListener(pageshow, function(e) { if (e.persisted) { setRootFontSize(); } }); })();这段代码有几个关键点立即执行函数避免变量污染全局作用域。pageshow事件处理从缓存中恢复页面的情况。有些浏览器在前进/后退时会从缓存中恢复页面此时resize事件不会触发需要手动重新计算。resize事件处理屏幕旋转和窗口大小变化。注意要做防抖处理否则频繁触发会影响性能。maxWidth限制当设备宽度超过750px时根字号不再增大页面内容居中显示。3. 实操中的关键细节与避坑指南3.1 字体大小的适配策略字体大小用rem还是px这个问题我纠结过很久。用rem的好处是字体也会随屏幕等比缩放视觉上更统一。但问题是小屏设备上字会变得很小大屏设备上字会变得很大。我的做法是正文用rem但设置最小字号标题用rem不设上限。具体来说body { font-size: 0.32rem; /* 设计稿24px */ } media screen and (max-width: 320px) { body { font-size: 12px; /* 小屏最小12px */ } }另外行高建议用无单位数值比如line-height: 1.5这样行高会基于当前字体大小自动计算不会因为rem换算出现奇怪的值。还有一个坑iOS上的字体渲染。iOS的Safari在横屏时会自动放大字体需要用-webkit-text-size-adjust: 100%来禁止。这个属性在body上设置即可。3.2 图片与高清屏适配图片适配分两种情况固定尺寸的图片和背景图。固定尺寸的图片用rem设置宽高即可。但要注意图片的实际分辨率要足够高。在2倍屏上一个100px宽的图片需要200px的实际宽度才能清晰显示。所以设计稿上的图片切图时要按2倍或3倍尺寸导出。背景图的适配稍微复杂一些。如果背景图需要铺满整个容器用background-size: cover或contain。如果需要精确控制可以用rem设置background-size。高清屏的图片适配通常用image-set或者srcset来实现.logo { background-image: image-set( url(logo1x.png) 1x, url(logo2x.png) 2x, url(logo3x.png) 3x ); }但image-set的兼容性一般更可靠的方式是用JavaScript判断DPR然后动态设置图片源。3.3 1px边框的处理1px边框在高清屏上是个经典问题。在2倍屏上1px的CSS边框实际渲染为2个物理像素看起来会比设计稿粗。解决方案有几种transform scale方案用伪元素画一个2倍宽的边框然后缩放0.5倍。.border-1px { position: relative; } .border-1px::after { content: ; position: absolute; top: 0; left: 0; width: 200%; height: 200%; border: 1px solid #ccc; transform: scale(0.5); transform-origin: 0 0; pointer-events: none; }box-shadow方案用box-shadow模拟边框但圆角处理起来比较麻烦。border-image方案用渐变图片做边框兼容性好但不够灵活。我一般用transform scale方案兼容性和效果都比较平衡。注意pointer-events: none不能忘否则伪元素会挡住点击事件。3.4 横屏与折叠屏的适配横屏适配的核心问题是横屏时设备宽度变大按宽度计算的根字号会导致元素过大。解决方案是横屏时按高度计算根字号。function setRootFontSize() { var clientWidth docEl.clientWidth; var clientHeight docEl.clientHeight; var width Math.min(clientWidth, clientHeight); // 取较小值 // ... 后续计算 }折叠屏的适配更复杂一些。折叠状态下屏幕较窄展开后屏幕变宽。我的建议是用CSS媒体查询处理折叠屏的布局变化用rem处理尺寸缩放。两者结合既能保证布局合理又能保证元素比例协调。4. 完整实操流程与配置方案4.1 项目初始化配置假设你用的是Vue或React项目配置流程如下。第一步安装PostCSS插件npm install postcss-pxtorem --save-dev第二步配置postcss.config.jsmodule.exports { plugins: { postcss-pxtorem: { rootValue: 75, propList: [*], selectorBlackList: [.no-rem], minPixelValue: 2, exclude: /node_modules/i } } };参数说明rootValue: 75基准值对应750px设计稿propList: [*]所有属性都转换selectorBlackList不转换的选择器比如.no-rem开头的类minPixelValue: 2小于2px的值不转换避免边框消失exclude排除node_modules目录第三步引入动态根字号脚本在入口文件main.js或index.js中引入import ./utils/rem.js;第四步设置viewport在index.html的head中添加meta nameviewport contentwidthdevice-width, initial-scale1.0, maximum-scale1.0, user-scalableno, viewport-fitcoverviewport-fitcover是为了适配iPhone X以上的刘海屏让页面内容延伸到安全区域。4.2 安全区域适配刘海屏和底部横条的适配用env()函数.container { padding-top: env(safe-area-inset-top); padding-bottom: env(safe-area-inset-bottom); padding-left: env(safe-area-inset-left); padding-right: env(safe-area-inset-right); }注意env()函数需要配合viewport-fitcover才能生效。另外env()的兼容性在旧版本浏览器上不好需要提供降级方案.container { padding-bottom: 20px; padding-bottom: constant(safe-area-inset-bottom); /* iOS 11.0-11.2 */ padding-bottom: env(safe-area-inset-bottom); /* iOS 11.2 */ }4.3 禁止缩放的JavaScript补丁前面提到iOS 10会忽略user-scalableno需要JavaScript来补// 阻止双击缩放 var lastTouchEnd 0; document.addEventListener(touchend, function(event) { var now Date.now(); if (now - lastTouchEnd 300) { event.preventDefault(); } lastTouchEnd now; }, false); // 阻止双指缩放 document.addEventListener(gesturestart, function(event) { event.preventDefault(); });这段代码要放在页面加载完成后执行。注意gesturestart事件只在iOS上有效安卓上不需要处理。4.4 构建与调试流程开发阶段建议在浏览器中模拟不同设备进行调试。Chrome DevTools的设备模拟器可以模拟各种屏幕尺寸和DPR但要注意模拟器中的rem计算可能和真机有差异最终还是要用真机验证。真机调试时我一般用以下步骤在手机上打开页面检查根字号的数值是否正确用浏览器的开发者工具远程调试检查元素的rem值是否符合预期旋转屏幕检查横屏适配是否正常在不同品牌、不同尺寸的设备上测试重点关注小屏320px和大屏414px以上5. 常见问题排查与实战经验5.1 根字号计算不准确现象页面元素整体偏大或偏小。排查思路检查document.documentElement.clientWidth的值是否等于设备逻辑宽度检查是否有CSS设置了html { font-size: ... }覆盖了动态计算的根字号检查是否有其他脚本修改了根字号解决方案确保动态根字号脚本在CSS加载之前执行或者用!important提高优先级。另外如果页面中有iframeiframe内部的根字号需要单独计算。5.2 页面出现横向滚动条现象页面宽度超出屏幕出现横向滚动条。排查思路检查是否有元素的宽度超过100%检查是否有元素设置了固定的px宽度没有转成rem检查是否有margin或padding导致元素溢出解决方案在body上设置overflow-x: hidden但这只是治标。根本的解决方法是找出溢出的元素修正它的宽度。可以用以下代码快速定位var docWidth document.documentElement.offsetWidth; [].forEach.call(document.querySelectorAll(*), function(el) { if (el.offsetWidth docWidth) { console.log(el); } });5.3 字体在部分安卓机上显示异常现象字体大小不一致或者字体被系统强制放大。排查思路检查是否设置了-webkit-text-size-adjust: 100%检查是否使用了系统默认字体部分安卓机的默认字体渲染有差异检查是否设置了最小字号部分浏览器有最小字号限制解决方案设置-webkit-text-size-adjust: 100%并指定具体的字体族比如font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, Arial, sans-serif。5.4 常见问题速查表问题现象可能原因解决方案元素整体偏大根字号计算错误检查clientWidth和基准值横向滚动条元素宽度溢出定位溢出元素修正宽度1px边框过粗高清屏渲染用transform scale方案字体被放大系统字体缩放设置text-size-adjust横屏布局错乱根字号按宽度计算横屏时按高度计算刘海屏遮挡内容未适配安全区域使用env()函数图片模糊分辨率不足按DPR导出多倍图5.5 实操心得心得一不要过度依赖rem。rem适合做整体布局的等比缩放但不适合做所有细节。比如边框、阴影、圆角这些用px反而更稳定。心得二设计稿的基准值要统一。如果团队里有人按750px出图有人按375px出图换算的时候会乱套。建议统一按750px出图前端统一按75的基准值换算。心得三真机测试不可省略。模拟器再强大也无法完全模拟真机的渲染行为。特别是安卓机的碎片化问题只有在真机上才能发现。心得四做好降级方案。如果JavaScript加载失败根字号不会动态设置页面会按默认的16px渲染。可以在CSS中设置一个默认的根字号作为兜底html { font-size: 37.5px; /* 375px设备的默认值 */ }这样即使JavaScript失效页面也能基本正常显示。心得五关注新特性。CSS的clamp()函数和容器查询container queries正在改变移动端适配的方式。clamp()可以设置字号的最小值、首选值和最大值比媒体查询更灵活。容器查询则可以让组件根据容器宽度自适应而不是根据屏幕宽度。这些新特性值得关注但在生产环境中要谨慎使用确保兼容性。这套方案我在多个项目中用过整体稳定性不错。最关键的一点是把适配规则写进团队规范让每个人都按同一套逻辑来。否则再好的方案执行不到位也是白搭。

相关新闻

React Native鸿蒙化实战:从零开发跨平台颜色选择器

React Native鸿蒙化实战:从零开发跨平台颜色选择器

1. 项目思路与背景:为什么偏偏是颜色选择器先说结论:如果想给 React Native 鸿蒙跨平台开发找个练手项目,颜色选择器几乎是最合适的起点。它不像 todo list 那样只涉及列表和输入框,也不像图表库那样一上来就要对付 canvas 和大量…

2026/10/14 9:08:50 阅读更多 →
C++与Node.js集成:性能优化与实战技巧

C++与Node.js集成:性能优化与实战技巧

1. 为什么需要C与Node.js集成 在性能密集型应用开发中,我们常常遇到这样的困境:Node.js的事件驱动和非阻塞I/O模型非常适合处理高并发请求,但在计算密集型任务上表现欠佳;而C虽然计算性能卓越,却缺乏高效的异步I/O能力…

2026/10/14 9:08:50 阅读更多 →
SQLite+FTS5+BM25实现本地AI上下文检索增强(RAG)

SQLite+FTS5+BM25实现本地AI上下文检索增强(RAG)

1. 项目概述:从“context-mode”这个词开始,我们到底在谈什么?“context-mode”这个词乍一看像某个新出的编程模式、IDE插件开关,或是某款AI工具里的隐藏功能标签——但翻遍主流开发文档、VS Code官方设置、JetBrains全家桶配置项…

2026/10/14 9:07:49 阅读更多 →

最新新闻

Node.js+Vue全栈开发出租车智能调度系统实践

Node.js+Vue全栈开发出租车智能调度系统实践

1. 项目背景与核心需求出租车业务管理系统是传统运输行业数字化转型的典型场景。随着网约车平台的兴起,传统出租车公司面临着运营效率低下、调度方式落后、数据统计困难等痛点。这个基于Node.jsVue的全栈项目,正是为了解决以下核心问题:实时调…

2026/10/14 10:08:38 阅读更多 →
瑞利-里茨法:弹性力学能量原理与工程实践

瑞利-里茨法:弹性力学能量原理与工程实践

1. 瑞利-里茨法基础理论1.1 能量原理的物理背景在弹性力学系统中,能量原理为我们提供了一种强有力的分析工具。最小势能原理指出:在所有满足位移边界条件的可能位移场中,真实的位移场使得系统的总势能取得极小值。这个原理不仅适用于静力学问…

2026/10/14 10:08:38 阅读更多 →
Kafka Log存储原理:揭秘顺序写、稀疏索引与Segment分片设计

Kafka Log存储原理:揭秘顺序写、稀疏索引与Segment分片设计

1. 这不是“日志存储”,而是 Kafka 的数据心脏——从磁盘文件结构看吞吐与一致性的底层博弈你打开 Kafka 的 data 目录,看到一堆形如topic-partition-0/00000000000000000000.log和00000000000000000000.index的文件,第一反应可能是&#xff…

2026/10/14 10:08:38 阅读更多 →
Qt+MinGW 编译 PCL 全依赖链实战指南

Qt+MinGW 编译 PCL 全依赖链实战指南

简介:本资源面向需要在Windows平台使用Qt与MinGW构建点云处理环境的C开发者,提供PCL及其全部依赖库的完整编译成果。PCL是开源三维点云处理库,涵盖数据采集、预处理、特征提取与表面重建;配套的Boost、Eigen、FLANN、Qhull与VTK分…

2026/10/14 10:08:38 阅读更多 →
基于机器学习的Web日志异常检测与根因分析

基于机器学习的Web日志异常检测与根因分析

简介:这是一套面向Web安全工程师、运维开发人员及机器学习初学者的终端日志分析工具,聚焦于Web服务器日志的自动化统计、审计与恶意请求识别。项目基于Python实现,集成日志解析、访问量/请求类型多维统计、SQLite(或MySQL&#xf…

2026/10/14 10:08:38 阅读更多 →
macOS C++20开发环境配置:LLVM+VS Code+Clang完整闭环

macOS C++20开发环境配置:LLVM+VS Code+Clang完整闭环

1. 为什么 macOS 上配 C 环境总让人“卡在第一步”?Mac 用着顺手,写代码也清爽,但一到配 C 环境,很多人就停在了终端里那行command not found: g上——不是没装 Xcode,就是装了却找不到编译器路径;不是clan…

2026/10/14 10:07:26 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/14 7:53:34 阅读更多 →