更新记录

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 类浮点尾差。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

无

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

无

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无

许可协议

MIT协议

暂无用户评论。