在uni-app项目中自定义角标数字键盘弹窗的实现方案

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

在 uni-app 项目开发中,经常会遇到需要输入角标数字(如下标、上标)的场景(例如化学公式、数学表达式、特殊标注等)。UniApp 原生键盘不支持角标数字输入,因此本文将分享一个自定义角标数字键盘弹窗的实现方案,支持上标数字(1234567890)和负号(-)输入,可直接集成到项目中使用。

一、组件功能说明

  1. 支持 0-9 上标数字(1234567890)和上标负号(-)输入
  2. 弹窗从底部弹出,支持自定义弹窗高度
  3. 点击键盘按钮触发输入事件,通过回调返回选中的角标字符
  4. 支持手动控制弹窗的打开和关闭
  5. 适配 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 说明

名称类型说明
heightProp(String)弹窗高度,默认 400rpx
handleInputEvent键盘点击回调,返回两个参数:value(选中的角标字符)、attr(打开弹窗时传递的属性标识)
openMethod(String)打开弹窗,参数为当前操作的属性标识(可选)
closeMethod关闭弹窗

四、组件优化与扩展建议

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-popupanimation 属性配置)
  • 优化触摸反馈,避免快速点击导致的重复触发

五、注意事项

  1. 组件依赖 uni-popup 组件(uni-app 内置组件),无需额外安装
  2. 角标字符为 Unicode 编码,确保项目字体支持该类字符显示(大部分现代字体均支持)
  3. 在多端运行时,需注意 uni-popup 组件的兼容性(UniApp 已做适配,无需额外处理)
  4. 如需在输入框中正确显示角标,确保输入框支持 HTML 实体或 Unicode 字符渲染(普通输入框均支持)

六、总结

本文实现的角标数字键盘弹窗组件具有轻量、易用、可扩展的特点,可快速集成到 uni-app 项目中解决角标输入需求。通过简单的扩展,还可支持更多类型的角标输入,满足不同场景的使用需求。如果在使用过程中有任何问题或优化建议,欢迎留言交流!

以上就是在uni-app项目中自定义角标数字键盘弹窗的实现方案的详细内容,更多关于uni-app自定义角标数字键盘弹窗的资料请关注脚本之家其它相关文章!

相关文章

  • 在JS中如何使用css变量详解

    在JS中如何使用css变量详解

    这篇文章主要给大家介绍了关于如何在JS中如何使用css变量以及export之javascript关键字的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-09-09
  • 前端date.locale is not a function错误的简单解决办法

    前端date.locale is not a function错误的简单解决办法

    这篇文章主要给大家介绍了关于前端date.locale is not a function错误的简单解决办法,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • Javascript中的prototype与继承

    Javascript中的prototype与继承

    本文主要介绍了Javascript中的prototype与继承,具有一定的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • Javascript 关于基本类型和引用类型的个人理解

    Javascript 关于基本类型和引用类型的个人理解

    这篇文章主要介绍了Javascript 关于基本类型和引用类型的个人理解,需要的朋友可以参考下
    2019-11-11
  • JavaScript高级 ES7-ES13 新特性详解

    JavaScript高级 ES7-ES13 新特性详解

    这篇文章主要介绍了JavaScript高级 ES7-ES13 新特性详解,本文结合实例代码给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • JavaScript DOM节点添加示例

    JavaScript DOM节点添加示例

    本节为大家介绍下JavaScript DOM节点添加,将node里面的str放到h1段落中使之成为h1的新段落
    2014-07-07
  • JavaScript 中的六种循环方法

    JavaScript 中的六种循环方法

    这篇文章主要介绍了JavaScript 中的六种循环方法,帮助大家更好的理解和使用JavaScript,感兴趣的朋友可以了解下
    2021-01-01
  • Js参数RSA加密传输之jsencrypt.js的使用

    Js参数RSA加密传输之jsencrypt.js的使用

    这篇文章主要介绍了Js参数RSA加密传输之jsencrypt.js的使用,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • webpack 插件html-webpack-plugin的具体使用

    webpack 插件html-webpack-plugin的具体使用

    本篇文章主要介绍了webpack 插件html-webpack-plugin的具体使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • Web前端开发之水印、图片验证码

    Web前端开发之水印、图片验证码

    这篇文章主要介绍了Web前端开发之水印、图片验证码的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-11-11

最新评论