Element UI el-select样式定制:popper-append-to-body=false原理与实战避坑
1. 问题缘起为什么我的el-select样式改不动最近在做一个后台管理系统UI框架用的是Element UI。有个需求是产品经理觉得默认的el-select下拉框样式太“素”了希望在下拉框里加个搜索框并且把下拉菜单的背景色改成浅灰色边框加粗一点。听起来很简单对吧我心想这不就是写点CSS的事儿嘛。于是我熟练地打开浏览器开发者工具找到那个el-select组件渲染出来的下拉菜单元素它通常是一个叫.el-select-dropdown的div外面还套着一个.el-popper的容器。我信心满满地在项目的全局样式文件里写下了几行代码.el-select-dropdown { background-color: #f5f7fa !important; border: 2px solid #409eff !important; }保存刷新页面。嗯没变化。下拉框还是那个白底蓝边的默认样式。我检查了一下选择器没错啊。我又试着把样式写在当前组件的style scoped里甚至动用了深度选择器::v-deep在Vue 2里是/deep/或style scoped ::v-deep .el-select-dropdown { background-color: #f5f7fa; border: 2px solid #409eff; } /style刷新依然纹丝不动。这就有点邪门了。我明明看到DOM树里有这个元素为什么样式就是应用不上去呢这个问题相信不少刚开始用Element UI的开发者都遇到过。其核心原因就藏在el-select组件的一个默认行为里下拉菜单Popper默认被附加到了document.body上。2. 理解Popper.js与append-to-body机制要彻底搞明白这个问题我们得先理解el-select下拉框的渲染机制。Element UI的下拉、弹出框、Tooltip等组件其弹出层部分都依赖于一个叫做Popper.js的库。Popper.js是一个用于管理弹出元素如工具提示、下拉菜单、弹出框位置的库。它的核心作用是计算弹出元素应该出现在屏幕的哪个位置才能确保它不会超出可视区域并且能紧挨着它的“触发元素”比如我们的el-select输入框。为了实现这种灵活、智能的定位Popper.js通常需要一个“自由”的容器来放置这个弹出元素。最理想、最通用的容器就是document.body。因为body是页面的根元素将弹出层放在这里可以最大程度地避免被父级元素的CSS属性如overflow: hidden、transform、position等影响其定位计算。所以Element UI的el-select组件默认设置了:popper-append-to-bodytrue。这意味着组件在挂载时会在body标签的末尾动态创建一个新的DOM节点。这个节点内部包含了我们想要样式化的.el-select-dropdown。这个节点通过Popper.js与el-select输入框建立关联实现跟随和定位。这就解释了为什么我们的CSS不生效.el-select-dropdown并不在当前组件的DOM子树内它“跳”到了body下面。在Vue的scoped样式作用下当前组件样式表中的选择器无法匹配到body下的这个“远方亲戚”。即便在全局样式中写也可能因为样式优先级或渲染时机问题而难以精准控制。注意这里说的“优先级”不是单纯的CSS权重问题。即使你用了!important如果样式表加载的时机晚于组件渲染或者有其他更具体的选择器覆盖依然可能失败。更重要的是这种全局样式会影响到页面所有的el-select组件这通常不是我们想要的。那么解决方案就呼之欲出了如果我们能让这个下拉菜单不“跑”到body里而是留在当前组件的DOM结构内那么scoped样式就能轻松地作用到它。这就是属性:popper-append-to-bodyfalse的用武之地。3.:popper-append-to-body“false“的正确使用与效果这个属性是el-select组件的一个Prop。将其设置为false就是告诉组件“不要把我的下拉菜单插到body里就放在我旁边。”template el-select v-modelvalue :popper-append-to-bodyfalse placeholder请选择 el-option v-foritem in options :keyitem.value :labelitem.label :valueitem.value /el-option /el-select /template设置之后你再打开开发者工具查看DOM结构会发现变化设置前.el-select-dropdown作为body的直接子元素存在。设置后.el-select-dropdown被渲染在了.el-select组件根元素的后面、同级的位置但依然在Vue当前组件的DOM作用域之内。现在你就可以在组件的style scoped中使用深度选择器来修改它的样式了而且这份样式只会作用于当前这个特定的el-select组件style scoped /* 使用 ::v-deep 深度穿透到子组件根元素下的 .el-select-dropdown */ ::v-deep .el-select-dropdown { background-color: #f5f7fa; border: 2px solid #409eff; border-radius: 6px; box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.2); } /* 甚至可以修改下拉项 */ ::v-deep .el-select-dropdown__item { font-size: 14px; padding: 8px 20px; } ::v-deep .el-select-dropdown__item.hover { background-color: #ecf5ff; } /style一切似乎都很完美。但是先别急着庆祝。这个属性并不是“银弹”它带来便利的同时也引入了一些新的问题和限制。在实际项目中我踩过好几个坑。4. 关键陷阱popper-append-to-body的副作用与应对策略将popper-append-to-body设为false最直接的影响就是Popper.js的定位计算环境变了。它不再拥有body那样“一览众山小”的全局视野而是被限制在了当前组件的DOM上下文中。这会引发一系列连锁反应4.1 定位异常被“关”在盒子里的下拉框这是最常见的问题。如果你的el-select组件外层有一个设置了overflow: hidden或overflow: auto的容器当下拉菜单尝试在这个容器边缘弹出时它可能会被直接裁切掉或者出现奇怪的滚动条。场景复现 假设你的组件结构如下template div classcontainer el-select :popper-append-to-bodyfalse ... !-- 选项 -- /el-select /div /template style scoped .container { height: 200px; overflow: auto; /* 或 hidden */ border: 1px solid #ccc; padding: 20px; } /style当下拉框展开并且选项较多时下拉菜单的一部分可能会消失在.container的边界之外因为它的“活动范围”被这个容器的overflow属性限制了。解决方案审查父级样式首先检查el-select所有上级容器特别是那些可能设置了overflow、position: relative|absolute|fixed、transform、filter或will-change属性的元素。这些属性会创建新的“层叠上下文”或“包含块”影响Popper.js的定位。如果可能调整这些容器的样式为下拉框留出空间。使用popper-optionsel-select提供了一个popper-options属性允许你直接向底层的Popper.js实例传递配置。这是解决复杂定位问题的利器。el-select :popper-append-to-bodyfalse :popper-options{ boundariesElement: viewport, // 尝试以视口为边界 preventOverflow: { enabled: true }, // 防止溢出 modifiers: { flip: { enabled: true }, // 允许翻转 // 强制使用固定定位策略脱离父级overflow限制 computeStyle: { gpuAcceleration: false } } } 这里的关键是computeStyle: { gpuAcceleration: false }。Popper.js默认会使用transform进行定位而transform会使元素受制于父级的overflow。关闭GPU加速即不使用transformPopper.js会回退到使用top/left进行绝对定位这样就有可能“突破”某些overflow的限制。但这并非百分百有效且可能影响性能。终极方案调整DOM结构或放弃false如果上述方法都无法解决你可能需要重新思考组件的DOM结构或者评估是否真的必须使用popper-append-to-body“false“。有时通过其他方式如定义全局的、带特定类名的样式来修改样式可能是更稳健的选择。4.2 层级z-index战争当弹出层不再位于body下它的z-index层级就只相对于其父级上下文有效。如果页面中存在其他也设置了高z-index的元素比如一个全屏的Dialog对话框你的下拉框可能会被压在下面。解决方案 在自定义下拉框样式时显式地设置一个足够大的z-index值。::v-deep .el-select-dropdown { /* ... 其他样式 ... */ z-index: 9999 !important; /* 确保足够高 */ }同时你需要了解页面中其他高阶元素的z-index范围避免“军备竞赛”。更好的做法是建立一个项目级的z-index管理规范。4.3 性能与可访问性考量性能理论上将Popper附加到body是更优的做法因为它减少了因父组件样式变化导致的Popper重新计算。设为false后如果父组件有复杂的布局或频繁更新可能会对性能有细微影响。但对于绝大多数后台管理系统这点差异可以忽略不计。可访问性对于屏幕阅读器等辅助技术保持弹出层在DOM中的逻辑位置有时更有益。但这也需要开发者自己确保焦点管理例如按下Esc关闭下拉框键盘导航选择选项在自定义样式后依然正常工作。Element UI组件本身处理了大部分逻辑但如果你完全重写了DOM结构就需要格外小心。5. 实战从零开始定制一个带搜索框的el-select样式理论说完了我们来个实战。目标是实现一个带搜索功能、且样式完全自定义的el-select。我们会用到popper-append-to-body“false“和popper-options。步骤1基础组件搭建首先我们创建一个使用el-select并启用过滤功能的组件。template div classcustom-select-demo el-select v-modelselectedValue filterable clearable placeholder请输入关键词搜索或选择 :popper-append-to-bodyfalse changehandleChange el-option v-foritem in filteredOptions :keyitem.value :labelitem.label :valueitem.value :disableditem.disabled /el-option /el-select /div /template script export default { data() { return { selectedValue: , options: [ { value: option1, label: 黄金糕 }, { value: option2, label: 双皮奶 }, { value: option3, label: 蚵仔煎, disabled: true }, { value: option4, label: 龙须面 }, { value: option5, label: 北京烤鸭 }, // ... 更多数据 ] }; }, computed: { filteredOptions() { // 这里可以加入自定义的过滤逻辑如果el-select自带的filterable不满足需求 return this.options; } }, methods: { handleChange(value) { console.log(选中的值:, value); } } }; /script步骤2深度定制下拉框样式现在我们在style scoped中深度定制下拉菜单目标是模仿一个现代感更强的设计。style scoped .custom-select-demo { width: 300px; margin: 50px auto; } /* 1. 定制下拉框整体 */ ::v-deep .el-select-dropdown { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%) !important; border: none; border-radius: 12px; box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2); padding: 0; /* 清除默认内边距 */ overflow: hidden; /* 确保子元素圆角生效 */ } /* 2. 定制搜索输入框 */ ::v-deep .el-select-dropdown .el-input__inner { background-color: rgba(255, 255, 255, 0.9); border: 2px solid rgba(255, 255, 255, 0.5); border-radius: 20px; color: #333; margin: 15px; width: calc(100% - 30px); /* 减去左右margin */ box-sizing: border-box; } ::v-deep .el-select-dropdown .el-input__inner:focus { border-color: #fff; background-color: #fff; box-shadow: 0 0 0 2px rgba(102, 126, 234, 0.3); } ::v-deep .el-select-dropdown .el-input__suffix { right: 25px; /* 调整搜索图标位置 */ } /* 3. 定制下拉列表区域 */ ::v-deep .el-select-dropdown__list { padding: 0 15px 15px 15px; /* 上边距为0与搜索框紧贴 */ max-height: 300px; /* 控制最大高度 */ } /* 4. 定制每个选项项 */ ::v-deep .el-select-dropdown__item { color: #fff; padding: 12px 15px; border-radius: 8px; margin-bottom: 5px; transition: all 0.3s ease; font-size: 14px; position: relative; overflow: hidden; } /* 悬停和选中状态 */ ::v-deep .el-select-dropdown__item.hover, ::v-deep .el-select-dropdown__item:hover { background-color: rgba(255, 255, 255, 0.15) !important; transform: translateX(5px); } ::v-deep .el-select-dropdown__item.selected { background-color: rgba(255, 255, 255, 0.25) !important; font-weight: bold; color: #fff; } /* 禁用状态 */ ::v-deep .el-select-dropdown__item.is-disabled { color: rgba(255, 255, 255, 0.5); cursor: not-allowed; background-color: transparent !important; } ::v-deep .el-select-dropdown__item.is-disabled:hover { transform: none; background-color: transparent !important; } /* 5. 定制空状态和无匹配数据状态 */ ::v-deep .el-select-dropdown__empty, ::v-deep .el-select-dropdown__loading { color: rgba(255, 255, 255, 0.7); padding: 30px 0; text-align: center; } /* 6. 定制滚动条Webkit内核浏览器 */ ::v-deep .el-select-dropdown__list::-webkit-scrollbar { width: 6px; } ::v-deep .el-select-dropdown__list::-webkit-scrollbar-track { background: rgba(255, 255, 255, 0.1); border-radius: 3px; } ::v-deep .el-select-dropdown__list::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.3); border-radius: 3px; } ::v-deep .el-select-dropdown__list::-webkit-scrollbar-thumb:hover { background: rgba(255, 255, 255, 0.5); } /style步骤3处理定位问题由于我们使用了渐变色背景和圆角并且popper-append-to-body为false如果父容器有overflow限制圆角可能被裁切。我们可以通过popper-options尝试优化。template el-select v-modelselectedValue filterable clearable :popper-append-to-bodyfalse :popper-optionscustomPopperOptions placeholder请输入关键词搜索或选择 !-- ... 选项 ... -- /el-select /template script export default { data() { return { selectedValue: , customPopperOptions: { placement: bottom-start, // 弹出位置 modifiers: { // 防止下拉框溢出视窗并设置一个偏移量 preventOverflow: { boundariesElement: viewport, padding: 10 }, // 允许在空间不足时翻转如向上弹出 flip: { enabled: true, behavior: [bottom-start, top-start, bottom-end, top-end] }, // 添加一个向下的偏移量让下拉框和输入框有点间距 offset: { offset: 0, 5 }, // 可选关闭gpu加速尝试解决某些overflow裁剪问题 computeStyle: { gpuAcceleration: false // 谨慎使用可能影响性能 } } } }; } }; /script经过以上三步你就得到了一个样式独特、带有搜索功能、且样式完全受控的el-select组件。它不再受全局样式污染所有样式定义都封装在当前组件内。6. 进阶在Vue 3与Element Plus中的变化如果你正在使用Vue 3和基于它开发的Element Plus情况略有不同但核心思想一致。属性名变更在Element Plus中这个属性的名称变成了:teleportedfalse。teleported这个词更形象地描述了“传送”到body的行为。将其设为false效果等同于Element UI的:popper-append-to-bodyfalse。!-- Element Plus -- el-select v-modelvalue :teleportedfalse !-- ... -- /el-select样式深度选择器Vue 3的style scoped中深度选择器的语法推荐使用:deep()。style scoped .custom-select :deep(.el-select-dropdown) { background-color: #f5f7fa; } /style或者你也可以使用CSS Modules或者不带scoped的style标签配合具体类名来限定样式作用域。Composition API在组合式API中你可以更灵活地动态计算popper-options。例如根据下拉框内容长度动态调整弹出方向。script setup import { ref, computed } from vue; const options ref([...]); // 你的选项数据 const selectedValue ref(); const customPopperOptions computed(() { // 如果选项很多优先向下弹出选项少可以向上 const placement options.value.length 5 ? bottom-start : top-start; return { placement, modifiers: [{ name: offset, options: { offset: [0, 8] } }] }; }); /script template el-select v-modelselectedValue :teleportedfalse :popper-optionscustomPopperOptions !-- ... -- /el-select /template7. 替代方案当popper-append-to-body“false“不是最佳选择时尽管popper-append-to-body“false“给了我们巨大的样式控制权但它带来的定位复杂度也是实实在在的。在以下场景你可能需要考虑替代方案场景一组件被多层嵌套在复杂布局容器中。调整所有父容器的overflow和position属性成本太高。场景二需要同时修改页面中大量el-select的样式且样式一致。为每个组件都设置false并写一遍样式太冗余。替代方案1使用全局样式 自定义类名这是最传统也是最稳定的方法。利用el-select的popper-class属性给下拉框的根元素添加一个唯一的类名然后在全局样式表中针对这个类名编写样式。template el-select v-modelvalue popper-classmy-custom-select-dropdown !-- ... -- /el-select /template style /* 在全局样式表如App.vue或独立的.css文件中 */ .my-custom-select-dropdown { background-color: #f5f7fa; border: 2px solid #409eff; } .my-custom-select-dropdown .el-select-dropdown__item { color: #666; } /style优点完全避免定位问题样式由浏览器自然层叠管理。缺点全局样式可能引发冲突需要良好的命名规范。替代方案2渲染到指定容器Element Plus支持Element Plus的teleported属性可以接受一个String选择器指示弹出层渲染到哪个容器而不是默认的body。template div idapp div classdialog-container !-- 这个对话框里的el-select下拉框会渲染到 .dialog-container 里 -- el-dialog el-select :teleported.dialog-container !-- ... -- /el-select /el-dialog /div /div /template这样下拉框既没有跑到body下引发样式隔离问题也没有留在可能具有overflow:hidden的父元素内而是到了一个你指定的、相对“干净”的容器中。这是一个非常灵活的折中方案。替代方案3完全自定义下拉内容使用slot对于样式定制需求极其复杂、甚至要改变DOM结构的情况el-select提供了slot来自定义下拉列表的内容。你可以完全不用el-option自己用div渲染列表并自己处理过滤、选中等所有逻辑。这给了你百分之百的控制权但代价是需要手动实现大量交互逻辑仅推荐在极端定制化场景下使用。在我经历的项目中大部分情况下方案1全局样式自定义类名是修改单个或少量通用样式的首选因为它简单可靠。而popper-append-to-body“false“则更适合用于某个特定页面或组件内需要对下拉框进行“手术刀”式精细样式打磨的场景前提是你已经准备好应对可能出现的定位问题。理解每种方法的优劣根据实际场景选择才是前端样式攻坚的正确姿势。

相关新闻

个人所得税计算全解析:从应纳税所得额到年度汇算清缴

个人所得税计算全解析:从应纳税所得额到年度汇算清缴

1. 从“糊涂账”到“明白账”:为什么我们需要自己算个税?每个月发工资的时候,看着工资条上“个人所得税”那一栏被扣掉的钱,你是不是也和我一样,偶尔会有点懵?这笔钱到底是怎么算出来的?公司财务…

2026/10/18 13:28:18 阅读更多 →
C/C++库开发全解析:从静态/动态库原理到CMake实战

C/C++库开发全解析:从静态/动态库原理到CMake实战

1. 项目概述:从“轮子”到“工具箱”的进化 如果你写过几行C或C代码,大概率已经和“库”打过交道了。比如,你想在屏幕上打印一行字,会调用 printf 或 cout ;你想计算一个数的平方根,会调用 sqrt 。这…

2026/10/16 15:06:01 阅读更多 →
Electron安装全攻略:从环境配置到深度排错,解决卡顿与报错

Electron安装全攻略:从环境配置到深度排错,解决卡顿与报错

1. 项目概述:为什么“正确姿势”如此重要? 如果你正在接触桌面应用开发,或者想把你的Web技术栈扩展到桌面端,那么Electron这个名字你一定不陌生。它让前端开发者用HTML、CSS和JavaScript就能构建出跨平台的桌面应用,像…

2026/10/17 8:52:34 阅读更多 →

最新新闻

Aspen Plus Skill自动化更新系统设计与实现

Aspen Plus Skill自动化更新系统设计与实现

1. 项目概述:当流程模拟工程师开始写“自动更新脚本”你有没有过这样的经历:凌晨两点,盯着Aspen Plus界面里那个灰掉的“Update Skill”按钮发呆?刚改完一个热力学模型参数,想顺手把配套的Skill脚本同步更新到最新版&a…

2026/10/18 13:28:00 阅读更多 →
Java地理位置定位系统:NMEA解析、GeoHash+RTree空间索引与离线围栏判定

Java地理位置定位系统:NMEA解析、GeoHash+RTree空间索引与离线围栏判定

简介:这是一份面向高校计算机专业本科生的Java课程设计实践资源,聚焦地理位置定位功能开发,帮助学习者掌握Java GUI、数据库交互与GIS地图集成等综合技能。资源包含73个文件,主体为15个Java源码(含核心业务逻辑与Swing…

2026/10/18 13:28:00 阅读更多 →
多种小游戏合集开发复盘:架构、玩法与优化实践

多种小游戏合集开发复盘:架构、玩法与优化实践

最近我把手头零散写了很久的多个休闲小游戏统一收拢成了一个合集项目,项目标题就叫“多种小游戏”。起因很朴素:时间碎片化的玩家希望一个页面里能随时换着玩,我自己也想借这个机会把以前东一榔头西一棒子写的小游戏代码从逻辑到交互梳理清楚…

2026/10/18 13:28:00 阅读更多 →
Python自动化生成深度学习课件PPT:可复现的工程化实践

Python自动化生成深度学习课件PPT:可复现的工程化实践

简介:这是一份面向深度学习初学者与进阶学员的Python课件PPT,系统梳理从编程基础到主流模型再到行业落地的完整知识链路,帮助读者建立理论认知并衔接工程实践。内容覆盖Python语法与流程控制、数据清洗与标准化、线性回归、神经网络结构与激活…

2026/10/18 13:28:00 阅读更多 →
深度学习入门:从课件PPT到NumPy手写神经网络与PyTorch实战

深度学习入门:从课件PPT到NumPy手写神经网络与PyTorch实战

简介:这份《深度学习原理与应用》课件PPT面向高校学生、自学者及希望系统入门人工智能的开发者,帮助其建立从数学基础到经典模型的完整知识框架。课件共十一章,从深度学习概述讲起,依次覆盖线性代数、概率论与统计学、微积分与优化…

2026/10/18 13:28:00 阅读更多 →
Linux下NVML初始化失败:驱动与库版本不匹配的排查与修复指南

Linux下NVML初始化失败:驱动与库版本不匹配的排查与修复指南

1. 这个报错到底在说什么Failed to initialize NVML: Driver/library version mismatch这行字,但凡在 Linux 上跑过深度学习训练、折腾过显卡直通、或者手贱升级过一次系统内核的人,大概率都见过。它的字面意思很直白:NVML 初始化失败&#x…

2026/10/18 13:26:59 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →