在uni-app项目中自定义角标数字键盘弹窗的实现方案
作者:Jiaberrr
在 uni-app 项目开发中,经常会遇到需要输入角标数字(如下标、上标)的场景(例如化学公式、数学表达式、特殊标注等),因此本文将分享一个自定义角标数字键盘弹窗的实现方案,需要的朋友可以参考下

在 uni-app 项目开发中,经常会遇到需要输入角标数字(如下标、上标)的场景(例如化学公式、数学表达式、特殊标注等)。UniApp 原生键盘不支持角标数字输入,因此本文将分享一个自定义角标数字键盘弹窗的实现方案,支持上标数字(1234567890)和负号(-)输入,可直接集成到项目中使用。
一、组件功能说明
- 支持 0-9 上标数字(1234567890)和上标负号(-)输入
- 弹窗从底部弹出,支持自定义弹窗高度
- 点击键盘按钮触发输入事件,通过回调返回选中的角标字符
- 支持手动控制弹窗的打开和关闭
- 适配 UniApp 多端运行(H5、小程序、App 等)
二、完整组件代码
<template>
<!-- 底部弹窗容器,使用 uni-popup 实现弹窗基础功能 -->
<uni-popup
ref="popup"
type="bottom"
background-color="#fff"
borderRadius="60rpx 60rpx 0 0"
>
<!-- 键盘容器,支持自定义高度和内边距 -->
<view
class="w-p-100 mt-30 pr-15 pl-15 pb-15 border-box overflow-y"
:style="{height:height}"
>
<!-- 键盘按钮区域,使用 grid 布局实现6列均匀分布 -->
<view class="keyboard-content h-p-100">
<view
v-for="item in charts"
:key="item.id"
class="key-item"
@click="handleInput(item.value)"
>
{{item.value}}
</view>
</view>
</view>
</uni-popup>
</template>
<script setup>
import { ref } from 'vue'
// 弹窗实例引用,用于控制弹窗打开/关闭
const popup = ref(null)
// 组件 props 定义
const props = defineProps({
// 弹窗高度,默认 400rpx
height: {
type: String,
default: '400rpx'
},
})
// 角标键盘数据(上标数字 + 上标负号)
const charts = [
{ id: 1, value: '¹', type: 'up' },
{ id: 2, value: '²', type: 'up' },
{ id: 3, value: '³', type: 'up' },
{ id: 4, value: '⁴', type: 'up' },
{ id: 5, value: '⁵', type: 'up' },
{ id: 6, value: '⁶', type: 'up' },
{ id: 7, value: '⁷', type: 'up' },
{ id: 8, value: '⁸', type: 'up' },
{ id: 9, value: '⁹', type: 'up' },
{ id: 10, value: '⁰', type: 'up' },
{ id: 11, value: '⁻', type: 'up' } // 上标负号
]
// 定义组件事件,用于向父组件传递输入结果
const emit = defineEmits(['handleInput'])
// 记录当前操作的属性(可选,用于父组件区分多个输入场景)
const attrbuteHandle = ref('')
/**
* 打开弹窗
* @param {String} attrbute - 可选参数,标识当前操作的输入字段
*/
const open = (attrbute) => {
attrbuteHandle.value = attrbute
popup.value.open()
}
/**
* 关闭弹窗
*/
const close = () => {
popup.value.close()
}
/**
* 处理键盘点击事件
* @param {String} value - 选中的角标字符
*/
const handleInput = (value) => {
// 向父组件发射事件,传递选中的字符和当前操作的属性
emit('handleInput', value, attrbuteHandle.value)
}
// 暴露组件方法,允许父组件调用 open 和 close
defineExpose({
open,
close
})
</script>
<style scoped>
/* 键盘容器样式:网格布局 + 背景色 + 边框圆角 */
.keyboard-content {
background-color: #f5f5f5;
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr; /* 6列均匀分布 */
border: 1px solid #ccc;
border-radius: 10rpx;
}
/* 键盘按钮样式:居中对齐 + 边框 + 圆角 + 间距 */
.key-item {
box-sizing: border-box;
height: 70rpx;
text-align: center;
line-height: 70rpx;
border: 1px solid #dcdfe6;
border-radius: 4px;
margin: 20rpx;
background-color: #fff;
transition: background-color 0.2s;
}
/* 按钮点击反馈 */
.key-item:active {
background-color: #e8f4f8;
border-color: #409eff;
}
/* 辅助样式(适配 UniApp 尺寸单位) */
.w-p-100 { width: 100%; }
.h-p-100 { height: 100%; }
.mt-30 { margin-top: 30rpx; }
.pr-15 { padding-right: 15rpx; }
.pl-15 { padding-left: 15rpx; }
.pb-15 { padding-bottom: 15rpx; }
.border-box { box-sizing: border-box; }
</style>
三、组件使用方法
1. 引入组件
在需要使用角标键盘的页面中引入组件:
<template>
<view class="container">
<!-- 示例:输入框 + 打开键盘按钮 -->
<view class="input-group">
<input
v-model="inputValue"
placeholder="点击下方按钮输入角标"
class="input"
/>
<button @click="openSubscriptKeyboard">打开角标键盘</button>
</view>
<!-- 引入角标键盘组件 -->
<subscript-keyboard
ref="subscriptKeyboard"
height="450rpx" <!-- 自定义弹窗高度 -->
@handleInput="handleSubscriptInput"
/>
</view>
</template>
<script setup>
import { ref } from 'vue'
// 引入组件(根据实际文件路径调整)
import SubscriptKeyboard from '@/components/SubscriptKeyboard/SubscriptKeyboard.vue'
const inputValue = ref('')
const subscriptKeyboard = ref(null)
/**
* 打开角标键盘
*/
const openSubscriptKeyboard = () => {
// 可传递参数标识当前操作的输入字段(如多个输入框时使用)
subscriptKeyboard.value.open('inputValue')
}
/**
* 处理角标输入回调
* @param {String} value - 选中的角标字符
* @param {String} attr - 当前操作的属性名
*/
const handleSubscriptInput = (value, attr) => {
// 将选中的角标字符拼接到输入框
inputValue.value += value
// 如需自动关闭弹窗,可添加:subscriptKeyboard.value.close()
}
</script>
<style scoped>
.container {
padding: 50rpx;
}
.input-group {
margin-bottom: 30rpx;
}
.input {
border: 1px solid #ccc;
border-radius: 8rpx;
padding: 15rpx;
margin-bottom: 20rpx;
}
button {
background-color: #409eff;
color: #fff;
border: none;
border-radius: 8rpx;
padding: 15rpx;
}
</style>
2. 核心 API 说明
| 名称 | 类型 | 说明 |
|---|---|---|
| height | Prop(String) | 弹窗高度,默认 400rpx |
| handleInput | Event | 键盘点击回调,返回两个参数:value(选中的角标字符)、attr(打开弹窗时传递的属性标识) |
| open | Method(String) | 打开弹窗,参数为当前操作的属性标识(可选) |
| close | Method | 关闭弹窗 |
四、组件优化与扩展建议
1. 样式优化
- 可根据项目设计风格修改按钮颜色、圆角、间距等样式
- 增加按钮禁用状态(如需)
- 适配深色模式,可通过 CSS 变量动态切换样式
2. 功能扩展
- 支持下标数字:在
charts数组中添加下标数字(₀₁₂₃₄₅₆₇₈₉₋),并通过type区分上标/下标,在父组件中控制显示类型 - 添加删除键:增加删除按钮,点击时删除最后一个输入的角标字符
- 支持字母角标:扩展
charts数据,添加上标/下标字母(如 ᵃᵇᶜ、ₐᵦᵧ 等) - 自定义角标集合:通过 Prop 传递自定义角标数据,使组件更灵活
示例扩展(支持上标/下标切换):
// 扩展 charts 数据
const charts = [
// 上标数字
{ id: 1, value: '¹', type: 'up' },
// ... 其他上标数据
// 下标数字
{ id: 12, value: '₁', type: 'down' },
// ... 其他下标数据
]
// 添加 Prop 控制显示类型
const props = defineProps({
// ... 原有 props
type: {
type: String,
default: 'up', // up-上标,down-下标
validator: (value) => ['up', 'down'].includes(value)
}
})
// 渲染时根据 type 过滤数据
const displayCharts = computed(() => {
return charts.filter(item => item.type === props.type)
})
3. 性能优化
- 对
charts数据进行静态化处理,避免重复创建 - 增加弹窗打开/关闭的动画效果(可通过
uni-popup的animation属性配置) - 优化触摸反馈,避免快速点击导致的重复触发
五、注意事项
- 组件依赖
uni-popup组件(uni-app 内置组件),无需额外安装 - 角标字符为 Unicode 编码,确保项目字体支持该类字符显示(大部分现代字体均支持)
- 在多端运行时,需注意
uni-popup组件的兼容性(UniApp 已做适配,无需额外处理) - 如需在输入框中正确显示角标,确保输入框支持 HTML 实体或 Unicode 字符渲染(普通输入框均支持)
六、总结
本文实现的角标数字键盘弹窗组件具有轻量、易用、可扩展的特点,可快速集成到 uni-app 项目中解决角标输入需求。通过简单的扩展,还可支持更多类型的角标输入,满足不同场景的使用需求。如果在使用过程中有任何问题或优化建议,欢迎留言交流!
以上就是在uni-app项目中自定义角标数字键盘弹窗的实现方案的详细内容,更多关于uni-app自定义角标数字键盘弹窗的资料请关注脚本之家其它相关文章!
