一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務(wù)器之家 - 編程語(yǔ)言 - JavaScript - vue.js - vue實(shí)現(xiàn)一個(gè)獲取按鍵展示快捷鍵效果的Input組件

vue實(shí)現(xiàn)一個(gè)獲取按鍵展示快捷鍵效果的Input組件

2021-12-31 16:22LnEoi vue.js

這篇文章主要介紹了vue如何實(shí)現(xiàn)一個(gè)獲取按鍵展示快捷鍵效果的Input組件,幫助大家更好的理解和使用vue框架,感興趣的朋友可以了解下

遇到一個(gè)需求,頁(yè)面內(nèi)要自定義快捷鍵,這就需要可以有地方設(shè)置和展示快捷鍵,找了一圈Element UI發(fā)現(xiàn)沒(méi)有能稍微改改就能用的組件,所以自己動(dòng)手寫了一個(gè)。
這個(gè)只有快捷鍵展示功能,快捷鍵實(shí)際綁定生效的話是依賴傳回的快捷鍵數(shù)據(jù),由另外的組件處理的。目前只測(cè)試了Chrome的環(huán)境。

效果如下:

vue實(shí)現(xiàn)一個(gè)獲取按鍵展示快捷鍵效果的Input組件

關(guān)鍵點(diǎn)

雖然看起來(lái)像是一個(gè)Input但在組件內(nèi)實(shí)際上是展示一個(gè)標(biāo)簽效果,還需要有刪除按鈕。這就得在輸入框內(nèi)放下html代碼,瀏覽器的Input組件顯然不適合,這就只能自己仿一個(gè)類Input組件效果了。

focus、blur、選中高亮效果

非Input這類組件是沒(méi)有focus、blur、選中高亮效果這些效果的,還好瀏覽器有預(yù)留實(shí)現(xiàn)方式,網(wǎng)上也早已有網(wǎng)友提供方案,在div里加上tabindex="0"屬性,就能讓div獲得這些效果。

tabindex屬性規(guī)定了Tab按鍵的順序,寫0的話是會(huì)按組件默認(rèn)順序被選中的,如果寫-1則始終無(wú)法被選中。因?yàn)楸旧硎欠翴nput組件形式,能被Tab獲取也剛好很合理。

然后加上CSS的獲取焦點(diǎn)的邊框效果、鼠標(biāo)移動(dòng)到此顯示文本類型指針

?
1
2
3
4
5
6
7
8
.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);
}

文本提示

當(dāng)沒(méi)有內(nèi)容時(shí)需要跟Input一樣,可以默認(rèn)顯示文本提示。這也是放一個(gè)div在里面,用Vue控制,如果輸出的標(biāo)簽變量有數(shù)據(jù)時(shí),就不讓此元素顯示。

光標(biāo)閃動(dòng)效果

這個(gè)比較好處理,在類Input里面放一個(gè)偽元素,當(dāng)獲取焦點(diǎn)的時(shí)候添加此偽元素,然后再給此元素一個(gè)CSS3的動(dòng)畫,就有光標(biāo)閃動(dòng)的效果了。

?
1
2
3
4
5
6
7
8
9
10
11
12
@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里會(huì)標(biāo)記是否按下alt、ctrl(control)等信息,所以做組合按鍵依賴此信息就可以實(shí)現(xiàn)。
因?yàn)槊看伟存I都會(huì)觸發(fā)事件,所以要屏蔽掉功能鍵的事件。代碼只實(shí)現(xiàn)了一個(gè)非功能鍵的組合,需要多功能鍵可以另外建立變量判斷連續(xù)按鍵的情況然后處理。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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是另外預(yù)設(shè)的按鍵code碼集合,方便處理。本來(lái)用的是keyCode的,但keyCode已經(jīng)被廢棄了,推薦的是code。
addHotkey就是添加到相應(yīng)變量的函數(shù),其中主要出判斷一下是否有重復(fù)的快捷鍵。
然后預(yù)留了一個(gè)外部驗(yàn)證的接口,為了多快捷鍵的時(shí)候可以判斷是否有重復(fù)。
還有一個(gè)max接口,可以限制每個(gè)組件的快捷鍵個(gè)數(shù)。

?
1
2
3
4
5
6
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);
}

在線預(yù)覽

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

以上就是vue實(shí)現(xiàn)一個(gè)獲取按鍵展示快捷鍵效果的Input組件的詳細(xì)內(nèi)容,更多關(guān)于vue 展示快捷鍵的資料請(qǐng)關(guān)注服務(wù)器之家其它相關(guān)文章!

原文鏈接:https://segmentfault.com/a/1190000038955504

延伸 · 閱讀

精彩推薦
  • vue.js梳理一下vue中的生命周期

    梳理一下vue中的生命周期

    看過(guò)很多人講vue的生命周期,但總是被繞的云里霧里,尤其是自學(xué)的同學(xué),可能js的基礎(chǔ)也不是太牢固,聽(tīng)起來(lái)更是吃力,那我就已個(gè)人之淺見(jiàn),以大白話...

    CRMEB技術(shù)團(tuán)隊(duì)7992021-12-22
  • vue.jsVue項(xiàng)目中實(shí)現(xiàn)帶參跳轉(zhuǎn)功能

    Vue項(xiàng)目中實(shí)現(xiàn)帶參跳轉(zhuǎn)功能

    最近做了一個(gè)手機(jī)端系統(tǒng),其中遇到了父頁(yè)面需要攜帶參數(shù)跳轉(zhuǎn)至子頁(yè)面的問(wèn)題,現(xiàn)已解決,下面分享一下實(shí)現(xiàn)過(guò)程,感興趣的朋友一起看看吧...

    YiluRen丶4302022-03-03
  • vue.js詳解vue 表單綁定與組件

    詳解vue 表單綁定與組件

    這篇文章主要介紹了vue 表單綁定與組件的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用vue框架,感興趣的朋友可以了解下...

    Latteitcjz6432022-02-12
  • vue.js用vite搭建vue3應(yīng)用的實(shí)現(xiàn)方法

    用vite搭建vue3應(yīng)用的實(shí)現(xiàn)方法

    這篇文章主要介紹了用vite搭建vue3應(yīng)用的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下...

    Asiter7912022-01-22
  • vue.jsVue多選列表組件深入詳解

    Vue多選列表組件深入詳解

    這篇文章主要介紹了Vue多選列表組件深入詳解,這個(gè)是vue的基本組件,有需要的同學(xué)可以研究下...

    yukiwu6752022-01-25
  • vue.jsVue2.x-使用防抖以及節(jié)流的示例

    Vue2.x-使用防抖以及節(jié)流的示例

    這篇文章主要介紹了Vue2.x-使用防抖以及節(jié)流的示例,幫助大家更好的理解和學(xué)習(xí)使用vue框架,感興趣的朋友可以了解下...

    Kyara6372022-01-25
  • vue.jsVue中引入svg圖標(biāo)的兩種方式

    Vue中引入svg圖標(biāo)的兩種方式

    這篇文章主要給大家介紹了關(guān)于Vue中引入svg圖標(biāo)的兩種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的...

    十里不故夢(mèng)10222021-12-31
  • vue.jsVue2.x 項(xiàng)目性能優(yōu)化之代碼優(yōu)化的實(shí)現(xiàn)

    Vue2.x 項(xiàng)目性能優(yōu)化之代碼優(yōu)化的實(shí)現(xiàn)

    這篇文章主要介紹了Vue2.x 項(xiàng)目性能優(yōu)化之代碼優(yōu)化的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋...

    優(yōu)小U9632022-02-21
主站蜘蛛池模板: 呜嗯啊野战h呻吟男男双性 污小说在线阅读 | sedog在线长片 | 色视频久久 | 亚洲视频在线一区二区 | 天干夜天天夜天干天ww | 成人免费毛片一区二区三区 | 俄罗斯三级完整版在线观看 | 热99这里有精品综合久久 | 亚洲激情在线 | 亚洲福利一区二区精品秒拍 | 继的朋友无遮漫画免费观看73 | 妇乱子伦激情 | 国产女同精品 | 牧教师| 亚洲午夜久久久 | 精品日韩欧美一区二区三区 | 亚洲免费视频在线观看 | 歪歪私人影院成人毛片 | 欧美亚洲一区二区三区在线 | 美女曰逼视频 | 国产综合成人亚洲区 | 韩国甜性涩爱免费观看 | 日本人在线看片 | 2022最新国产在线 | 欧美人禽杂交狂配无删完整 | 国产成人一区二区三区在线视频 | 日韩a无吗一区二区三区 | 国内揄拍国内精品久久 | 欧美一二区 | 欧美精品一区二区三区免费播放 | 色妞女女女女女bbbb | 99久久中文字幕伊人 | vomoulei成人舞蹈 | yy111111免费观看 | 九九热在线视频观看这里只有精品 | 小向美奈子av| 雪恋电影完整版免费观看 | aⅴ视频在线免播放观看 | 成人在线观看免费视频 | 日本68xxxxxxxxx24| 万域之王动漫在线观看全集免费播放 |