vue实现一个获取按键展示快捷键效果的Input组件


Posted in Vue.js onJanuary 13, 2021

遇到一个需求,页面内要自定义快捷键,这就需要可以有地方设置和展示快捷键,找了一圈Element UI发现没有能稍微改改就能用的组件,所以自己动手写了一个。
这个只有快捷键展示功能,快捷键实际绑定生效的话是依赖传回的快捷键数据,由另外的组件处理的。目前只测试了Chrome的环境。

效果如下:

vue实现一个获取按键展示快捷键效果的Input组件

关键点

虽然看起来像是一个Input但在组件内实际上是展示一个标签效果,还需要有删除按钮。这就得在输入框内放下html代码,浏览器的Input组件显然不适合,这就只能自己仿一个类Input组件效果了。

focus、blur、选中高亮效果

非Input这类组件是没有focus、blur、选中高亮效果这些效果的,还好浏览器有预留实现方式,网上也早已有网友提供方案,在div里加上tabindex="0"属性,就能让div获得这些效果。

tabindex属性规定了Tab按键的顺序,写0的话是会按组件默认顺序被选中的,如果写-1则始终无法被选中。因为本身是仿Input组件形式,能被Tab获取也刚好很合理。

然后加上CSS的获取焦点的边框效果、鼠标移动到此显示文本类型指针

.shortcut-key-input {
 cursor: text;
 transition: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);
}
.shortcut-key-input:focus {
 border-color: #188cff;
 box-shadow: 0 0 4px rgba(24, 140, 255, 0.38);
}

文本提示

当没有内容时需要跟Input一样,可以默认显示文本提示。这也是放一个div在里面,用Vue控制,如果输出的标签变量有数据时,就不让此元素显示。

光标闪动效果

这个比较好处理,在类Input里面放一个伪元素,当获取焦点的时候添加此伪元素,然后再给此元素一个CSS3的动画,就有光标闪动的效果了。

@keyframes Blink {
 0% { opacity: 0; }
 100% { opacity: 1; }
}
.shortcut-key-input.cursor::after {
 content: "|";
 animation: Blink 1.2s ease 0s infinite;
 font-size: 18px;
 position: absolute;
 top: 1px;
 left: 8px;
}

按键捕获

按键捕获主要靠keydown事件,其中传回的event里会标记是否按下alt、ctrl(control)等信息,所以做组合按键依赖此信息就可以实现。
因为每次按键都会触发事件,所以要屏蔽掉功能键的事件。代码只实现了一个非功能键的组合,需要多功能键可以另外建立变量判断连续按键的情况然后处理。

handleKeydown(e) {
   const { altKey, ctrlKey, shiftKey, key, code } = e;
   if (!CODE_CONTROL.includes(key)) {
    if (!this.keyRange.includes(code)) return;
    let controlKey = "";
    [
     { key: altKey, text: "Alt" },
     { key: ctrlKey, text: "Ctrl" },
     { key: shiftKey, text: "Shift" }
    ].forEach(curKey => {
     if (curKey.key) {
      if (controlKey) controlKey += "+";
      controlKey += curKey.text;
     }
    });
    if (key) {
     if (controlKey) controlKey += "+";
     controlKey += key.toUpperCase();
    }
    this.addHotkey({ text: controlKey, controlKey: { altKey, ctrlKey, shiftKey, key, code } });
   }
   e.preventDefault();
  },

CODE_CONTROL是另外预设的按键code码集合,方便处理。本来用的是keyCode的,但keyCode已经被废弃了,推荐的是code。
addHotkey就是添加到相应变量的函数,其中主要出判断一下是否有重复的快捷键。
然后预留了一个外部验证的接口,为了多快捷键的时候可以判断是否有重复。
还有一个max接口,可以限制每个组件的快捷键个数。

addHotkey(data) {
   if (this.list.length && this.list.some(item => data.text === item.text)) return;
   if (this.list.length && this.list.length.toString() === this.max.toString()) return;
   if (!this.verify(data)) return;
   this.list.push(data);
  }

在线预览

https://codesandbox.io/s/vue-hotkeyinput-90m2k

以上就是vue实现一个获取按键展示快捷键效果的Input组件的详细内容,更多关于vue 展示快捷键的资料请关注三水点靠木其它相关文章!

Vue.js 相关文章推荐
Vue 打包的静态文件不能直接运行的原因及解决办法
Nov 19 Vue.js
vuex的数据渲染与修改浅析
Nov 26 Vue.js
Vue router传递参数并解决刷新页面参数丢失问题
Dec 02 Vue.js
vue 动态创建组件的两种方法
Dec 31 Vue.js
vue 实现图片懒加载功能
Dec 31 Vue.js
Vue+scss白天和夜间模式切换功能的实现方法
Jan 05 Vue.js
vue 中 get / delete 传递数组参数方法
Mar 23 Vue.js
Vue通过懒加载提升页面响应速度
May 10 Vue.js
Vue提供的三种调试方式你知道吗
Jan 18 Vue.js
Vue.js中v-for指令的用法介绍
Mar 13 Vue.js
vue判断按钮是否可以点击
Apr 09 Vue.js
解决vue自定义组件@click点击失效问题
Apr 30 Vue.js
vue使用vue-quill-editor富文本编辑器且将图片上传到服务器的功能
Jan 13 #Vue.js
基于VUE实现简单的学生信息管理系统
Jan 13 #Vue.js
详解为什么Vue中的v-if和v-for不建议一起用
Jan 13 #Vue.js
vue自定义组件实现双向绑定
Jan 13 #Vue.js
Vue页面渲染中key的应用实例教程
Jan 12 #Vue.js
Vue项目中使用mock.js的完整步骤
Jan 12 #Vue.js
vue 页面跳转的实现方式
Jan 12 #Vue.js
You might like
phpfans留言版用到的install.php
2007/01/04 PHP
PHP中的session永不过期的解决思路及实现方法分享
2011/04/20 PHP
php官方微信接口大全(微信支付、微信红包、微信摇一摇、微信小店)
2015/12/21 PHP
Smarty高级应用之缓存操作技巧分析
2016/05/14 PHP
php实现跨域提交form表单的方法【2种方法】
2016/10/17 PHP
php动态读取数据清除最右边距的方法
2017/04/12 PHP
Laravel下生成验证码的类
2017/11/15 PHP
自己开发Dojo的建议框架
2008/09/24 Javascript
jQuery的12招常用技巧分享
2011/08/08 Javascript
MultiSelect左右选择控件的设计与实现介绍
2013/06/08 Javascript
图标线性回归斜着移动到指定的位置
2013/08/16 Javascript
JS控制图片翻转示例代码(兼容firefox,ie,chrome)
2013/12/19 Javascript
JS之Date对象和获取系统当前时间详解
2014/01/13 Javascript
Javascript连接多个数组不用concat来解决
2014/03/24 Javascript
Javascript 读取操作Sql中的Xml字段
2014/10/09 Javascript
javascript如何定义对象数组
2016/06/07 Javascript
AngularJS入门教程之模块化操作用法示例
2016/11/02 Javascript
js实现带三角符的手风琴效果
2017/03/01 Javascript
jQuery对底部导航进行跳转并高亮显示的实例代码
2019/04/23 jQuery
JavaScript常用工具函数库汇总
2020/09/17 Javascript
vscode 调试 node.js的方法步骤
2020/09/15 Javascript
[01:17:47]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python简单实现基于SSL的IRC bot实例
2015/06/15 Python
Python动态导入模块的方法实例分析
2018/06/28 Python
Python嵌套列表转一维的方法(压平嵌套列表)
2018/07/03 Python
ProBikeKit英国:在线公路自行车之家
2017/02/10 全球购物
欧洲领先的技术商店:eibmarkt.com
2019/05/10 全球购物
泰国第一在线超市:Tops
2021/02/13 全球购物
Linux内核产生并发的原因
2012/07/13 面试题
毕业生写求职信的要点
2014/03/04 职场文书
会计工作总结范文2014
2014/12/23 职场文书
2015年审计人员工作总结
2015/05/26 职场文书
2016国庆节67周年红领巾广播稿
2015/12/18 职场文书
Python中的np.argmin()和np.argmax()函数用法
2021/06/02 Python
Python图片验证码降噪和8邻域降噪
2021/08/30 Python
Java 实现限流器处理Rest接口请求详解流程
2021/11/02 Java/Android