uniapp 小程序 textarea 层级穿透,聚焦光标位置错误怎么办?
前言
在开发微信小程序时,使用 textarea 组件可能会遇到一些棘手的问题。最近我在使用 uniapp 开发微信小程序时,就遇到了两个非常令人头疼的问题:
- 层级穿透:由于
textarea是原生组件,任何元素都无法遮盖住它。当其他元素与textarea重叠时,就会出现层级穿透的问题。特别是在弹窗中使用textarea时,如果弹窗有动画效果,textarea会在动画执行期间显示在页面右上角,导致视觉效果非常差。如果等到动画结束后再显示textarea,又会出现突然弹出的效果,影响用户体验。 - 光标位置不正确:在 iOS 设备上,
textarea的光标默认会出现在文本的最前面。当文本较长时,点击文本中间位置时光标仍然会出现在最前面,弹出键盘后很难重新定位到需要编辑的位置,使用体验非常糟糕。
为了解决这些问题,我尝试了多种方案,但效果都不尽如人意。最终,我发现可以使用 editor 富文本编辑器组件来替代 textarea,它不仅解决了上述问题,还提供了更多的自定义选项。
封装 Editor 组件
editor 富文本编辑器组件不仅可以实现多行文本输入,还能避免层级穿透和光标位置错误的问题,甚至可以自定义光标的颜色。
官方对 editor 组件的介绍如下:
富文本编辑器,可以对图片、文字格式进行编辑和混排。
既然 editor 是一个富文本编辑器,那么它自然可以处理带有格式的文本。我们可以通过降级使用,将其作为一个普通的文本输入框,输入和输出的内容都是纯文本。
我的实现代码如下:
<template><view class="relative"><!-- 编辑器区域 --><editor:id="editorId":model-value="htmlContent"class="w-full bg-gray-50/50 rounded-xl p-3 text-sm min-h-[120px] text-base":placeholder="placeholder || '请输入内容...'"@ready="onEditorReady"@input="handleInput":read-only="isReadOnly"/></view>
</template><script setup lang="ts">
import { EditorContext } from '@/types/global'
import nanoid from '@/utils/nanoid'const props = defineProps<{modelValue: stringplaceholder?: stringid?: string
}>()const emit = defineEmits<{(e: 'update:modelValue', value: string): void(e: 'blur'): void
}>()// 编辑器内部 HTML 内容
const htmlContent = ref(props.modelValue)
// 编辑器上下文
const editorCtx = ref<EditorContext | null>(null)
const isReadOnly = ref(true)// 生成唯一 id
const editorId = computed(() => props.id || `editor-${nanoid()}`)
const instance = getCurrentInstance()// 初始化编辑器
const onEditorReady = () => {uni.createSelectorQuery().in(instance).select(`#${editorId.value}`).context((res: any) => {editorCtx.value = res.context// 只设置初始内容,不自动聚焦if (editorCtx.value && props.modelValue) {editorCtx.value.setContents({ html: props.modelValue })}isReadOnly.value = false}).exec()
}// 处理输入
const handleInput = (e: any) => {// 保存 HTML 内容htmlContent.value = e.detail.html || ''// 向外发送纯文本emit('update:modelValue', e.detail.text || '')
}defineExpose({editorCtx,
})
</script><style scoped>
:deep([id^='editor']) {caret-color: rgb(99, 102, 241);
}
</style>
如果你有需要可以直接复制使用,作为组件引入。这里面有几个注意点我介绍一下:
- 默认的
readonly是true,在编辑器准备完成后修改为true,这个逻辑是因为setContent设置内容时会自动聚焦,设置为readonly: false就不会触发自动聚焦了,如果你需要自动聚焦可以将这段逻辑移除掉。 - 默认暴露了
editorCtx如果你想主动修改编辑器内容可以触发editorCtx.setContent去修改,而不是直接修改modelValue,因为内部并没有监听modelValue的实时变化去修改编辑器,避免多处地方同时修改编辑器内容。 :deep([id^='editor']) { caret-color: rgb(99, 102, 241); }:用于修改编辑器中光标颜色,因为我这里支持自定义id,所以匹配了所有editor前缀。
通过将 textarea 替换为 editor 后,你会发现效果都是一样的,而且在 ios 端的使用体验会好很多,手指点击哪里,光标的默认位置就在哪里,在效果如下图所示。
💡注意点:
editor组件在focus时在 ios 设备上是不会获取到键盘高度的,因此如果你有工具栏放在键盘上的需求,在替换组件时需要慎重考虑。
总结
如果你想查看 editor 组件的实际效果,可以搜索学习卡盒小程序,在卡片页面长按编辑尝试一下,看看效果是否符合你的需求。希望这篇文章能帮助你解决遇到的问题。如果对你有帮助,欢迎点赞支持!
相关文章:
uniapp 小程序 textarea 层级穿透,聚焦光标位置错误怎么办?
前言 在开发微信小程序时,使用 textarea 组件可能会遇到一些棘手的问题。最近我在使用 uniapp 开发微信小程序时,就遇到了两个非常令人头疼的问题: 层级穿透:由于 textarea 是原生组件,任何元素都无法遮盖住它。当其…...
汽车 SOA 架构下的信息安全新问题及对策漫谈
摘要:随着汽车行业的快速发展,客户和制造商对车辆功能的新需求促使汽车架构从面向信号向面向服务的架构(SOA)转变。本文详细阐述了汽车 SOA 架构的协议、通信模式,并与传统架构进行对比,深入分析了 SOA 给信…...
Unity-Mirror网络框架-从入门到精通之RigidbodyPhysics示例
文章目录 前言示例一、球体的基础配置二、三个球体的设置差异三、示例意图LatencySimulation前言 在现代游戏开发中,网络功能日益成为提升游戏体验的关键组成部分。本系列文章将为读者提供对Mirror网络框架的深入了解,涵盖从基础到高级的多个主题。Mirror是一个用于Unity的开…...
小程序如何引入腾讯位置服务
小程序如何引入腾讯位置服务 1.添加服务 登录 微信公众平台 注意:小程序要企业版的 第三方服务 -> 服务 -> 开发者资源 -> 开通腾讯位置服务 在设置 -> 第三方设置 中可以看到开通的服务,如果没有就在插件管理中添加插件 2.腾讯位置服务…...
H3CNE-12-静态路由(一)
静态路由应用场景: 静态路由是指由管理员手动配置和维护的路由 路由表:路由器用来妆发数据包的一张“地图” 查看命令: dis ip routing-table 直连路由:接口配置好IP地址并UP后自动生成的路由 静态路由配置: ip…...
多线程锁
在并发编程中,锁(Lock)是一种用于控制多个线程对共享资源访问的机制。正确使用锁可以确保数据的一致性和完整性,避免出现竞态条件(Race Condition)、死锁(Deadlock)等问题。Java 提供…...
ZooKeeper 核心知识全解析:架构、角色、节点与应用
1.ZooKeeper 分布式锁怎么实现的 ZooKeeper 是一个高效的分布式协调服务,它提供了简单的原语集来构建更复杂的同步原语和协调数据结构。利用 ZooKeeper 实现分布式锁主要依赖于它的顺序节点(Sequential Node)特性以及临时节点(Ep…...
笔记本电脑 选购 回收 特权模式使用 指南
笔记本电脑 factor 无线网卡:有些笔记本无法检测到特定频段的信息,会导致连不上校园网 sudo iwlist wlp2s0 scan | grep Frequency > net.txt cat net.txt>表示用终端输出覆盖后续文件,>>表示添加到后续文件的末尾 一种更简…...
2023-2024 学年 广东省职业院校技能大赛(高职组)“信息安全管理与评估”赛题一
2023-2024 学年 广东省职业院校技能大赛(高职组“信息安全管理与评估”赛题一) 模块一:网络平台搭建与设备安全防护第一阶段任务书任务 1:网络平台搭建任务 2:网络安全设备配置与防护DCRS:DCFW:DCWS:DCBC:WAF: 模块二:网络安全事件…...
C#补充----反射,特性,迭代器,特殊语法,值类型运用类型。
1.反射:通过type 获取类中的数据。创建实例,并赋值。 《1》获取类的方式 《2》反射的应用 <1>获取类型的所有公共成员 <2>获取构造函数 <3>获取类型的 公共成员变量 <4>获取类型的 公共方法 <5>.获取类型的 属性 <6&g…...
深度学习核函数
一、核函数的基本概念 核函数在机器学习中具有重要应用价值,常用于支持向量机(SVM)等算法中。 核函数是面试中经常被考到的知识点,对于找工作和实际数据转换都有重要作用。 二、数据建模与核函数的作用 数据越多,可…...
Spring MVC流程一张图理解
由于现在项目中大部分都是使用springboot了,但是ssm中的springmvc还是可以了解一下 1 、用户发送请求至前端控制器 DispatcherServlet 。 2 、 DispatcherServlet 收到请求调用 HandlerMapping 处理器映射器。 3 、处理器映射器找到具体的处理器 ( 可以根据 xml 配…...
计算机网络速成
前言:最近在做一些动态的crypto,但是配置总搞不好,正好也有学web的想法,就先学学web再回去做密码,速成视频推荐b站建模老哥 目录 计算机网络概述网络的范围分级电路交换网络(电路交换)报文交换网…...
spring.profiles.active不同优先级
1、在editConfiguration中配置profiles.activedev会同时影响项目取application-dev.properties、bootstrap-dev.yaml,且这种方式优先级最高,会覆盖application.properties、bootstrap.yaml中的spring.profiles.active配置 2、在application.properties配…...
我这不需要保留本地修改, 只需要拉取远程更改
如果你不需要保留本地修改,只需要拉取远程更改并强制将本地分支与远程分支同步,可以按照以下步骤操作: 1. 丢弃本地修改 首先,丢弃所有本地未提交的修改: git reset --hard这会重置工作目录和暂存区,丢弃…...
源码编译安装httpd 2.4,提供系统服务管理脚本并测试(两种方法实现)
下载 httpd 2.4 源码: wget https://dlcdn.apache.org/httpd/httpd-2.4.x.tar.gztar -zxvf httpd-2.4.x.tar.gzcd httpd-2.4.x配置、编译和安装: ./configure --prefix/usr/local/apache2 --enable-so --enable-ssl --enable-cgi makesudo make install实…...
深度学习在自动化测试中的创新应用:提升运维效率与质量
《深度学习在自动化测试中的创新应用:提升运维效率与质量》 一、引言 在当今快速发展的软件行业中,自动化测试是确保软件质量和可靠性的关键环节。随着软件系统的日益复杂,传统的自动化测试方法在处理复杂场景、提高测试覆盖率和准确性方面面临着诸多挑战。深度学习作为人…...
单独编译QT子模块
单独编译QT子模块 系统 win qt-everywhere-src-5.12.12 下载源码: https://download.qt.io/archive/qt/5.12/5.12.12/single/ 参考: https://doc.qt.io/qt-5/windows-building.html 安装依赖 https://doc.qt.io/qt-5/windows-requirements.html Per…...
学习华为熵减:激发组织活力(系列之三)
目录 为什么学习华为? 学习华为什么? 一、势:顺势而为,在风口上猪都会飞起来。 二、道:就是认识和利用规律层面,文化和制度创新就是企业经营之道。 三、法:就是一套价值管理的变革方法论。…...
CNCF云原生计算基金会
CNCF,全称为云原生计算基金会(Cloud Native Computing Foundation),成立于2015年,是一个隶属于Linux基金会的非营利组织。CNCF旨在促进和支持开源技术的发展,特别是那些支持云原生(cloud native…...
基于Arduino与应变片传感器的高精度厨房电子秤DIY全攻略
1. 项目概述:用Arduino打造一台高精度厨房电子秤作为一个喜欢在厨房里折腾的硬件爱好者,我经常遇到需要精确称量食材的场合。市面上的电子秤要么精度不够,要么价格不菲,要么功能单一。于是,我萌生了自己动手做一台的想…...
3分钟掌握HashCalculator:你的文件完整性守护专家
3分钟掌握HashCalculator:你的文件完整性守护专家 【免费下载链接】HashCalculator 哈希值计算工具,批量计算/批量校验/查找重复文件/改变哈希值等,支持集成到系统右键菜单 项目地址: https://gitcode.com/gh_mirrors/ha/HashCalculator …...
使用TaotokenCLI工具一键配置开发环境中的API密钥
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用Taotoken CLI工具一键配置开发环境中的API密钥 在团队协作或个人开发中,为每个项目或成员手动配置大模型API密钥和…...
毕业设计 yolov11骨折检测医疗辅助系统(源码+论文)
文章目录 0 前言1 项目运行效果2 课题背景2.1 研究背景2.2 国内外研究现状2.3 研究意义 3 设计框架(骨折检测系统设计框架说明)3.1. 系统架构图3.2. 技术选型3.2.1 核心组件3.2.2 辅助工具 3.3. 核心模块设计3.3.1 YOLO模型训练模块训练流程图关键伪代码…...
告别CAJ格式困扰:3分钟学会用开源工具将知网文献转为PDF
告别CAJ格式困扰:3分钟学会用开源工具将知网文献转为PDF 【免费下载链接】caj2pdf Convert CAJ (China Academic Journals) files to PDF. 转换中国知网 CAJ 格式文献为 PDF。佛系转换,成功与否,皆是玄学。 项目地址: https://gitcode.com/…...
特定任务需求场景下的过约束并联机构构型设计与控制方法【附代码】
✨ 长期致力于曲面加工、构型综合、运动学和动力学建模、性能评价、多目标优化、滑模控制、鲁棒控制、视觉传感技术研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (…...
Claude Code用户告别封号与Token焦虑,无缝切换至Taotoken平台
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Claude Code用户告别封号与Token焦虑,无缝切换至Taotoken平台 对于依赖Claude Code进行编程辅助的开发者而言ÿ…...
告别KITTI!用TartanAir数据集在Unreal Engine+AirSim里复现那些让VSLAM算法“翻车”的雨天和黑夜
超越KITTI:用TartanAir数据集在虚拟极端环境中锤炼VSLAM算法当视觉SLAM算法在KITTI数据集上取得95%的准确率时,开发者们常常会松一口气——直到这些算法被部署到真实世界的雨夜街道上。突然之间,那些在阳光明媚的德国道路上表现优异的特征点检…...
为什么你的Midjourney雾效总像“水汽”而非“山岚”?——资深CG总监拆解大气散射物理模型在--v 6.1中的3层映射偏差
更多请点击: https://kaifayun.com 第一章:为什么你的Midjourney雾效总像“水汽”而非“山岚”? Midjourney 生成的雾气常呈现为均匀、半透明、边界模糊的“水汽感”——厚重、潮湿、缺乏层次与呼吸感。这并非模型能力不足,而是提…...
3步开启Windows 11安卓应用新体验:WSA完整使用指南
3步开启Windows 11安卓应用新体验:WSA完整使用指南 【免费下载链接】WSA Developer-related issues and feature requests for Windows Subsystem for Android 项目地址: https://gitcode.com/gh_mirrors/ws/WSA Windows Subsystem for Android(简…...
