vue 数字软键盘 插件 封装 可拖动

1、效果图 

4341ddb9a2c64ad194c71f6d4d8ea940.gif

2、使用方式

<Keyboard v-if="show" @close="show = false" :inputDom="$refs.input" />

封装的数字键盘 Keyboard.vue 组件代码

<template><divclass="keyboard"ref="keyboard":style="{ left: moveX + 'px', bottom: moveY + 'px' }"><div class="drag" @mousedown="keyDown"><p></p><div @click="$emit('close')" @mousedown.stop @mousemove.stop><img src="./arrow.svg" alt="" /></div></div><div class="main"><div class="left"><divv-for="text in symbols":key="text"@click="insertTxtAndSetcursor(text)">{{ text }}</div></div><div class="right"><div class="left"><divclass="item"v-for="i in 9":key="i"@click="insertTxtAndSetcursor(i)">{{ i }}</div></div><div class="right"><div class="item" @click="insertTxtAndSetcursor('', true)"><img src="./delete.svg" alt="" /></div><div class="item" @click="insertTxtAndSetcursor(' ')"><img src="./blank.svg" alt="" /></div><div class="item" @click="insertTxtAndSetcursor(0)">0</div></div></div></div></div>
</template><script scoped>
export default {data() {return {symbols: ["+", "-", "=", ".", "/", "@"],flag: false,seto: null,downInfo: {},moveX: 0,moveY: 0,};},props: {inputDom: {type: Node,default: null,},},mounted() {document.addEventListener("mousemove", this.keyMove);},methods: {// 输入文本insertTxtAndSetcursor(text, del) {let element = this.inputDom; // 获取到指定标签let startPos = element.selectionStart; // 获取光标开始的位置let endPos = element.selectionEnd; // 获取光标结束的位置if (startPos === undefined || endPos === undefined) return; // 如果没有光标位置 不操作let oldTxt = element.value; // 获取输入框的文本内容let result = "";// 光标位置不能小于0const num = startPos - 1;if (del && num >= 0) {result = oldTxt.substring(0, startPos - 1) + oldTxt.substring(endPos); // 将文本插入} else {result =oldTxt.substring(0, startPos) + text + oldTxt.substring(endPos); // 将文本插入}element.value = result; // 将拼接好的文本设置为输入框的值element.focus(); // 重新聚焦输入框if (del && num >= 0) {element.selectionStart = startPos - 1 + (text + "").length; // 设置光标开始的位置element.selectionEnd = startPos - 1 + (text + "").length; // 设置光标结束的位置} else {element.selectionStart = startPos + (text + "").length; // 设置光标开始的位置element.selectionEnd = startPos + (text + "").length; // 设置光标结束的位置}},keyUp() {this.flag = false;document.removeEventListener("mouseup", this.keyUp);document.removeEventListener("mouseleave", this.keyUp);},keyDown(e) {this.downInfo.x = e.pageX;this.downInfo.y = e.pageY;this.downInfo.left = this.moveX;this.downInfo.bottom = this.moveY;this.seto = setTimeout(() => {this.flag = true;document.addEventListener("mouseup", this.keyUp);document.addEventListener("mouseleave", this.keyUp);clearTimeout(this.seto);}, 1000);},keyMove(e) {if (this.flag) {const maxh =(document.clientHeight ||document.documentElement.clientHeight ||document.body.clientHeight) - this.$refs.keyboard.clientHeight;const htj = this.downInfo.bottom + this.downInfo.y - e.pageY;const maxw =(document.clientWidth ||document.documentElement.clientWidth ||document.body.clientWidth) - this.$refs.keyboard.clientWidth;const wtj = this.downInfo.left - (this.downInfo.x - e.pageX);if (wtj <= maxw && wtj >= 0) {//确保键盘始终在屏幕可见范围内this.moveX = wtj;}if (htj <= maxh && htj >= 0) {//确保键盘始终在屏幕可见范围内this.moveY = htj;}}},},
};
</script><style lang="scss" scoped>
.keyboard {width: 100vw;height: 245px;max-width: 353px;min-width: 285px;position: fixed;bottom: 0;left: 0;background-color: #d6d7db;> .drag {width: 100%;height: 15%;display: flex;align-items: center;justify-content: center;position: relative;> p {width: 30%;height: 13%;border-radius: 5px;background-color: #fff;}> div {width: 18.3%;height: 100%;position: absolute;top: 50%;right: 0;transform: translateY(-50%);&::before {width: 1px;content: "";height: 60%;background-color: #fff;position: absolute;top: 50%;left: 0;transform: translateY(-50%);}> img {user-select: none;width: 45%;position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);}}}> .main {height: calc(100% - 15%);display: flex;justify-content: space-between;padding: 2%;> .left {flex: 15;margin-right: 2%;height: 100%;border-radius: 6px;background-color: #fff;overflow: auto;user-select: none;&::-webkit-scrollbar {display: none;}> div {font-size: 20px;height: 25%;display: flex;align-items: center;justify-content: center;&:active {background-color: #a1a8b8;}}}> .right {height: 100%;border-radius: 5px;flex: 77;display: flex;justify-content: space-between;user-select: none;> .left {height: 100%;display: flex;flex-wrap: wrap;justify-content: space-between;align-content: space-between;width: 77%;> .item {background-color: #fff;height: 30.8%;width: 31.5%;display: flex;align-items: center;justify-content: center;border-radius: 5px;font-size: 18px;&:active {background-color: #adb4be;}&:nth-of-type(3n) {margin-right: 0;}&:nth-of-type(7),&:nth-of-type(8),&:nth-of-type(9) {margin-bottom: 0;}}}> .right {width: 21%;height: 100%;display: flex;flex-direction: column;justify-content: space-between;> .item {border-radius: 5px;display: flex;align-items: center;justify-content: center;height: 30.8%;background-color: #adb4be;> img {width: 40%;}&:active {background-color: #7e8492;}}}}}
}
</style>

3、使用方式代码 

<template><div id="app"><input ref="input" type="text" @focus="show = true" v-model="text" /><Keyboard v-if="show" @close="show = false" :inputDom="$refs.input" /></div>
</template><script scoped>
import Keyboard from "./Keyboard.vue";
export default {components: { Keyboard },data() {return { show: false, text: "" };},
};
</script><style lang="scss" scoped>
#app {width: 100vw;height: 100vh;background-color: #000;> input {height: 25px;display: block;margin: 0 auto;}
}
</style>

4、完结 

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

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

相关文章

深入理解强化学习——马尔可夫决策过程:马尔可夫过程和马尔科夫链

分类目录&#xff1a;《深入理解强化学习》总目录 马尔可夫过程是一组具有马尔可夫性质的随机变量序列 S 1 , S 2 , ⋯ , S t S_1, S_2, \cdots, S_t S1​,S2​,⋯,St​&#xff0c;其中下一个时刻的状态 S t 1 S_{t1} St1​只取决于当前状态 S t S_t St​ 。我们设状态的历史…

计算机毕业设计 基于SpringBoot的在线考试系统的研究与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

伦敦金冬令时开市时间怎样调整

在刚刚过去的一周&#xff0c;欧美的金融市场已经正式进入了冬令时&#xff0c;这对伦敦金市场的交易时间也产生了影响。由于美国于今年11月5日(星期日&#xff09;开始正式实施冬令时间&#xff0c;所以香港的伦敦金平台的交易时间也随之而有所调整。 从今年11月6日开始&#…

二十七、W5100S/W5500+RP2040树莓派Pico<iperf 测速示例>

文章目录 1 前言2 简介2 .1 什么是网络测速技术&#xff1f;2.2 网络测速技术的优点2.3 网络测速技术数据交互原理2.4 网络测速应用场景 3 WIZnet以太网芯片4 示例概述以及使用4.1 流程图4.2 准备工作核心4.3 连接方式4.4 主要代码概述4.5 结果演示 5 注意事项6 相关链接 1 前言…

[Android]新建项目使用AppCompatActivity后运行闪退

报错 日志&#xff1a; Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity. FATAL EXCEPTION: main Process: com.example.gatestdemol, PID: 26071 java.lang.RuntimeException: Unable to start a…

《QT从基础到进阶·二十三》弹窗提示框QMessageBox和QCloseEvent事件

1、正常信息提示 QMessageBox::information(NULL, "Title", "Content", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);消息框按钮判断&#xff1a; if(QMessageBox::Ok QMessageBox::warning(this,"温馨提示","是否保存设置?…

ACM练习——第二天

今天又是一天课&#xff0c;满课&#xff0c;很累哈&#xff0c;计组真的挺难的&#xff0c;但是多学学还是可以学明白。行吧&#xff0c;继续进入今天的ACM练习&#xff0c;现阶段都是主要练习Java到C的语言过渡。 因为今天的题目多半都是昨天的延伸&#xff0c;我就不提供Jav…

Leetcode—4.寻找两个正序数组的中位数【困难】

2023每日刷题&#xff08;二十九&#xff09; Leetcode—4.寻找两个正序数组的中位数 直接法实现代码 int mid, mid1, mid2; bool findmid(int n, int k, int x) {if(n % 2 1) {if(k n / 2) {mid x;return true;}} else {if(k n / 2 - 1) {mid1 x;} else if(k n / 2) {…

【Linux】Ubuntu16.04系统查看已安装的python版本,及其配置

前情提示&#xff1a;我已经在Ubuntu16.04里用源码安装了python3.8.11&#xff0c;Ubuntu16.04系统默认安装2.7.12与3.5.2 1.查看已安装版本 python2 --version #查看python2安装版本 python3 --version #查看python3安装版本 python3.5 --version #查看python3.5安装…

【C++】:STL——标准模板库介绍 || string类

&#x1f4da;1.什么是STL STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且 是一个包罗数据结构与算法的软件框架 &#x1f4da;2.STL的版本 原始版本 Alexander Stepanov、Meng Lee 在…

基于 Redis 实现的分布式锁

获取锁 互斥&#xff1a;确保只有一个线程获得锁 # 添加锁 利用setnx的互斥性 127.0.0.1:6379> setnx lock thread1释放锁 手动释放锁 超时释放&#xff1a;获取锁时设置一个超时时间 #释放锁 删除即可 127.0.0.1:6379> del lock两步合成一步 help setSET key value …

hive里因为列名用了关键字导致建表失败

代码 现象 ParseException line 6:4 cannot recognize input near percent String COMMENT in column name or primary key or foreign key 23/11/13 11:52:57 ERROR org.apache.hadoop.hive.ql.Driver: FAILED: ParseException line 6:4 cannot recognize input near percent …