移动端按住说话样式

news/2024/11/15 11:25:07/文章来源:https://www.cnblogs.com/unique-yaobo/p/18547615

下面是最终效果,手指移出指定区域就改为取消状态,松开手指就取消,手指没有移出指定区域,状态为录音中,松开手指为结束录音状态

下面是代码

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>语音交互样式</title><style>body {font-family: Arial, sans-serif;display: flex;justify-content: center;align-items: center;height: 100vh;margin: 0;background-color: #f5f5f5;}.voice-container {position: relative;width: 200px;height: 200px;}/* 语音交互按钮 */.voice-btn {position: absolute;bottom: 20px;left: 50%;transform: translateX(-50%);width: 80px;height: 80px;background-color: #4CAF50;border-radius: 50%;display: flex;justify-content: center;align-items: center;color: white;font-size: 20px;cursor: pointer;transition: background-color 0.3s;}.voice-btn:active {background-color: #388E3C;}/* 正在语音识别的状态 */.voice-recognizing {position: absolute;bottom: 0;left: 50%;transform: translateX(-50%);width: 100%;height: 100px;background-color: rgba(0, 0, 0, 0.2);border-radius: 20px 20px 0 0;display: flex;justify-content: center;align-items: center;color: white;font-size: 16px;display: none; /* 默认隐藏 */transition: background-color 0.3s;}/* 预取消状态:当手指移出语音识别区域时,改变样式 */.voice-recognizing.canceling {background-color: rgba(255, 0, 0, 0.5); /* 改为红色表示预取消 */}/* 取消区域:顶部区域用于取消语音识别 */.cancel-area {position: absolute;top: 0;left: 50%;transform: translateX(-50%);width: 100%;height: 30px;background-color: rgba(255, 0, 0, 0.8); /* 红色背景 */color: white;text-align: center;line-height: 30px;font-size: 14px;display: none; /* 默认隐藏 */cursor: pointer;z-index: 1;}/* 取消区域显示 */.cancel-area.show {display: block;}/* 取消区域 hover 样式 */.cancel-area:hover {background-color: rgba(255, 0, 0, 1);}</style>
</head>
<body><div class="voice-container"><!-- 语音交互按钮 --><div class="voice-btn" id="voiceBtn">🎤</div><!-- 正在语音识别 --><div class="voice-recognizing" id="voiceRecognizing">正在识别...</div><!-- 取消区域 --><div class="cancel-area" id="cancelArea">松开手指取消语音识别</div></div><script>const voiceBtn = document.getElementById('voiceBtn');const voiceRecognizing = document.getElementById('voiceRecognizing');const cancelArea = document.getElementById('cancelArea');let isRecognizing = false;  // 标识当前是否正在识别let isTouching = false;     // 标识是否有触摸事件正在进行let touchStartY = 0;        // 记录触摸开始的位置let isCanceling = false;    // 标识是否进入预取消状态// 按下按钮开始语音识别voiceBtn.addEventListener('mousedown', startRecognition);voiceBtn.addEventListener('touchstart', startRecognition);function startRecognition(e) {e.preventDefault();  // 阻止默认事件,避免页面滚动等isRecognizing = true;voiceRecognizing.style.display = 'flex';  // 显示正在语音识别的状态cancelArea.classList.add('show');         // 显示取消区域isTouching = true;isCanceling = false;  // 初始状态不是预取消// 记录触摸开始的位置,用于判断手指滑动方向if (e.type === 'touchstart') {touchStartY = e.touches[0].clientY;}// 禁止页面滚动document.body.style.overflow = 'hidden';}// 松开按钮结束语音识别voiceBtn.addEventListener('mouseup', stopRecognition);voiceBtn.addEventListener('touchend', stopRecognition);function stopRecognition(e) {if (isRecognizing && isCanceling) {// 如果处于预取消状态,取消语音识别
        cancelRecognition();} else if (isRecognizing) {// 如果没有进入取消区域,正常结束语音识别
        finishRecognition();}isTouching = false;isCanceling = false;// 恢复页面滚动document.body.style.overflow = 'auto';}// 取消语音识别function cancelRecognition() {isRecognizing = false;voiceRecognizing.style.display = 'none';  // 隐藏正在识别状态cancelArea.classList.remove('show');      // 隐藏取消区域voiceRecognizing.classList.remove('canceling');  // 清除预取消状态样式alert('语音识别已取消');}// 完成语音识别function finishRecognition() {isRecognizing = false;voiceRecognizing.style.display = 'none';  // 隐藏正在识别状态cancelArea.classList.remove('show');      // 隐藏取消区域voiceRecognizing.classList.remove('canceling');  // 清除预取消状态样式alert('语音识别结束');}// 在触摸时,检测是否滑动出了 voice-recognizing 区域document.addEventListener('touchmove', handleTouchMove, { passive: false });function handleTouchMove(e) {e.preventDefault(); // 阻止默认的滚动行为if (isTouching) {const touch = e.touches[0];const recognizerRect = voiceRecognizing.getBoundingClientRect();// 判断手指是否离开了 voice-recognizing 区域if (touch.clientY < recognizerRect.top || touch.clientY > recognizerRect.bottom) {// 进入预取消状态if (!isCanceling) {voiceRecognizing.classList.add('canceling');  // 改为红色表示预取消isCanceling = true;}} else {// 手指回到识别区域,取消预取消状态if (isCanceling) {voiceRecognizing.classList.remove('canceling');isCanceling = false;}}}}// 取消区域的点击事件cancelArea.addEventListener('click', cancelRecognition);</script></body>
</html>

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/833935.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

联想 进入bios u盘启动

先插入u盘,再选择选项 thinkpad e485 , f12快速选择启动选项 , f1 进入bios其他 联想进入bios设置u盘启动,网上的博客资料中有这样一句话: “7、在Startup栏目中,找到“UEFI/Legacy Boot”选项,设置为“Legacy Only”,并将“CSM Support”设置为“YES”,然后找到“…

Mybatis-plus之新特性,你都用过哪些?

1.lambda方式查询 在使用Mybatis-plus进行查询时,我们正常的操作是创建一个QueryWrapper,然后根据字段去做查询操作(如下图)那么就有一个问题,每个数据库的字段都需要写出来,遇到驼峰字段还需要转换为下划线形式,非常影响开发效率。而官方也考虑到这个问题,后续的版本已…

KingbaseES V8R3集群运维案例之---集群恢复案例

KingbaseES、Kingbasecluster案例说明: KingbaseES V8R3流复制集群在专用机环境下,出现异常问题,恢复过程如下: 问题现象及解决方案: 1、现象一 如下所示,整个集群无法启动,选择其中一个节点作为主节点,数据库服务启动如下所示:解决方案: 将sys_xlog下的xxxxA.histor…

Exchange 2016部署实施案例篇-04.Ex基础配置篇(下)

上二篇我们对全新部署完成的Exchange Server做了基础的一些配置,今天继续基础配置这个话题。 DAG配置 先决条件首先在配置DGA之前我们需要确保DAG成员服务器上磁盘的盘符都是一样的,大小建议最好也相同。 其次我们需要确保有一块网卡用于数据复制使用(PS:单块网卡也可以,单…

YOLO系列技术细节(更新中)

相对于R-CNN、Fast RCNN的two-stage目标检测方式,即先在图像中提取候选框,再逐一对图像进行分类。候选框的生成可以是滑动窗口或选择性搜索,再对候选框进行非极大值抑制(一般只在推理时做非极大值抑制,训练时需要这些重复的框)。而YOLO则是one-stage的端到端形式:输入图…

Apple Logic Pro 11.1 - 专业音乐制作 (音频编辑)

Apple Logic Pro 11.1 - 专业音乐制作 (音频编辑)Apple Logic Pro 11.1 - 专业音乐制作 (音频编辑) Logic Pro 配备全新 AI 功能,引领音乐创作再上新阶 请访问原文链接:https://sysin.org/blog/apple-logic-pro/ 查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org…

【Civit3D 2025下载与安装教程】

1、安装包 「Civil3d_2025」: 链接:https://pan.quark.cn/s/b05281a72f24 提取码:PUWx 「Civil3D2020」: 链接:https://pan.quark.cn/s/61c01d7bd533 提取码:RbML 2、安装教程(建议关闭杀毒软件) 1) 双击Setup.exe安装,弹窗安装对话框2) 勾选‘我同意。。…

[Flask]SSTI 1

[Flask]SSTI 1 根据题目判断这是一道SSTI参数处理不当的漏洞,打开页面显示Hello guest,猜测参数名为user发现页面无任何变化,于是尝试name,成功回显尝试{{2*2}},页面显示4,存在SSTI注入构造payload,成功执行任意代码 # payload的解释:获取eval函数并执行任意代码?name=…

凯宇星辉:CRM助力实现数字化“领跑”转型

近日,第14届中国轻工业信息化大会及智能居家展洽会在重庆举行。会上同步发布了中国轻工业数字化转型“领跑者”相关案例成果287项,涉及家电、五金、照明、酿酒食品等行业,其中,纷享销客合作客户辽宁凯宇星辉实业集团有限公司(以下简称“凯宇星辉”)提报的《基于CRM系统的…

零售行业的高效法宝:项目管理软件的应用与选择

在零售行业,团队协作的效率直接影响到市场反应速度和客户满意度。商品的上下架、库存管理、促销活动的策划与执行、跨部门的沟通与协作……每一个环节都需要精准的协调。而在这些纷繁复杂的任务中,项目管理软件正成为零售行业的关键工具,帮助团队理清思路、优化流程、提升执…