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图片裁剪插件vue-cropper使用方法详解
Dec 16 Vue.js
vue实现简易的双向数据绑定
Dec 29 Vue.js
基于Vue2实现移动端图片上传、压缩、拖拽排序、拖拽删除功能
Jan 05 Vue.js
vue form表单post请求结合Servlet实现文件上传功能
Jan 22 Vue.js
vue项目实现分页效果
Mar 24 Vue.js
vue实现简单数据双向绑定
Apr 28 Vue.js
vue2实现provide inject传递响应式
May 21 Vue.js
vue cli4中mockjs在dev环境和build环境的配置详情
Apr 06 Vue.js
Axios代理配置及封装响应拦截处理方式
Apr 07 Vue.js
vue+elementUI实现表格列的显示与隐藏
Apr 13 Vue.js
vue如何清除浏览器历史栈
May 25 Vue.js
vue中data里面的数据相互使用方式
Jun 05 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
新的一年,新的期待:DC在2020年的四部动画电影
2020/01/01 欧美动漫
php中用文本文件做数据库的实现方法
2008/03/27 PHP
PHP代码判断设备是手机还是平板电脑(两种方法)
2015/10/19 PHP
laravel实现按时间日期进行分组统计方法示例
2019/03/23 PHP
基于laravel缓冲cache的用法详解
2019/10/23 PHP
js 格式化时间日期函数小结
2010/03/20 Javascript
jQuery hover 延时器实现代码
2011/03/12 Javascript
iframe的onload在Chrome/Opera中执行两次Bug的解决方法
2011/03/17 Javascript
浅析jquery某一元素重复绑定的问题
2014/01/03 Javascript
jQuery DOM删除节点操作指南
2015/03/03 Javascript
JavaScript实现简单的星星评分效果
2017/05/18 Javascript
随机生成10个不重复的0-100的数字(实例讲解)
2017/08/16 Javascript
Vue2.0学习之详解Vue 组件及父子组件通信
2017/12/12 Javascript
JavaScript相等运算符的九条规则示例详解
2019/10/20 Javascript
Node.js Domain 模块实例详解
2020/03/18 Javascript
如何在vue中使用百度地图添加自定义覆盖物(水波纹)
2020/11/03 Javascript
python爬虫入门教程之点点美女图片爬虫代码分享
2014/09/02 Python
Python编程中使用Pillow来处理图像的基础教程
2015/11/20 Python
Python网络爬虫出现乱码问题的解决方法
2017/01/05 Python
elasticsearch python 查询的两种方法
2019/08/04 Python
python pygame实现球球大作战
2019/11/25 Python
python GUI库图形界面开发之PyQt5 MDI(多文档窗口)QMidArea详细使用方法与实例
2020/03/05 Python
使用jupyter notebook运行python和R的步骤
2020/08/13 Python
彪马英国官网:PUMA英国
2019/02/11 全球购物
自动化专业个人求职信范文
2013/12/30 职场文书
教学实习自我评价
2014/01/28 职场文书
《伯牙绝弦》教学反思
2014/03/02 职场文书
取保候审保证书
2014/04/30 职场文书
机械工程及自动化专业求职信
2014/09/03 职场文书
个人四风问题整改措施思想汇报
2014/10/04 职场文书
KTV门卫岗位职责
2014/10/09 职场文书
2014年安全生产工作总结
2014/11/13 职场文书
2015年数学教师工作总结
2015/05/20 职场文书
2016入党积极分子党校培训心得体会
2016/01/06 职场文书
全家福照片寄语怎么写?
2019/04/02 职场文书
如何用 Python 子进程关闭 Excel 自动化中的弹窗
2021/05/07 Python