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+penlayers实现多边形绘制及展示
Dec 24 Vue.js
通过vue.extend实现消息提示弹框的方法记录
Jan 07 Vue.js
vuex的使用和简易实现
Jan 07 Vue.js
vue二选一tab栏切换新做法实现
Jan 19 Vue.js
Vue 数据响应式相关总结
Jan 28 Vue.js
vue backtop组件的实现完整代码
Apr 07 Vue.js
vue中控制mock在开发环境使用,在生产环境禁用方式
Apr 06 Vue.js
vue判断按钮是否可以点击
Apr 09 Vue.js
vue选项卡切换的实现案例
Apr 11 Vue.js
vue3语法糖内的defineProps及defineEmits
Apr 14 Vue.js
vue生命周期钩子函数以及触发时机
Apr 26 Vue.js
Vue Mint UI mt-swipe的使用方式
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
php 小乘法表实现代码
2009/07/16 PHP
PHP开发工具ZendStudio下Xdebug工具使用说明详解
2013/11/11 PHP
深入了解PHP中的Array数组和foreach
2016/11/06 PHP
Kindeditor编辑器添加图片上传水印功能(php代码)
2017/08/03 PHP
jquery ajax请求实例深入解析
2012/11/26 Javascript
基于jquery插件制作左右按钮与标题文字图片切换效果
2013/11/07 Javascript
javascript获取select的当前值示例代码(兼容IE/Firefox/Opera/Chrome)
2013/12/17 Javascript
jq实现左侧显示图片右侧文字滑动切换效果
2015/08/04 Javascript
根据user-agent判断蜘蛛代码黑帽跳转代码(js版与php版本)
2015/09/14 Javascript
Js类的静态方法与实例方法区分及jQuery拓展的两种方法
2016/06/03 Javascript
在vue项目中引入高德地图及其UI组件的方法
2018/09/04 Javascript
js代码规范之Eslint安装与配置详解
2018/09/08 Javascript
微信小程序实现搜索功能并跳转搜索结果页面
2019/05/18 Javascript
[03:42]2018完美盛典-《加冕》
2018/12/16 DOTA
python通过apply使用元祖和列表调用函数实例
2015/05/26 Python
python使用正则表达式替换匹配成功的组
2017/11/17 Python
一篇文章读懂Python赋值与拷贝
2018/04/19 Python
python异步编程 使用yield from过程解析
2019/09/25 Python
Python 脚本实现淘宝准点秒杀功能
2019/11/13 Python
基于pytorch中的Sequential用法说明
2020/06/24 Python
CSS3 实现发光边框特效
2020/11/11 HTML / CSS
荷兰皇家航空公司官方网站:KLM Royal Dutch Airlines
2017/12/07 全球购物
20世纪40年代连衣裙和复古服装:The Seamstress Of Bloomsbury
2018/07/24 全球购物
解决方案设计综合面试题
2015/08/31 面试题
大学生实习感言
2014/01/16 职场文书
揠苗助长教学反思
2014/02/04 职场文书
大学毕业感言一句话
2014/02/06 职场文书
宾馆总经理岗位职责
2014/02/14 职场文书
签约仪式主持词
2014/03/19 职场文书
12.4法制宣传日标语
2014/10/08 职场文书
环卫工作汇报材料
2014/10/28 职场文书
上课说话检讨书
2015/01/27 职场文书
2016年春季运动会广播稿
2015/08/19 职场文书
2016教师校本研修心得体会
2016/01/08 职场文书
golang 实现并发求和
2021/05/08 Golang
解决pytorch-gpu 安装失败的记录
2021/05/24 Python