更新记录
1.1.0(2026-10-31) 下载此版本
- 改为 uni_modules 规范结构(
uni_modules/czh-calculator),支持插件市场一键导入、从市场更新与新旧代码对比 - 根号键图标改为插件自带
static/img/calc-root.png,组件内用相对路径引用,导入后不需要再单独往项目里拷图 - 补充
package.json,声明插件分类与平台兼容性(uni-app x:App 三端支持) - 组件契约(
calculatorOn/calculatorSettingChanged/appWindowResize)、无 Props、样式与 1.0.0 一致,无破坏性变更
平台兼容性
uni-app x(4.71)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ |
其他
| 多语言 | 暗黑模式 | 宽屏模式 | 蒸汽模式 |
|---|---|---|---|
| × | × | √ | √ |
czh-calculator —— 悬浮计算器组件(uni-app x)
页面右下角悬浮计算器:CSS 绘制的计算器图标唤起 iOS 风格浮窗,图标与浮窗都可拖动、可收起;
支持连续运算、± 取反、百分比、括号、平方、乘方、开根号、除 0 报"错误"、结果四舍五入消除浮点尾差;
按键有按压反馈,÷ × - + 点后保持白底橙字的挂起态(对标苹果计算器);
浮窗与按键尺寸随窗口变化自适应。除根号键用一张 PNG(uni_modules/czh-calculator/static/img/calc-root.png)外,其余全 CSS 绘制。
纯 uvue 实现,无原生插件、无第三方依赖。easycom 直接使用:
<czh-calculator></czh-calculator>
安装
组件已按 uni_modules 规范发布,二选一:
- 插件市场:插件详情页点「使用 HBuilderX 导入插件」,选择目标项目,导入后自动落在
uni_modules/czh-calculator; - 手动:把
uni_modules/czh-calculator整个目录复制到项目根目录的uni_modules下。
uni_modules/czh-calculator/
├─ package.json
├─ readme.md
├─ changelog.md
├─ components/czh-calculator/czh-calculator.uvue
└─ static/img/calc-root.png 根号键图标,组件内相对路径引用
组件位于 uni_modules/*/components/组件名/组件名.uvue,符合 easycom 自动扫描规则:页面里直接写 <czh-calculator>,不需要 import,也不需要注册。根号键图标随插件一起分发,不需要再往项目 static 里拷。
仅支持 uni-app x(uvue),不支持 uni-app(vue2/vue3)。
组件契约(宿主页面需满足)
组件无 props,显隐与尺寸由三条外部约定控制:
| 约定 | 类型 | 说明 |
|---|---|---|
calculatorOn |
本地存储 | '1' 显示悬浮图标,其它值/未设置不显示(默认关闭,按需开启) |
calculatorSettingChanged |
uni.$emit 广播 | 设置侧切换 calculatorOn 后广播,组件实时刷新显隐(关闭时同时收起浮窗) |
appWindowResize |
uni.$emit 广播 | 页面 时广播,组件重算浮窗/按键尺寸(横竖屏、分屏自适应) |
// 设置侧:写入开关后广播,组件立即刷新显隐
const Calculator = (e : UniSwitchChangeEvent) => {
uni.setStorageSync('calculatorOn', e.detail.value ? '1' : '0')
uni.$emit('calculatorSettingChanged')
}
// 页面侧
(() => {
uni.$emit('appWindowResize')
})
布局参数
- 悬浮图标:
position: fixed+left/top动态定位,初始值等于right: 20px; bottom: 54px; 按下拖动超过 4px 算拖动,否则算点击展开; - 浮窗:同样
left/top动态定位,初始贴右下角 8px;在面板任意位置拖都行,位移超过 6px 算拖动, 拖动结束那一次click会被忽略(24 个按键回调都有panelDragMoved守卫); - 位置不缓存:图标每次挂载、浮窗每次打开都回到默认位置;拖动只在当前会话内有效, 窗口尺寸变化时按边界重新夹紧(顶部避开状态栏、底部扣安全区);
- 尺寸:面板宽度默认取窗口宽的 0.6、键径上限 62px、内边距 10px、键间距 8px, 360dp 屏上面板约 216×409;
- 长按左上角缩放:按下面板左上角 36px 方格约 350ms 后进入缩放,横向拖动即以右下角为锚点 按比例改面板宽度(键径、字号、显示区高度一起缩放),范围 0.4 ~ 0.8,默认 0.6; 长按未生效就滑开 12px 按取消处理;收起浮窗即丢弃缩放比例,下次打开仍是 0.6,不落盘;
- z-index:3050(高于常见弹层 1000x 与浮层 30xx;若与宿主页面的层级冲突,可用样式覆盖调整)。
按键反馈
- 24 个键按下即变亮,抬手后保留 100ms 再熄灭(uvue 下一帧才渲染,快速点按时
touchstart/touchend可能落在同一帧,不延迟就完全看不到反馈); 配色:数字键#333333 → #737373、灰键#a5a5a5 → #d4d4d2、橙键#ff9f0a → #ffb340; ÷ × - +另有挂起态(对标苹果计算器):点后该键保持 白底橙字 (#ffffff/#ff9f0a),直到点其它任意键(数字、小数点、AC、±、%、=、括号、x²、xʸ、√) 才熄灭;再点另一个运算符则高亮转移;- 状态只有一个
selectedOp:按键touchstart统一入口里判断"不是运算符键就清空",onOp末尾赋值,不需要在 10 个onXxx里逐个清;出错态setError也会清; - 拖动/缩放手势开始(
panelDragMoved置位)时清掉按压高亮,起点那个键不会一直亮着。
计算逻辑
- 最多 10 位输入(含小数点),显示字号按长度分四档自动缩小;
- 连续运算(1 + 2 × 3 按 = 前逐步求值,不处理乘除优先级)、± 取反、% 即时折算;
- 括号用栈实现(支持嵌套):
(把括号外算式压栈并清零,)先算括号内再与栈顶合并; x²、√是一元运算,直接作用于当前值(负数开根号报"错误");xʸ走Math.pow, 与四则混用;AC、=、出错都会清空括号栈;- 除 0 显示"错误",任意数字键重新开始;
- 结果按 1e-10 精度四舍五入,避免 0.1 + 0.2 类浮点尾差。

收藏人数:
下载插件并导入HBuilder
下载示例项目ZIP
赞赏(0)
下载 154
赞赏 0
下载 12730669
赞赏 1959
赞赏
京公网安备:11010802035340号