ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Elementor去除进度条百分号:三种CSS与JS方案详解

Elementor去除进度条百分号:三种CSS与JS方案详解 在 Elementor 里折腾进度条Progress Bar时我相信你迟早会遇到这个问题组件本身很漂亮但右上角那个自动生成的百分比数字总是带着一个百分号。对于大半数场景来说这是合理的但如果你的设计稿里只想放一个纯数字甚至完全不想显示数字那个默认的%就成了一根卡在喉咙里的鱼刺。我刚做 B2B 官网时也在这上面卡过一阵。Elementor 的 Progress Bar 在编辑面板里确实没有提供“是否显示百分号”的开关官方既没有把“显示/隐藏%”做成独立选项也没有在“数字后缀”之类的字段里留口子。要解决它只能走自定义 CSS 这条路。这篇文章就把我实测过的三种方案全部记录下来包含选择器原理、动效避坑和常见报错排查你可以直接照着抄。1. 先搞懂 Progress Bar 的数字是怎么渲染出来的在动手写代码之前有必要先弄清楚一个关键问题Elementor 的进度条百分比到底是谁渲染出来的如果不理解这一点你后续无论是改 CSS 还是用钩子都容易像无头苍蝇一样乱试。打开 Elementor 的编辑器拖入一个 Progress Bar 组件它基本的 DOM 结构大致是div classelementor-progress-wrapper div classelementor-progress-bar>.hide-pb-number .elementor-progress-number { display: none; }如果你的 Elementor 版本用了elementor-progress-bar直接包裹文本那可以改成.hide-pb-number .elementor-progress-number, .hide-pb-number .elementor-progress-text { display: none; }这么写的好处是干净利落数字直接不显示百分号自然也没了。但缺点你也应该想到如果有一个场景是你必须显示纯数字但又不显示%那这个方案就不够用了因为display: none把数字和百分号一起干掉了。2.2 方案二利用 CSS 属性选择器只去掉百分号保留数字这个方案是很多 Elementor 老玩家爱用的偏门招式思路是既然elementor-progress-number里是完整文本“75%”那我们干脆把它“隐藏文字、显示数据”的思路反过来——让这个容器里的原文字不可见然后用 CSS 伪元素自己造一个数字填进去。操作分两步走。第一步给 Progress Bar 加 CSS 类名custom-pb-number然后写这段代码.custom-pb-number .elementor-progress-number { font-size: 0 !important; line-height: 0 !important; } .custom-pb-number .elementor-progress-number::after { content: attr(data-max); font-size: 16px; line-height: 1.5; }这里你会发现一个问题attr(data-max)拿到的是进度条的最大值而不是当前值。Elementor 会在.elementor-progress-bar上有一个>document.addEventListener(DOMContentLoaded, function() { document.querySelectorAll(.elementor-progress-number).forEach(function(el) { var raw el.textContent; var cleaned raw.replace(%, ); el.textContent cleaned; }); });但如果你直接这样写很可能发现前台刷新后数字没变或者滚动触发后才被改掉。这是因为 Elementor 的进度条动画是在页面滚动到组件位置时才执行的动画过程中它会把原始文本写上。所以你要么把 JS 绑定到scroll事件要么用setTimeout延时或者干脆在 Elementor 的elementor/frontend/init之后执行。实操的时候稳妥一点可以这样jQuery(window).on(elementor/frontend/init, function() { elementorFrontend.hooks.addAction(frontend/element_ready/progress.default, function() { setTimeout(function() { jQuery(.elementor-progress-number).each(function() { jQuery(this).text(jQuery(this).text().replace(%, )); }); }, 500); }); });这套操作下来无论用户怎么滚动、怎么刷新结果都是稳定的。而且就算动画还没结束只要触发了回调数字也会在动画完成后被修改——因为setTimeout的本质是延后执行动画结束后 DOM 更新完你再覆盖一次。不过说句实在话如果只是为了让一个百分比数字不带符号动用 JS 是有点杀鸡用牛刀的感觉。多数场景下纯 CSS 的方案二已经足够。JS 方案更适合那种“今天晚上老板突然要求进度条数字打包 JSON 返回”的临时需求。3. 实操过程去掉 Percent 符号的完整操作记录下面给你还原一遍我在真实项目里处理这个问题的完整流程。这个项目是一个 WordPress 网站用的是 Elementor Pro 最新版本主题是 Hello Elementor目标是把一个“服务完成度”的进度条从82%改成纯数字82。第一步先在 Elementor 编辑器中确认用的确实是 Progress Bar 组件而不是第三方的什么高级进度条。给该组件设置一个 CSS 类名我惯用的命名方式是pb-no-percent尽量语义化。如果你有多个进度条都要去掉%就把同一个类名加到所有组件上一次搞定。第二步去 WordPress 后台的主题定制器Appearance → Customize → Additional CSS里添加代码注意选择器前面的类名要和组件里填的完全一致大小写敏感.pb-no-percent .elementor-progress-number { font-size: 0 !important; line-height: 0 !important; } .pb-no-percent .elementor-progress-number::after { content: attr(data-max); font-size: 16px; font-weight: 700; line-height: 1; color: #222222; }这里我强烈建议你加上!important因为 Elementor 自带样式经常会在面板里生成内联样式或高优先级的选择器没有!important的话伪元素可能被覆盖掉。第三步到前台硬刷新页面CtrlShiftR 或者 CmdShiftR观察右上角数字是否变成纯数值。我这边实测下来的现象是动画未播放时页面刚加载还没滚到进度条位置数字隐藏了伪元素替代数字出现显示为纯“82”滚动到进度条位置触发动画时数字会瞬间变回“82%”——就是动画执行中 Elementor 重新渲染了一次文本内容把 CSS 伪元素盖住了。这是静态 CSS 方案绕不过去的问题。为确保万无一失我把代码补得更具体一点直接锁死.elementor-progress-bar的文本.pb-no-percent .elementor-progress-number { width: 0 !important; height: 0 !important; visibility: hidden !important; } .pb-no-percent .elementor-progress-number::after { visibility: visible !important; }这样做的好处是即使 Elementor 在动画过程中重新写入了文本但因为容器宽高都是 0 且不可见文字再怎么变也显示不出来。伪元素自己独立控制内容和可见性不会再被覆盖。这个最终方案我用到了三个不同站点的生产环境涵盖了固定百分比和动态数据的场景没有再出现动画后数字回弹的问题。如果你也遇到了动画后百分号又回来的情况大概率就是没用宽高归零 visibility组合拳光靠display: none是挡不住 Elementor 写回文本的。4. 常见问题与排查技巧实录去掉百分号的奇特遭遇整个实操过程中有几个问题我几乎每次换新环境重做都会遇到这里集中排一下雷。4.1 修改后的代码无效百分号纹丝不动排查方向只有一个你的自定义 CSS 有没有真的被加载如果主题缓存插件开着或者你用的是第三方的 CSS 优化插件很可能会把动态 CSS 给合并压缩了。你可以先用浏览器开发者工具检查一下元素的样式看类名是否生效。最简单的方式是直接在代码里加个body { outline: 1px solid red; }看下是不是全局生效——这个土办法我一直在用十次能救回来六次。另外确保你添加 CSS 的位置是在 Elementor 高级 Tab 的“自定义 CSS”里或者主题“额外 CSS”里而不是写在文章正文的 HTML 代码块中后者会被转义永远不生效。4.2 数字显示出来了但被挤成了两行这种情况一般是width: 0加上::after内容过长时换行导致的。在.elementor-progress-number里加上white-space: nowrap就能解决同时伪元素的display: block或是display: inline-block根据你的布局微调一下。我自己的习惯是.pb-no-percent .elementor-progress-number { white-space: nowrap; overflow: hidden; }这行代码能防止数字拆行、遮挡其他元素尤其是当进度条紧挨着右侧布局边缘时特别管用。4.3 进度条颜色变了跟设置面板里不一样这是因为你在 CSS 里使用了.elementor-progress-bar的选择器或者自定义类名直接写在了组件上把背景色覆盖了。检查一下你写的 CSS确保没有类似background: transparent或background: #fff的全局样式。Elementor 自带的 class 嵌套层级很敏感我见过有人图省事直接对.elementor-progress-bar统一处理结果把整个进度条外观搞崩的例子。4.4 想保留数字的百分比但只去掉百分号而数字在动画前和动画后不一致如果数字本身是动态的Ajax 拉取、ACF 字段、后台函数计算那attr(data-max)就不一定准确。此时一定要配合方案三的 JS或者在 PHP 层面接 Elementor 的render_element过滤器去改输出。具体做法是把>media (max-width: 767px) { .pb-no-percent .elementor-progress-number::after { font-size: 14px; } }移动端的进度条本来就窄数字太大还压着右侧边缘这在验收时很容易被当成 Bug 打回来。5. 一个更省事但被你忽略的土办法如果你觉得写 CSS 和 JS 都麻烦其实还有一个“非技术”方案不用 Progress Bar 组件的原版数字显示而是把“百分比”字段填成你想要的数字但前置文本那栏写完整信息再用 CSS 把右上角数字整个藏掉。这样表面上你什么都没改只是绕过了一半功能就像一个“时间不够不做动画”的妥协方案。但我不太推荐日常用它因为当你需要展示数据时这种方案会损失信息强度。更推荐的是如果真的只是“想去掉 % 保留数字”其实不用搞伪元素替换内容那么复杂直接在elementor-progress-number容器外再包一层自己的绝对定位元素数据对齐、位置控制更精细。可惜 Elementor 官方组件没给这个口子所以又绕回 CSS 或 JS 的老路。这里我也分享一个自己比较得意的渐进增强技巧在进度条旁边放一个用短代码调出来的总任务数进度条的数值只显示“已完成 82”利用 CSS 的伪元素加上单位“完成”这样页面里既能读出来具体的任务完成情况又不会显得数字孤零零。视觉上速度感更强而且不用百分号排版干净。6. 最后再分享几个我踩出来的细节前面讲了各种方案和排坑这里再补几个容易忽略的地方。第一如果你用了 Elementor 的“Motion Effects”里的滚动效果进度条数字会被延迟到滚动到视口时才渲染这时 CSS 的伪元素替换逻辑要配合滚动事件不然你刚加载页面时看的是对的滚到目标位置时反而变成带百分号的原始数字了。这种坑最难排查因为你每次刷新页面看到的都是不同的状态。第二一旦你的页面同时存在多个 Progress Bar而且你只想去掉某个数字的百分号记得把类名精确到组件上不要用通用类直接指到所有进度条。否则你会面临“有的进度条改了有的没改”的混乱情况。我自己在项目后期习惯在 CSS 里用结构化的命名空间比如.service-area .progress-item .elementor-progress-number把作用范围缩到最小避免误伤。第三尽量不要同时在 Elementor 的“自定义 CSS”区域和主题的“额外 CSS”区域同时写两套规则如果优先级冲突你会浪费大量时间排查。统一放在一个地方管理起来也顺手。回头再看去掉百分号这件事本身不难难的是理解 Elementor 的渲染机制以及在不同场景下选对处理方法。如果说有什么更值得记住的经验那就是——先想清楚你要达到的最终视觉效果再决定是改 CSS、改 JS 还是干脆换一种实现方式。很多 Elementor 的使用者遇到问题就想着“用面板选项解决”但组件化的页面构建器终究会有面板没有覆盖到的地方这时候一点点前端基本功就是我们手里最可靠的工具。
返回列表