sykj 0.1.6 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,130 +1,159 @@
1
1
  <template>
2
- <div
3
- @click="makeFocus"
4
- class="keyboardcon defaultCss"
5
- :class="[keyStore.keyboardcon ? 'show' : '', toUpKeyCase ? 'upKeyCase' : '']"
6
- @contextmenu.prevent="makeFocus"
7
- >
8
- <!-- 中文拼音列表 -->
9
- <div class="chinese">
10
- <div
11
- v-if="keyStore.isChinese === true && cn_input?.length"
12
- class="pinyin"
13
- @touchmove.stop.prevent
14
- >
15
- <div>
16
- <span>{{ cn_input }}</span>
17
- </div>
18
- </div>
19
- <div class="wenzi" v-if="cn_list_str.length >= 1">
20
- <div
21
- class="wenzi_box"
22
- :class="showMore ? 'wenzi_box_more' : ''"
23
- :style="huanhang ? `flex-wrap: wrap;` : ''"
24
- >
25
- <span
26
- @click="chineseCli(item)"
27
- v-for="(item, index) in cn_list_str"
28
- :key="index"
29
- >{{ item }}</span
30
- >
31
- </div>
32
- <div class="moreText" @click="moreTextCli">
33
- <el-icon :style="`transform: rotateZ(${showMore ? 180 : 0}deg)`">
34
- <ArrowDownBold />
35
- </el-icon>
36
- </div>
37
- </div>
38
- </div>
39
- <!-- 纯数字 -->
40
2
  <div
41
- class="number_list"
42
- @touchmove.stop.prevent
43
- v-show="keyStore.inputType == 'number'"
3
+ @pointerdown.prevent
4
+ @click="makeFocus"
5
+ class="keyboardcon defaultCss"
6
+ :class="[
7
+ keyStore.keyboardcon ? 'show' : '',
8
+ toUpKeyCase ? 'upKeyCase' : '',
9
+ ]"
10
+ @contextmenu.prevent="makeFocus"
44
11
  >
45
- <div class="key_item" v-for="(item, index) in lists" :key="item">
12
+ <!-- 中文拼音列表 -->
13
+ <div class="chinese">
14
+ <div
15
+ v-if="keyStore.isChinese === true && cn_input?.length"
16
+ class="pinyin"
17
+ @touchmove.stop.prevent
18
+ >
19
+ <div>
20
+ <span>{{ cn_input }}</span>
21
+ </div>
22
+ </div>
23
+ <div class="wenzi" v-if="cn_list_str.length >= 1">
24
+ <div
25
+ class="wenzi_box"
26
+ :class="showMore ? 'wenzi_box_more' : ''"
27
+ :style="huanhang ? `flex-wrap: wrap;` : ''"
28
+ >
29
+ <span
30
+ @click="chineseCli(item)"
31
+ v-for="(item, index) in cn_list_str"
32
+ :key="index"
33
+ >{{ item }}</span
34
+ >
35
+ </div>
36
+ <div class="moreText" @click="moreTextCli">
37
+ <el-icon
38
+ :style="`transform: rotateZ(${showMore ? 180 : 0}deg)`"
39
+ >
40
+ <ArrowDownBold />
41
+ </el-icon>
42
+ </div>
43
+ </div>
44
+ </div>
45
+ <!-- 纯数字 -->
46
46
  <div
47
- class="key"
48
- @click.stop="choosekey(item, index)"
49
- v-if="!Array.isArray(item) && index < 11"
47
+ class="number_list"
48
+ @touchmove.stop.prevent
49
+ v-show="keyStore.inputType == 'number'"
50
50
  >
51
- <span>{{ item }}</span>
52
- </div>
53
- <div class="keys" v-else-if="index < 11">
54
- <span @click.stop="choosekey(item[0], index)">{{ item[0] }}</span>
55
- <span @click.stop="choosekey(item[1], index)">{{ item[1] }}</span>
56
- </div>
57
- <div class="key del" @click.stop="choosekey(item, index)" v-if="index == '11'">
58
- <img src="./static/key/del.svg" alt="" />
51
+ <div class="key_item" v-for="(item, index) in lists" :key="item">
52
+ <div
53
+ class="key"
54
+ @click.stop="choosekey(item, index)"
55
+ v-if="!Array.isArray(item) && index < 11"
56
+ >
57
+ <span>{{ item }}</span>
58
+ </div>
59
+ <div class="keys" v-else-if="index < 11">
60
+ <span @click.stop="choosekey(item[0], index)">{{
61
+ item[0]
62
+ }}</span>
63
+ <span @click.stop="choosekey(item[1], index)">{{
64
+ item[1]
65
+ }}</span>
66
+ </div>
67
+ <div
68
+ class="key del"
69
+ @click.stop="choosekey(item, index)"
70
+ v-if="index == '11'"
71
+ >
72
+ <img src="./static/key/del.svg" alt="" />
73
+ </div>
74
+ </div>
59
75
  </div>
60
- </div>
61
- </div>
62
- <!-- 26键 -->
63
- <div
64
- class="text_list"
65
- :class="[isSymbol ? 'isSymbol' : '']"
66
- @touchmove.stop.prevent
67
- v-show="keyStore.inputType != 'number'"
68
- ref="pressArea"
69
- >
70
- <div class="key_item_row" v-for="(item, index) in lists" :key="index">
76
+ <!-- 26键 -->
71
77
  <div
72
- class="key_item_column"
73
- @touchstart="startPress"
74
- @touchend="endPress"
75
- @touchcancel="cancelPress"
76
- v-for="(item1, index1) in item"
77
- @click.stop="choosekey(item1, index1)"
78
- :key="item1"
78
+ class="text_list"
79
+ :class="[isSymbol ? 'isSymbol' : '']"
80
+ @touchmove.stop.prevent
81
+ v-show="keyStore.inputType != 'number'"
82
+ ref="pressArea"
79
83
  >
80
- <div class="key" v-if="item1.length == 1">
81
- <span>{{ item1 }}</span>
82
- </div>
83
- <div class="key" :class="toUpKeyCase ? 'toUpKeyCase' : ''" v-else>
84
- <!-- {{ item1 }} -->
85
- <img v-if="item1 == 'del'" :class="item1" src="./static/key/del.svg" alt="" />
86
- <img
87
- v-else-if="item1 == 'shift'"
88
- :class="item1"
89
- src="./static/key/shift.svg"
90
- alt=""
91
- />
92
- <img
93
- v-else-if="item1 == 'space'"
94
- :class="item1"
95
- src="./static/key/space.svg"
96
- alt=""
97
- />
98
- <img
99
- v-else-if="item1 == 'enter'"
100
- :class="item1"
101
- src="./static/key/enter.svg"
102
- alt=""
103
- />
104
- <span v-else-if="item1.length > 1" :class="item1">{{ item1 }}</span>
105
- <span v-else :class="item1">{{ item1 }}</span>
106
- </div>
84
+ <div
85
+ class="key_item_row"
86
+ v-for="(item, index) in lists"
87
+ :key="index"
88
+ >
89
+ <div
90
+ class="key_item_column"
91
+ @touchstart="startPress"
92
+ @touchend="endPress"
93
+ @touchcancel="cancelPress"
94
+ v-for="(item1, index1) in item"
95
+ @click.stop="choosekey(item1, index1)"
96
+ :key="item1"
97
+ >
98
+ <div class="key" v-if="item1.length == 1">
99
+ <span>{{ item1 }}</span>
100
+ </div>
101
+ <div
102
+ class="key"
103
+ :class="toUpKeyCase ? 'toUpKeyCase' : ''"
104
+ v-else
105
+ >
106
+ <!-- {{ item1 }} -->
107
+ <img
108
+ v-if="item1 == 'del'"
109
+ :class="item1"
110
+ src="./static/key/del.svg"
111
+ alt=""
112
+ />
113
+ <img
114
+ v-else-if="item1 == 'shift'"
115
+ :class="item1"
116
+ src="./static/key/shift.svg"
117
+ alt=""
118
+ />
119
+ <img
120
+ v-else-if="item1 == 'space'"
121
+ :class="item1"
122
+ src="./static/key/space.svg"
123
+ alt=""
124
+ />
125
+ <img
126
+ v-else-if="item1 == 'enter'"
127
+ :class="item1"
128
+ src="./static/key/enter.svg"
129
+ alt=""
130
+ />
131
+ <span v-else-if="item1.length > 1" :class="item1">{{
132
+ item1
133
+ }}</span>
134
+ <span v-else :class="item1">{{ item1 }}</span>
135
+ </div>
136
+ </div>
137
+ </div>
107
138
  </div>
108
- </div>
109
- </div>
110
- <!-- 中英文切换 -->
111
- <div class="btns" @touchmove.stop.prevent>
112
- <div v-show="keyStore.showCheckChinese" @click="checkChinese">
113
- <!-- <el-icon><Switch /></el-icon -->
114
- <span :class="keyStore.isChinese ? 'ch' : ''">中</span>/<span
115
- :class="keyStore.isChinese ? '' : 'ch'"
116
- >英</span
117
- >
118
- </div>
119
- <span @click.stop>确认</span>
139
+ <!-- 中英文切换 -->
140
+ <div class="btns" @touchmove.stop.prevent>
141
+ <div v-show="keyStore.showCheckChinese" @click="checkChinese">
142
+ <!-- <el-icon><Switch /></el-icon -->
143
+ <span :class="keyStore.isChinese ? 'ch' : ''">中</span>/<span
144
+ :class="keyStore.isChinese ? '' : 'ch'"
145
+ >英</span
146
+ >
147
+ </div>
148
+ <span @click.stop>确认</span>
149
+ </div>
150
+ <!-- <div class="symbol_list" v-show="keyStore.inputType == 'symbol'"></div> -->
120
151
  </div>
121
- <!-- <div class="symbol_list" v-show="keyStore.inputType == 'symbol'"></div> -->
122
- </div>
123
152
  </template>
124
153
 
125
154
  <script>
126
155
  export default {
127
- name: "SyKeyboard",
156
+ name: "SyKeyboard",
128
157
  };
129
158
  </script>
130
159
 
@@ -134,11 +163,11 @@ import { onMounted, reactive, ref, onBeforeUnmount, watchEffect } from "vue";
134
163
  //#region init ------------------------------------------------------------
135
164
  const globalKey = window.globalThis.$sy.key;
136
165
  const keyStore = reactive({
137
- keyboardcon: false,
138
- currentElement: null,
139
- inputType: true ? "text" : "number",
140
- showCheckChinese: !false, //是否展示中文输入切换
141
- isChinese: false,
166
+ keyboardcon: false,
167
+ currentElement: null,
168
+ inputType: true ? "text" : "number",
169
+ showCheckChinese: !false, //是否展示中文输入切换
170
+ isChinese: false,
142
171
  });
143
172
  const isSymbol = ref(false);
144
173
  //#endregion -----------------------------------------------------------
@@ -149,113 +178,119 @@ const isSymbol = ref(false);
149
178
 
150
179
  let st = null;
151
180
  watchEffect(() => {
152
- if (keyStore.keyboardcon) {
153
- clearTimeout(st);
154
- document.body.style = "padding-bottom:30vh;";
155
- } else {
156
- st = setTimeout(() => {
157
- document.body.style = "padding:0;";
158
- }, 0);
159
- }
181
+ if (keyStore.keyboardcon) {
182
+ clearTimeout(st);
183
+ // document.body.style = "padding-bottom:30vh;";
184
+ document.body.style.paddingBottom = "30vh";
185
+ } else {
186
+ st = setTimeout(() => {
187
+ // document.body.style = "padding:0;";
188
+ document.body.style.paddingBottom = "0vh";
189
+ }, 0);
190
+ }
160
191
  });
161
192
 
162
193
  const numberKeyBoradMap = [1, 2, 3, 4, 5, 6, 7, 8, 9, [".", ":"], 0, "del"];
163
194
  const textKeyMap = [
164
- ["q", "w", "e", "r", "t", "y", "u", "i", "o", "p"],
165
- ["a", "s", "d", "f", "g", "h", "j", "k", "l"],
166
- ["shift", "z", "x", "c", "v", "b", "n", "m", "del"],
167
- ["&123", "space", "enter"],
195
+ ["q", "w", "e", "r", "t", "y", "u", "i", "o", "p"],
196
+ ["a", "s", "d", "f", "g", "h", "j", "k", "l"],
197
+ ["shift", "z", "x", "c", "v", "b", "n", "m", "del"],
198
+ ["&123", "space", "enter"],
168
199
  ];
169
200
 
170
201
  const symbolMap1 = [
171
- [1, 2, 3, 4, 5, 6, 7, 8, 9, 0],
172
- ["-", "/", ":", ";", "(", ")", "$", "&", "@", '"'],
173
- ["#+=", ".", ",", "?", "!", "'", "del"],
174
- ["ABC", "space", "enter"],
202
+ [1, 2, 3, 4, 5, 6, 7, 8, 9, 0],
203
+ ["-", "/", ":", ";", "(", ")", "$", "&", "@", '"'],
204
+ ["#+=", ".", ",", "?", "!", "'", "del"],
205
+ ["ABC", "space", "enter"],
175
206
  ];
176
207
 
177
208
  const symbolMap2 = [
178
- ["[", "]", "{", "}", "#", "%", "^", "*", "+", "="],
179
- ["_", "\\", "|", "~", "<", ">", "€", "£", "¥", "·"],
180
- ["123", ".", ",", "?", "!", "'", "del"],
181
- ["ABC", "space", "enter"],
209
+ ["[", "]", "{", "}", "#", "%", "^", "*", "+", "="],
210
+ ["_", "\\", "|", "~", "<", ">", "€", "£", "¥", "·"],
211
+ ["123", ".", ",", "?", "!", "'", "del"],
212
+ ["ABC", "space", "enter"],
182
213
  ];
183
214
 
184
215
  const showMore = ref(false);
185
216
  const huanhang = ref(false);
186
217
  const moreTextCli = () => {
187
- // keyStore.currentElement.focus();
188
- globalKey.currentElement.focus();
189
-
190
- showMore.value = !showMore.value;
191
- if (showMore.value) {
192
- huanhang.value = true;
193
- } else {
194
- setTimeout(() => {
195
- huanhang.value = false;
196
- }, 500);
197
- }
218
+ // keyStore.currentElement.focus();
219
+ globalKey.currentElement.focus();
220
+
221
+ showMore.value = !showMore.value;
222
+ if (showMore.value) {
223
+ huanhang.value = true;
224
+ } else {
225
+ setTimeout(() => {
226
+ huanhang.value = false;
227
+ }, 500);
228
+ }
198
229
  };
199
230
  const chineseCli = (item) => {
200
- // keyStore.currentElement.focus();
201
- globalKey.currentElement.focus();
202
- setInputValue(item);
203
- selectCN(item);
204
- console.log(cn_input.value);
205
- if (!cn_input.value) {
206
- showMore.value = false;
207
- }
231
+ // keyStore.currentElement.focus();
232
+ globalKey.currentElement.focus();
233
+ setInputValue(item);
234
+ selectCN(item);
235
+ console.log(cn_input.value);
236
+ if (!cn_input.value) {
237
+ showMore.value = false;
238
+ }
208
239
  };
209
240
 
210
241
  //选择中文
211
242
  const selectCN = (text) => {
212
- let strList = cn_input.value.split("'");
213
- if (strList.length === 1 || text.length >= strList.length) {
214
- cn_input.value = "";
215
- cn_list_str.value = [];
216
- // l_min.value = 0;
217
- // l_max.value = 10;
218
- return;
219
- }
220
- setCn_input(text);
243
+ let strList = cn_input.value.split("'");
244
+ if (strList.length === 1 || text.length >= strList.length) {
245
+ cn_input.value = "";
246
+ cn_list_str.value = [];
247
+ // l_min.value = 0;
248
+ // l_max.value = 10;
249
+ return;
250
+ }
251
+ setCn_input(text);
221
252
  };
222
253
  //设置中文输入
223
254
  const setCn_input = (text) => {
224
- const singleDict = dict;
225
- let itemList = [];
226
- for (let key in singleDict) {
227
- let value = singleDict[key];
228
- if (typeof value === "string") {
229
- let valueList = value.split("");
230
- let item = valueList.find((item) => item === text);
231
- if (item) {
232
- itemList.push(key);
233
- }
234
- }
235
- }
236
- let str = "";
237
- const cn_inputList = cn_input.value.split("'");
238
- for (let i = 0; i < cn_inputList.length; i++) {
239
- let item = cn_inputList[i];
240
- for (let key of itemList) {
241
- let list = key.split("");
242
- let count = 0;
243
- for (let k = 0; k < list.length; k++) {
244
- if (key.charAt(k) === item.charAt(k)) {
245
- count += 1;
246
- if (k === 0 && item.length != key.length && key.length > item.length) {
247
- // 用于处理首单词缩写法
248
- str = item;
249
- }
255
+ const singleDict = dict;
256
+ let itemList = [];
257
+ for (let key in singleDict) {
258
+ let value = singleDict[key];
259
+ if (typeof value === "string") {
260
+ let valueList = value.split("");
261
+ let item = valueList.find((item) => item === text);
262
+ if (item) {
263
+ itemList.push(key);
264
+ }
250
265
  }
251
- if (count === list.length) {
252
- str = item;
266
+ }
267
+ let str = "";
268
+ const cn_inputList = cn_input.value.split("'");
269
+ for (let i = 0; i < cn_inputList.length; i++) {
270
+ let item = cn_inputList[i];
271
+ for (let key of itemList) {
272
+ let list = key.split("");
273
+ let count = 0;
274
+ for (let k = 0; k < list.length; k++) {
275
+ if (key.charAt(k) === item.charAt(k)) {
276
+ count += 1;
277
+ if (
278
+ k === 0 &&
279
+ item.length != key.length &&
280
+ key.length > item.length
281
+ ) {
282
+ // 用于处理首单词缩写法
283
+ str = item;
284
+ }
285
+ }
286
+ if (count === list.length) {
287
+ str = item;
288
+ }
289
+ }
253
290
  }
254
- }
255
291
  }
256
- }
257
- cn_input.value = cn_inputList.filter((item) => item != str).join("'");
258
- findChinese();
292
+ cn_input.value = cn_inputList.filter((item) => item != str).join("'");
293
+ findChinese();
259
294
  };
260
295
 
261
296
  let lists = ref([]);
@@ -264,174 +299,181 @@ let active = ref(1);
264
299
  let toUpKeyCase = ref(false);
265
300
 
266
301
  const choosekey = (item) => {
267
- try {
268
- // keyStore.currentElement.focus();
269
- globalKey.currentElement.focus();
270
- } catch (error) {}
271
-
272
- switch (item) {
273
- case "del":
274
- if (keyStore.isChinese && cn_input.value?.length) {
275
- // 处理拼音删除
276
- delPinyin();
277
- } else {
278
- // 普通删除
279
- delInputText();
280
- }
281
-
282
- break;
283
- case "shift":
284
- toUpKeyCase.value = !toUpKeyCase.value;
285
- lists.value = lists.value.map((i) => {
286
- i = i.map((j) => {
287
- if (j.length == 1) {
288
- if (toUpKeyCase.value) return j.toUpperCase();
289
- else return j.toLowerCase();
290
- } else {
291
- return j;
292
- }
293
- });
294
- return i;
295
- });
296
- break;
297
- case "space":
298
- // keyStore.currentElement.value += " ";
299
- setInputValue(" ");
300
- break;
301
- case "&123":
302
- lists.value = symbolMap1;
303
- toUpKeyCase.value = false;
304
- isSymbol.value = true;
305
-
306
- break;
307
- case "ABC":
308
- lists.value = textKeyMap;
309
- isSymbol.value = false;
310
- break;
311
- case "#+=":
312
- lists.value = symbolMap2;
313
- break;
314
- case "123":
315
- lists.value = symbolMap1;
316
-
317
- break;
318
- case "enter":
319
- // keyStore.currentElement.value += "\n";
320
- globalKey.currentElement.value += "\n";
321
- break;
322
- default:
323
- if (keyStore.isChinese && !toUpKeyCase.value) {
324
- chinese(item);
325
- } else {
326
- setInputValue(item);
327
- }
328
-
329
- break;
330
- }
302
+ try {
303
+ // keyStore.currentElement.focus();
304
+ globalKey.currentElement.focus();
305
+ } catch (error) {}
306
+
307
+ switch (item) {
308
+ case "del":
309
+ if (keyStore.isChinese && cn_input.value?.length) {
310
+ // 处理拼音删除
311
+ delPinyin();
312
+ } else {
313
+ // 普通删除
314
+ delInputText();
315
+ }
316
+
317
+ break;
318
+ case "shift":
319
+ toUpKeyCase.value = !toUpKeyCase.value;
320
+ lists.value = lists.value.map((i) => {
321
+ i = i.map((j) => {
322
+ if (j.length == 1) {
323
+ if (toUpKeyCase.value) return j.toUpperCase();
324
+ else return j.toLowerCase();
325
+ } else {
326
+ return j;
327
+ }
328
+ });
329
+ return i;
330
+ });
331
+ break;
332
+ case "space":
333
+ // keyStore.currentElement.value += " ";
334
+ setInputValue(" ");
335
+ break;
336
+ case "&123":
337
+ lists.value = symbolMap1;
338
+ toUpKeyCase.value = false;
339
+ isSymbol.value = true;
340
+
341
+ break;
342
+ case "ABC":
343
+ lists.value = textKeyMap;
344
+ isSymbol.value = false;
345
+ break;
346
+ case "#+=":
347
+ lists.value = symbolMap2;
348
+ break;
349
+ case "123":
350
+ lists.value = symbolMap1;
351
+
352
+ break;
353
+ case "enter":
354
+ // keyStore.currentElement.value += "\n";
355
+ globalKey.currentElement.value += "\n";
356
+ if (globalKey.currentElement.getAttribute("enter") !== null) {
357
+ globalKey.currentElement.blur();
358
+ }
359
+
360
+ // triggerKeyPress("Enter");
361
+ break;
362
+ default:
363
+ if (keyStore.isChinese && !toUpKeyCase.value) {
364
+ chinese(item);
365
+ } else {
366
+ setInputValue(item);
367
+ }
368
+
369
+ break;
370
+ }
331
371
  };
332
372
 
333
373
  /**删除字符串的某个字符*/
334
374
  const delStringLast = (text, index) => {
335
- if (index < 0) return;
336
- let arrText = text.split("");
337
- if (index > 0) {
338
- arrText[index - 1] = "";
339
- } else {
340
- arrText[index] = "";
341
- }
342
-
343
- arrText = arrText.filter((item) => item);
344
- const endIndex = arrText.length - 1;
345
- if (arrText[endIndex] === "'") {
346
- arrText[endIndex] = "";
347
- }
348
- let result = arrText.join("");
349
-
350
- return result;
375
+ if (index < 0) return;
376
+ let arrText = text.split("");
377
+ if (index > 0) {
378
+ arrText[index - 1] = "";
379
+ } else {
380
+ arrText[index] = "";
381
+ }
382
+
383
+ arrText = arrText.filter((item) => item);
384
+ const endIndex = arrText.length - 1;
385
+ if (arrText[endIndex] === "'") {
386
+ arrText[endIndex] = "";
387
+ }
388
+ let result = arrText.join("");
389
+
390
+ return result;
351
391
  };
352
392
  // 拼音删除
353
393
  const delPinyin = () => {
354
- cn_input.value = delStringLast(cn_input.value, cn_input.value.length);
355
- if (cn_input.value === "") {
356
- cn_list_str.value = [];
357
- return;
358
- }
359
- const specialPinYin = ["u", "v", "i"].includes(cn_input.value.split("")[0]);
360
- if (cn_list_str.value && cn_list_str.value.length === 1 && specialPinYin) {
361
- //@ts-ignore
362
- cn_list_str.value = [cn_input.value];
363
- return;
364
- }
365
- let re = new RegExp(`^${cn_input.value}\\w*`);
366
- let keys = Object.keys(dict)
367
- .filter((key) => {
368
- const result = re.test(key);
369
- return result;
370
- })
371
- .sort();
372
-
373
- cn_list_str.value =
374
- (keys.length > 1 ? keys.reduce((a, b) => a + dict[b], "") : dict[keys[0]]) ||
375
- "".split("");
376
-
377
- findChinese("del");
394
+ cn_input.value = delStringLast(cn_input.value, cn_input.value.length);
395
+ if (cn_input.value === "") {
396
+ cn_list_str.value = [];
397
+ return;
398
+ }
399
+ const specialPinYin = ["u", "v", "i"].includes(cn_input.value.split("")[0]);
400
+ if (cn_list_str.value && cn_list_str.value.length === 1 && specialPinYin) {
401
+ //@ts-ignore
402
+ cn_list_str.value = [cn_input.value];
403
+ return;
404
+ }
405
+ let re = new RegExp(`^${cn_input.value}\\w*`);
406
+ let keys = Object.keys(dict)
407
+ .filter((key) => {
408
+ const result = re.test(key);
409
+ return result;
410
+ })
411
+ .sort();
412
+
413
+ cn_list_str.value =
414
+ (keys.length > 1
415
+ ? keys.reduce((a, b) => a + dict[b], "")
416
+ : dict[keys[0]]) || "".split("");
417
+
418
+ findChinese("del");
378
419
  };
379
420
 
380
421
  // 普通删除字符
381
422
  const delInputText = () => {
382
- // let carePos = getCaretPosition(keyStore.currentElement);
383
- let carePos = getCaretPosition(globalKey.currentElement);
384
- // let text = keyStore.currentElement.value;
385
- let text = globalKey.currentElement.value;
386
- if (carePos <= 0 || carePos > text.length) {
387
- // keyStore.currentElement.value = text;
388
- globalKey.currentElement.value = text;
389
- } else {
390
- // keyStore.currentElement.value =
391
- // text.slice(0, carePos - 1) + text.slice(carePos);
392
- globalKey.currentElement.value = text.slice(0, carePos - 1) + text.slice(carePos);
393
- }
394
- // keyStore.currentElement.setSelectionRange(carePos - 1, carePos - 1);
395
- globalKey.currentElement.setSelectionRange(carePos - 1, carePos - 1);
396
- triggerModel();
423
+ // let carePos = getCaretPosition(keyStore.currentElement);
424
+ let carePos = getCaretPosition(globalKey.currentElement);
425
+ // let text = keyStore.currentElement.value;
426
+ let text = globalKey.currentElement.value;
427
+ if (carePos <= 0 || carePos > text.length) {
428
+ // keyStore.currentElement.value = text;
429
+ globalKey.currentElement.value = text;
430
+ } else {
431
+ // keyStore.currentElement.value =
432
+ // text.slice(0, carePos - 1) + text.slice(carePos);
433
+ globalKey.currentElement.value =
434
+ text.slice(0, carePos - 1) + text.slice(carePos);
435
+ }
436
+ // keyStore.currentElement.setSelectionRange(carePos - 1, carePos - 1);
437
+ globalKey.currentElement.setSelectionRange(carePos - 1, carePos - 1);
438
+ triggerModel();
397
439
  };
398
440
 
399
441
  // 输入内容
400
442
  const setInputValue = (item) => {
401
- item = `${item}`;
402
- // let carePos = getCaretPosition(keyStore.currentElement);
403
- let carePos = getCaretPosition(globalKey.currentElement);
404
-
405
- // let text = keyStore.currentElement.value;
406
- let text = globalKey.currentElement.value;
407
-
408
- if (carePos <= 0) {
409
- text = item + text;
410
- } else if (carePos > text.length) {
411
- text = text + item;
412
- } else {
413
- text = text.slice(0, carePos) + item + text.slice(carePos);
414
- }
415
-
416
- // if (toUpKeyCase.value) {
417
- // // keyStore.currentElement.value = `${text}`.toUpperCase();
418
- // globalKey.currentElement.value = `${text}`.toUpperCase();
419
- // } else {
420
- // // keyStore.currentElement.value = text;
421
- // globalKey.currentElement.value = text;
422
- // }
423
- globalKey.currentElement.value = text;
424
- carePos += item.length + 1;
425
-
426
- // keyStore.currentElement.setSelectionRange(carePos - 1, carePos - 1);
427
- globalKey.currentElement.setSelectionRange(carePos - 1, carePos - 1);
428
- triggerModel();
429
- // const reg = /^[a-zA-Z]$/;
430
- // if (toUpKeyCase.value && reg.test(item)) {
431
- // keyStore.currentElement.value += item.toUpperCase();
432
- // } else {
433
- // keyStore.currentElement.value += item;
434
- // }
443
+ item = `${item}`;
444
+ // let carePos = getCaretPosition(keyStore.currentElement);
445
+ let carePos = getCaretPosition(globalKey.currentElement);
446
+
447
+ // let text = keyStore.currentElement.value;
448
+ let text = globalKey.currentElement.value;
449
+
450
+ if (carePos <= 0) {
451
+ text = item + text;
452
+ } else if (carePos > text.length) {
453
+ text = text + item;
454
+ } else {
455
+ text = text.slice(0, carePos) + item + text.slice(carePos);
456
+ }
457
+
458
+ // if (toUpKeyCase.value) {
459
+ // // keyStore.currentElement.value = `${text}`.toUpperCase();
460
+ // globalKey.currentElement.value = `${text}`.toUpperCase();
461
+ // } else {
462
+ // // keyStore.currentElement.value = text;
463
+ // globalKey.currentElement.value = text;
464
+ // }
465
+ globalKey.currentElement.value = text;
466
+ carePos += item.length + 1;
467
+
468
+ // keyStore.currentElement.setSelectionRange(carePos - 1, carePos - 1);
469
+ globalKey.currentElement.setSelectionRange(carePos - 1, carePos - 1);
470
+ triggerModel();
471
+ // const reg = /^[a-zA-Z]$/;
472
+ // if (toUpKeyCase.value && reg.test(item)) {
473
+ // keyStore.currentElement.value += item.toUpperCase();
474
+ // } else {
475
+ // keyStore.currentElement.value += item;
476
+ // }
435
477
  };
436
478
 
437
479
  const cn_input = ref("");
@@ -445,236 +487,218 @@ let doubleSpell = {};
445
487
 
446
488
  // 获取词库
447
489
  const getChinese = () => {
448
- const promise = import("./static/dict/baseDict.json").then((res) => {
449
- dict = res;
450
- });
451
-
452
- const promise1 = import("./static/dict/chowder.json").then((res) => {
453
- doubleSpell = res;
454
- });
455
- promiseList.push(promise1);
456
- Promise.all(promiseList)
457
- .then(() => {
458
- console.log("加载完成");
459
- })
460
- .catch((err) => {
461
- console.error("词库错误", err);
490
+ const promise = import("./static/dict/baseDict.json").then((res) => {
491
+ dict = res;
492
+ });
493
+
494
+ const promise1 = import("./static/dict/chowder.json").then((res) => {
495
+ doubleSpell = res;
462
496
  });
497
+ promiseList.push(promise1);
498
+ Promise.all(promiseList)
499
+ .then(() => {
500
+ console.log("加载完成");
501
+ })
502
+ .catch((err) => {
503
+ console.error("词库错误", err);
504
+ });
463
505
  };
464
506
  getChinese();
465
507
 
466
508
  // 中文输入
467
509
  const chinese = (key) => {
468
- const reg = /^[a-zA-Z]$/;
469
- if (!reg.test(key)) {
470
- setInputValue(key);
471
- return;
472
- }
473
- cn_input.value += key; //拼音输入框添加拼音
474
- if (cn_input.value[0] == "'") {
475
- cn_input.value = cn_input.value.slice(1);
476
- }
477
- const specialPinYin = ["u", "v", "i"].includes(cn_input.value.split("")[0]); //判断是否是特殊拼音
478
- if (specialPinYin) {
479
- //如果是特殊拼音
480
- if (!cn_list_str.value.length) {
481
- //如果没有拼音列表
482
- //@ts-ignore
483
- cn_list_str.value = [key]; //拼音列表添加拼音
484
- } else {
485
- const value = cn_list_str.value[0] + key; //拼音列表第一个拼音加上当前拼音
486
- //@ts-ignore
487
- cn_list_str.value[0] = value; //拼音列表第一个拼音替换为新的拼音
510
+ const reg = /^[a-zA-Z]$/;
511
+ if (!reg.test(key)) {
512
+ setInputValue(key);
513
+ return;
514
+ }
515
+ cn_input.value += key; //拼音输入框添加拼音
516
+ if (cn_input.value[0] == "'") {
517
+ cn_input.value = cn_input.value.slice(1);
518
+ }
519
+ const specialPinYin = ["u", "v", "i"].includes(cn_input.value.split("")[0]); //判断是否是特殊拼音
520
+ if (specialPinYin) {
521
+ //如果是特殊拼音
522
+ if (!cn_list_str.value.length) {
523
+ //如果没有拼音列表
524
+ //@ts-ignore
525
+ cn_list_str.value = [key]; //拼音列表添加拼音
526
+ } else {
527
+ const value = cn_list_str.value[0] + key; //拼音列表第一个拼音加上当前拼音
528
+ //@ts-ignore
529
+ cn_list_str.value[0] = value; //拼音列表第一个拼音替换为新的拼音
530
+ }
531
+ return;
488
532
  }
489
- return;
490
- }
491
533
 
492
- findChinese("add", key); //查找中文
534
+ findChinese("add", key); //查找中文
493
535
  };
494
536
 
495
537
  // 查字典
496
538
  const findChinese = (type, key) => {
497
- // type = del key不需要传,type = add key必须要传
498
- l_min.value = 0; //最小值
499
- l_max.value = 10; //最大值
500
- const pinYinList = cn_input.value.split("'"); //拼音列表
501
- let pinYin = pinYinList[pinYinList.length - 1]; //当前拼音
502
-
503
- let re = new RegExp(`^${pinYin}\\w*`); //正则,匹配当前拼音开头的拼音
504
- let keys = Object.keys(dict) //获取拼音字典的key
505
- .filter((item) => {
506
- //过滤
507
- let strList = pinYin.split(""); //当前拼音转数组
508
-
509
- const temp = ["h", "o", "n", "a", "e"].includes(
510
- strList[strList.length - 1] //判断是否是特殊拼音
511
- );
512
- if (pinYin.length >= 2 && !temp) {
513
- //如果是特殊拼音
514
- if (item === pinYin) return true; //如果拼音字典的key等于当前拼音,返回true
515
- } else {
516
- let result = re.test(item); //如果不是特殊拼音,返回正则匹配结果
517
- return result;
518
- }
519
- })
520
- .sort();
521
- cn_list_str.value =
522
- keys.length > 1 ? keys.reduce((a, b) => a + dict[b], "") : dict[keys[0]]; //如果拼音列表大于1,拼接拼音列表,否则直接赋值
523
- // cn_list_str.value = cn_list_str.value.replaceAll("[object Object]", "");
524
-
525
- if (!cn_list_str.value || (!cn_list_str.value.length && type === "del")) {
526
- //如果拼音列表不存在或者拼音列表长度为0并且type为del
527
- cn_input.value = cn_input.value.replace(new RegExp(`(.*)${key}`), `$1'${key}`);
528
- }
529
-
530
- if (!cn_list_str.value && !Array.isArray(cn_list_str.value)) {
531
- cn_list_str.value = [];
532
- }
539
+ // type = del key不需要传,type = add key必须要传
540
+ l_min.value = 0; //最小值
541
+ l_max.value = 10; //最大值
542
+ const pinYinList = cn_input.value.split("'"); //拼音列表
543
+ let pinYin = pinYinList[pinYinList.length - 1]; //当前拼音
544
+
545
+ let re = new RegExp(`^${pinYin}\\w*`); //正则,匹配当前拼音开头的拼音
546
+ let keys = Object.keys(dict) //获取拼音字典的key
547
+ .filter((item) => {
548
+ //过滤
549
+ let strList = pinYin.split(""); //当前拼音转数组
550
+
551
+ const temp = ["h", "o", "n", "a", "e"].includes(
552
+ strList[strList.length - 1] //判断是否是特殊拼音
553
+ );
554
+ if (pinYin.length >= 2 && !temp) {
555
+ //如果是特殊拼音
556
+ if (item === pinYin) return true; //如果拼音字典的key等于当前拼音,返回true
557
+ } else {
558
+ let result = re.test(item); //如果不是特殊拼音,返回正则匹配结果
559
+ return result;
560
+ }
561
+ })
562
+ .sort();
563
+ cn_list_str.value =
564
+ keys.length > 1
565
+ ? keys.reduce((a, b) => a + dict[b], "")
566
+ : dict[keys[0]]; //如果拼音列表大于1,拼接拼音列表,否则直接赋值
567
+ // cn_list_str.value = cn_list_str.value.replaceAll("[object Object]", "");
568
+
569
+ if (!cn_list_str.value || (!cn_list_str.value.length && type === "del")) {
570
+ //如果拼音列表不存在或者拼音列表长度为0并且type为del
571
+ cn_input.value = cn_input.value.replace(
572
+ new RegExp(`(.*)${key}`),
573
+ `$1'${key}`
574
+ );
575
+ }
533
576
 
534
- keys = cn_input.value.split("'");
577
+ if (!cn_list_str.value && !Array.isArray(cn_list_str.value)) {
578
+ cn_list_str.value = [];
579
+ }
535
580
 
536
- if (keys.length >= 2) {
537
- cn_list_str.value = [];
538
- findDoubleSpell();
539
- }
581
+ keys = cn_input.value.split("'");
582
+
583
+ if (keys.length >= 2) {
584
+ cn_list_str.value = [];
585
+ findDoubleSpell();
586
+ }
540
587
  };
541
588
 
542
589
  // 连续输入
543
590
  const findDoubleSpell = () => {
544
- let keys = cn_input.value.split("'");
545
- const partDict = doubleSpell[cn_input.value.charAt(0)];
546
- if (!partDict) return;
547
- if (["an"].includes(keys[keys.length - 1])) {
548
- let tempStr = keys[keys.length - 2];
549
- if (["n"].includes(tempStr.charAt(tempStr.length - 1))) {
550
- let newTempStr = tempStr.slice(0, tempStr.length - 1);
551
- keys = [newTempStr, tempStr.slice(tempStr.length - 1) + keys[keys.length - 1]];
552
- cn_input.value = keys.join("'");
591
+ let keys = cn_input.value.split("'");
592
+ const partDict = doubleSpell[cn_input.value.charAt(0)];
593
+ if (!partDict) return;
594
+ if (["an"].includes(keys[keys.length - 1])) {
595
+ let tempStr = keys[keys.length - 2];
596
+ if (["n"].includes(tempStr.charAt(tempStr.length - 1))) {
597
+ let newTempStr = tempStr.slice(0, tempStr.length - 1);
598
+ keys = [
599
+ newTempStr,
600
+ tempStr.slice(tempStr.length - 1) + keys[keys.length - 1],
601
+ ];
602
+ cn_input.value = keys.join("'");
603
+ }
553
604
  }
554
- }
555
605
 
556
- let keyResult = Object.keys(partDict).filter((key) => {
557
- const keys = key.split("'");
558
- const cn_inputList = cn_input.value.split("'");
559
- const isLen = cn_inputList.length === keys.length;
560
- if (!isLen) return;
561
- let result = true;
562
- for (let i = 0; i < keys.length; i++) {
563
- if (keys[i].charAt(0) != cn_inputList[i].charAt(0)) {
564
- result = false;
565
- } else {
566
- const keyItemList = keys[i].split("");
567
- const strList = cn_inputList[i].split("");
568
- for (let j = 0; j < strList.length; j++) {
569
- if (!strList[j]) break;
570
- if (keyItemList[j] != strList[j]) {
571
- result = false;
572
- }
606
+ let keyResult = Object.keys(partDict).filter((key) => {
607
+ const keys = key.split("'");
608
+ const cn_inputList = cn_input.value.split("'");
609
+ const isLen = cn_inputList.length === keys.length;
610
+ if (!isLen) return;
611
+ let result = true;
612
+ for (let i = 0; i < keys.length; i++) {
613
+ if (keys[i].charAt(0) != cn_inputList[i].charAt(0)) {
614
+ result = false;
615
+ } else {
616
+ const keyItemList = keys[i].split("");
617
+ const strList = cn_inputList[i].split("");
618
+ for (let j = 0; j < strList.length; j++) {
619
+ if (!strList[j]) break;
620
+ if (keyItemList[j] != strList[j]) {
621
+ result = false;
622
+ }
623
+ }
624
+ }
625
+ }
626
+ if (result && isLen) {
627
+ return partDict[key];
628
+ }
629
+ });
630
+
631
+ let strList = [];
632
+ let singleDictList = [];
633
+ const singleDict = dict;
634
+ for (let key of keyResult) {
635
+ let keyList = key.split("'");
636
+ strList.push(partDict[key].split(","));
637
+ for (let item of keyList) {
638
+ if (singleDict[item]) {
639
+ singleDictList.push(singleDict[item].split(""));
640
+ }
573
641
  }
574
- }
575
- }
576
- if (result && isLen) {
577
- return partDict[key];
578
- }
579
- });
580
-
581
- let strList = [];
582
- let singleDictList = [];
583
- const singleDict = dict;
584
- for (let key of keyResult) {
585
- let keyList = key.split("'");
586
- strList.push(partDict[key].split(","));
587
- for (let item of keyList) {
588
- if (singleDict[item]) {
589
- singleDictList.push(singleDict[item].split(""));
590
- }
591
642
  }
592
- }
593
- if (!keyResult.length && keys.length) {
594
- for (let item of keys) {
595
- if (singleDict[item]) {
596
- singleDictList.push(singleDict[item].split(""));
597
- }
643
+ if (!keyResult.length && keys.length) {
644
+ for (let item of keys) {
645
+ if (singleDict[item]) {
646
+ singleDictList.push(singleDict[item].split(""));
647
+ }
648
+ }
598
649
  }
599
- }
600
650
 
601
- singleDictList = Array.from(new Set(singleDictList.flat(2)));
602
- strList = strList
603
- .flat(2)
651
+ singleDictList = Array.from(new Set(singleDictList.flat(2)));
652
+ strList = strList
653
+ .flat(2)
654
+ //@ts-ignore
655
+ .sort((a, b) => {
656
+ if (b.length > a.length) return -1;
657
+ })
658
+ .reverse();
604
659
  //@ts-ignore
605
- .sort((a, b) => {
606
- if (b.length > a.length) return -1;
607
- })
608
- .reverse();
609
- //@ts-ignore
610
- cn_list_str.value = strList.concat(singleDictList);
660
+ cn_list_str.value = strList.concat(singleDictList);
611
661
  };
612
662
 
613
663
  //获取光标位置
614
664
  const getCaretPosition = (element) => {
615
- let carePos = 0;
616
- try {
617
- carePos = element.selectionStart;
618
- } catch (error) {}
619
- cursorPosition.value = carePos;
620
- return carePos;
621
- // sel,
622
- // range;
623
-
624
- // if (window.getSelection) {
625
- // sel = window.getSelection();
626
-
627
- // if (sel?.rangeCount) {
628
- // range = sel.getRangeAt(0);
629
- // console.log(
630
- // "🚀 ~ file: Keyboardcon.vue:459 ~ getCaretPosition ~ range:",
631
- // range
632
- // );
633
- // if (range.commonAncestorContainer.children[0] == element) {
634
- // // carePos = range.endOffset;
635
- // carePos = range.endOffset;
636
-
637
- // if (
638
- // range.commonAncestorContainer
639
- // // range.commonAncestorContainer.length !=
640
- // // range.commonAncestorContainer.data.trim().length
641
- // ) {
642
- // carePos -= 1;
643
- // }
644
- // }
645
- // }
646
- // }
665
+ let carePos = 0;
666
+ try {
667
+ carePos = element.selectionStart;
668
+ } catch (error) {}
669
+ cursorPosition.value = carePos;
670
+ return carePos;
647
671
  };
648
672
 
649
673
  // 符号切换
650
674
  const checkChinese = (item) => {
651
- console.log(cn_list_str.value);
652
- cn_input.value = "";
653
- cn_list_str.value = [];
654
- showMore.value = false;
655
- // keyStore.currentElement.focus();
656
- // keyStore.isChinese = !keyStore.isChinese;
657
- globalKey.currentElement.focus();
658
- keyStore.isChinese = !keyStore.isChinese;
675
+ console.log(cn_list_str.value);
676
+ cn_input.value = "";
677
+ cn_list_str.value = [];
678
+ showMore.value = false;
679
+ // keyStore.currentElement.focus();
680
+ // keyStore.isChinese = !keyStore.isChinese;
681
+ globalKey.currentElement.focus();
682
+ keyStore.isChinese = !keyStore.isChinese;
659
683
  };
660
684
 
661
685
  // 类型
662
686
  watchEffect(() => {
663
- if (keyStore.inputType == "number") {
664
- lists.value = numberKeyBoradMap;
665
- } else {
666
- lists.value = textKeyMap;
667
- }
687
+ if (keyStore.inputType == "number") {
688
+ lists.value = numberKeyBoradMap;
689
+ } else {
690
+ lists.value = textKeyMap;
691
+ }
668
692
  });
669
693
 
670
694
  //#endregion -----------------------------------------------------------
671
695
 
672
696
  //#region $sy global ------------------------------------------------------------
673
697
  const showKeyboard = () => {
674
- keyStore.keyboardcon = true;
698
+ keyStore.keyboardcon = true;
675
699
  };
676
700
  const hideKeyboard = () => {
677
- keyStore.keyboardcon = false;
701
+ keyStore.keyboardcon = false;
678
702
  };
679
703
  window.globalThis.$sy.key.open = showKeyboard;
680
704
  window.globalThis.$sy.key.close = hideKeyboard;
@@ -683,11 +707,11 @@ window.globalThis.$sy.key.close = hideKeyboard;
683
707
  //#region input ⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️
684
708
  // 手动触发input事件
685
709
  const triggerModel = () => {
686
- globalKey.currentElement.dispatchEvent(new Event("input"));
710
+ globalKey.currentElement.dispatchEvent(new Event("input"));
687
711
  };
688
712
 
689
713
  const makeFocus = (e) => {
690
- globalKey.currentElement.focus();
714
+ globalKey.currentElement.focus();
691
715
  };
692
716
 
693
717
  //#endregion ⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️⬆️
@@ -703,32 +727,33 @@ const longpressSt = ref(false);
703
727
 
704
728
  // 定义长按事件逻辑
705
729
  const onLongPress = (t) => {
706
- // alert("长按事件触发");
707
- longpressSt.value = setInterval(() => {
708
- // console.log("长按触发", t);
709
- choosekey(t);
710
- }, 50);
730
+ // alert("长按事件触发");
731
+ longpressSt.value = setInterval(() => {
732
+ // console.log("长按触发", t);
733
+ choosekey(t);
734
+ }, 50);
711
735
  };
712
736
 
713
737
  // 开始按压的处理函数
714
738
  const startPress = (e) => {
715
- let value = e.target.children[0]?.innerText || e.target.children[0].className;
716
- if (value != "del") return;
717
- pressTimer.value = setTimeout(() => {
718
- onLongPress(value);
719
- }, 500); // 设置长按时间为500毫秒
739
+ let value =
740
+ e.target.children[0]?.innerText || e.target.children[0].className;
741
+ if (value != "del") return;
742
+ pressTimer.value = setTimeout(() => {
743
+ onLongPress(value);
744
+ }, 500); // 设置长按时间为500毫秒
720
745
  };
721
746
 
722
747
  // 结束按压的处理函数
723
748
  const endPress = () => {
724
- clearTimeout(pressTimer.value);
725
- clearInterval(longpressSt.value);
749
+ clearTimeout(pressTimer.value);
750
+ clearInterval(longpressSt.value);
726
751
  };
727
752
 
728
753
  // 取消按压的处理函数
729
754
  const cancelPress = () => {
730
- clearTimeout(pressTimer.value);
731
- clearInterval(longpressSt.value);
755
+ clearTimeout(pressTimer.value);
756
+ clearInterval(longpressSt.value);
732
757
  };
733
758
 
734
759
  // 添加和清理事件监听器
@@ -742,445 +767,445 @@ const cancelPress = () => {
742
767
  @import "./theme.scss";
743
768
 
744
769
  .defaultCss {
745
- --h: 4vh;
746
- --gap: 0.6vh;
747
- --fontSize: 2vh;
748
- --borra: 0.4vh;
770
+ --h: 4vh;
771
+ --gap: 0.6vh;
772
+ --fontSize: 2vh;
773
+ --borra: 0.4vh;
749
774
  }
750
775
 
751
776
  .upKeyCase {
752
- --fontSize: 2vh;
777
+ --fontSize: 2vh;
753
778
  }
754
779
 
755
780
  .keyboardcon {
756
- position: fixed;
757
- background-color: #212123;
758
- width: 100%;
759
- max-width: 1280px;
760
- margin: auto;
761
- left: 0;
762
- right: 0;
763
- bottom: 0;
764
- font-size: var(--fontSize);
765
- padding: 1.2vh 1.2vh 0.6vh;
766
- box-sizing: border-box;
767
- box-shadow: 0 0 1.5vh 0 rgb(117, 117, 117);
768
- z-index: 10000;
769
- // // @include key_background("keyboard_background");
770
- background: var(--keyboard_background);
771
- border-radius: 1.2vh 1.2vh 0 0;
772
- transition: all 0.2s;
773
- & * {
781
+ position: fixed;
782
+ background-color: #212123;
783
+ width: 100%;
784
+ max-width: 1280px;
785
+ margin: auto;
786
+ left: 0;
787
+ right: 0;
788
+ bottom: 0;
789
+ font-size: var(--fontSize);
790
+ padding: 1.2vh 1.2vh 0.6vh;
774
791
  box-sizing: border-box;
775
- }
776
- .btns {
777
- color: rgb(0, 123, 255);
778
- display: flex;
779
- justify-content: space-between;
780
- align-items: center;
781
- margin: 1.2vh 0;
782
- font-size: 1.2vh;
783
- cursor: pointer;
784
- > div {
785
- height: 1.2vh;
786
- span {
787
- color: gainsboro;
788
- transition: all 0.3s;
789
- }
790
- }
791
-
792
- .ch {
793
- font-size: 1.4vh;
794
- color: rgb(0, 123, 255);
795
- }
796
- }
797
-
798
- .chinese {
799
- // border: 1px solid red;
800
-
801
- .pinyin {
802
- padding: 4px;
803
- box-sizing: border-box;
804
- // border: 1px solid red;
805
- }
806
-
807
- .wenzi {
808
- position: relative;
809
- height: 3.6vh;
810
-
811
- // border: 1px solid red;
812
- background: var(--keyboard_background);
813
- margin-bottom: 0.6vh;
814
- .wenzi_box {
815
- display: flex;
816
- // flex-wrap: wrap;
817
- gap: 10px;
818
- padding: 5px;
819
- overflow: auto;
820
- &::-webkit-scrollbar {
821
- display: none; /* 适用于 Chrome, Safari 和 Opera */
822
- }
823
- scrollbar-width: none; /* 适用于 Firefox */
824
- position: absolute;
825
- left: 0;
826
- top: 0;
827
- width: 98%;
828
- height: 100%;
829
- background: var(--keyboard_background);
830
- z-index: 1;
831
- transition: all 0.5s;
832
- box-sizing: border-box;
833
-
834
- span {
835
- flex-shrink: 0;
836
- padding: 0.24vh 0.48vh;
837
- border-radius: 6px;
838
- // border: 1px solid red;
839
- height: fit-content;
840
-
841
- &:active {
842
- // @include key_background("key_active_background");
843
- background: var(--key_active_background);
844
- box-shadow: inset 0px 0px 2px 2px #65708220;
845
- transform: scale(0.99);
846
- }
847
- }
848
- }
849
-
850
- .wenzi_box_more {
851
- // flex-wrap: wrap;
852
- padding-right: 1.8vh;
792
+ box-shadow: 0 0 1.5vh 0 rgb(117, 117, 117);
793
+ z-index: 10000;
794
+ // // @include key_background("keyboard_background");
795
+ background: var(--keyboard_background);
796
+ border-radius: 1.2vh 1.2vh 0 0;
797
+ transition: all 0.2s;
798
+ & * {
853
799
  box-sizing: border-box;
854
- width: 102%;
855
- left: -0.18vh;
856
- // height: 31vh;
857
- height: 25vh;
858
-
859
- // border: 1px solid red;
860
- }
861
-
862
- .moreText {
863
- position: absolute;
864
- height: 3.5vh;
865
- top: 0;
866
- right: -5px;
867
- z-index: 100;
868
- padding: 0 0.3vh;
869
- display: flex;
870
- justify-content: center;
871
- align-items: center;
872
- border-radius: var(--borra);
873
- // border: 1px solid red;
874
-
875
- // @include key_background("keyboard_background");
876
- background: var(--keyboard_background);
877
-
878
- &:active {
879
- // @include key_background("key_active_background");
880
- background: var(--key_active_background);
881
- box-shadow: inset 0px 0px 2px 2px #65708220;
882
- transform: scale(0.99);
883
- }
884
-
885
- .el-icon {
886
- transition: all 0.4s ease;
887
- }
888
- }
889
800
  }
890
- }
891
-
892
- .number_list {
893
- display: grid;
894
- grid-template-columns: repeat(3, 1fr);
895
- text-align: center;
896
- gap: var(--gap);
897
-
898
- .key_item {
899
- border-radius: 3px;
900
- font-weight: bold;
901
- overflow: hidden;
902
- user-select: none;
903
- // @include key_color("key_color");
904
- color: var(--key_color);
905
- .key {
906
- box-shadow: inset 0px 0px 2px 0px #8f9eae;
907
- // @include key_background("key_background");
908
- border-radius: var(--borra);
909
-
910
- background: var(--keyboard_background);
911
- height: var(--h);
912
- display: flex;
913
- justify-content: center;
914
- align-items: center;
915
- // padding: 6px 0;
916
-
917
- &:active {
918
- // @include key_background("key_active_background");
919
- background: var(--key_active_background);
920
- box-shadow: inset 0px 0px 2px 2px #65708220;
921
- transform: scale(0.99);
922
- }
923
- }
924
-
925
- .keys {
801
+ .btns {
802
+ color: rgb(0, 123, 255);
926
803
  display: flex;
927
- gap: 4px;
928
- height: var(--h);
929
- display: flex;
930
- justify-content: center;
804
+ justify-content: space-between;
931
805
  align-items: center;
932
-
933
- span {
934
- flex: 1;
935
- box-shadow: inset 0px 0px 2px 0px #8f9eae;
936
- // @include key_background("key_background");
937
- background: var(--key_background);
938
- border-radius: 3px;
939
- height: 100%;
940
- display: flex;
941
- justify-content: center;
942
- align-items: center;
943
-
944
- &:active {
945
- // @include key_background("key_active_background");
946
- background: var(--key_active_background);
947
- box-shadow: inset 0px 0px 2px 2px #65708220;
948
- transform: scale(0.99);
949
- }
806
+ margin: 1.2vh 0;
807
+ font-size: 1.2vh;
808
+ cursor: pointer;
809
+ > div {
810
+ height: 1.2vh;
811
+ span {
812
+ color: gainsboro;
813
+ transition: all 0.3s;
814
+ }
950
815
  }
951
- }
952
-
953
- .del {
954
- display: flex;
955
- justify-content: center;
956
- align-items: center;
957
- height: var(--h);
958
816
 
959
- img {
960
- transform: scale(0.9);
961
- // @include filter("key_filter");
962
- height: 100%;
963
- filter: var(--key_filter);
817
+ .ch {
818
+ font-size: 1.4vh;
819
+ color: rgb(0, 123, 255);
964
820
  }
965
- }
966
821
  }
967
- }
968
-
969
- .text_list {
970
- --symbolP: 0 5%;
971
- }
972
- .isSymbol {
973
- --symbolP: 0;
974
- }
975
- .text_list {
976
- display: grid;
977
- grid-template-columns: repeat(1, 1fr);
978
- text-align: center;
979
- gap: var(--gap);
980
- color: rgb(238, 238, 238);
981
-
982
- .key_item_row {
983
- display: flex;
984
- gap: var(--gap);
985
- width: 100%;
986
- // border: 1px solid red;
987
- // 全部
988
- .key_item_column {
989
- // flex: 1;
990
- font-weight: bold;
991
- color: var(--key_color);
992
- overflow: hidden;
993
- user-select: none;
994
- box-sizing: border-box;
995
- display: flex;
996
- justify-content: center;
997
- align-items: center;
998
- height: var(--h);
999
- & span,
1000
- & img {
1001
- pointer-events: none;
1002
- }
1003
- .key {
1004
- border-radius: var(--borra);
1005
- display: flex;
1006
- justify-content: center;
1007
- align-items: center;
1008
- height: 100%;
1009
- width: 100%;
1010
- font-size: var(--fontSize);
1011
- box-shadow: inset 0px 0px 2px 0px #8f9eae;
1012
-
1013
- background: var(--key_background);
1014
- span {
1015
- height: fit-content;
1016
- line-height: 1.2vh;
1017
- // border: 1px solid red;
1018
- }
1019
822
 
1020
- &:active {
1021
- background: var(--key_active_background);
1022
- box-shadow: inset 0px 0px 2px 2px #65708220;
1023
- transform: scale(0.99);
1024
- }
1025
- }
1026
- }
1027
-
1028
- // 单独第一行
1029
- &:nth-child(1) {
1030
- // justify-content: center;
1031
- .key_item_column {
1032
- // border: 1px solid red;
1033
- flex: 1;
1034
- flex-shrink: 0;
1035
- .key {
1036
- padding: 0;
1037
- box-sizing: border-box;
1038
- }
1039
- // flex: 1;
1040
- }
1041
- }
823
+ .chinese {
824
+ // border: 1px solid red;
1042
825
 
1043
- // 单独第2行
1044
- &:nth-child(2) {
1045
- display: flex;
1046
- justify-content: center;
1047
- padding: var(--symbolP);
1048
- .key_item_column {
1049
- flex-shrink: 0;
1050
- flex: 1;
1051
- .key {
1052
- padding: 0;
826
+ .pinyin {
827
+ padding: 4px;
1053
828
  box-sizing: border-box;
1054
- }
829
+ // border: 1px solid red;
1055
830
  }
1056
831
 
1057
- // grid-template-columns: repeat(9, 1fr);
1058
- }
1059
-
1060
- --flw: 10%; // 3 4 头尾
1061
- --mflw: 60px;
1062
- // 单独第3行
1063
- &:nth-child(3) {
1064
- justify-self: center;
1065
- display: flex;
832
+ .wenzi {
833
+ position: relative;
834
+ height: 3.6vh;
1066
835
 
1067
- .key_item_column {
1068
- // flex: 1;
1069
- &:nth-child(1) {
1070
- padding: 0;
1071
- .key {
1072
- box-sizing: border-box;
1073
- display: flex;
1074
- justify-content: center;
1075
- align-items: center;
1076
- font-size: 1.8vh;
1077
- // border: 1px solid red;
1078
- img {
1079
- transform: scale(0.7);
1080
- // @include filter("key_filter");
1081
- filter: var(--key_filter);
1082
- }
836
+ // border: 1px solid red;
837
+ background: var(--keyboard_background);
838
+ margin-bottom: 0.6vh;
839
+ .wenzi_box {
840
+ display: flex;
841
+ // flex-wrap: wrap;
842
+ gap: 10px;
843
+ padding: 5px;
844
+ overflow: auto;
845
+ &::-webkit-scrollbar {
846
+ display: none; /* 适用于 Chrome, Safari 和 Opera */
847
+ }
848
+ scrollbar-width: none; /* 适用于 Firefox */
849
+ position: absolute;
850
+ left: 0;
851
+ top: 0;
852
+ width: 98%;
853
+ height: 100%;
854
+ background: var(--keyboard_background);
855
+ z-index: 1;
856
+ transition: all 0.5s;
857
+ box-sizing: border-box;
858
+
859
+ span {
860
+ flex-shrink: 0;
861
+ padding: 0.24vh 0.48vh;
862
+ border-radius: 6px;
863
+ // border: 1px solid red;
864
+ height: fit-content;
865
+
866
+ &:active {
867
+ // @include key_background("key_active_background");
868
+ background: var(--key_active_background);
869
+ box-shadow: inset 0px 0px 2px 2px #65708220;
870
+ transform: scale(0.99);
871
+ }
872
+ }
1083
873
  }
1084
874
 
1085
- .toUpKeyCase {
1086
- // box-shadow: none;
1087
- // border: 1px solid red; ´
1088
- img {
1089
- // filter: invert(100%);
1090
- }
1091
- }
1092
- }
1093
-
1094
- &:first-child,
1095
- &:last-child {
1096
- width: var(--flw);
1097
- min-width: var(--mflw);
1098
-
1099
- img {
1100
- transform: scale(0.8);
1101
- height: 80%;
1102
- // @include filter("key_filter");
1103
- filter: var(--key_filter);
1104
- }
1105
- }
875
+ .wenzi_box_more {
876
+ // flex-wrap: wrap;
877
+ padding-right: 1.8vh;
878
+ box-sizing: border-box;
879
+ width: 102%;
880
+ left: -0.18vh;
881
+ // height: 31vh;
882
+ height: 25vh;
1106
883
 
1107
- &:not(&:first-child, &:last-child) {
1108
- flex: 1;
1109
- }
884
+ // border: 1px solid red;
885
+ }
1110
886
 
1111
- .key {
1112
- padding: 0;
1113
- box-sizing: border-box;
1114
- }
887
+ .moreText {
888
+ position: absolute;
889
+ height: 3.5vh;
890
+ top: 0;
891
+ right: -5px;
892
+ z-index: 100;
893
+ padding: 0 0.3vh;
894
+ display: flex;
895
+ justify-content: center;
896
+ align-items: center;
897
+ border-radius: var(--borra);
898
+ // border: 1px solid red;
899
+
900
+ // @include key_background("keyboard_background");
901
+ background: var(--keyboard_background);
902
+
903
+ &:active {
904
+ // @include key_background("key_active_background");
905
+ background: var(--key_active_background);
906
+ box-shadow: inset 0px 0px 2px 2px #65708220;
907
+ transform: scale(0.99);
908
+ }
909
+
910
+ .el-icon {
911
+ transition: all 0.4s ease;
912
+ }
913
+ }
1115
914
  }
1116
- }
1117
-
1118
- // 单独第4行
1119
- &:nth-child(4) {
1120
- grid-template-columns: 0.3fr 1fr 0.3fr;
915
+ }
1121
916
 
1122
- .key_item_column {
1123
- flex-shrink: 0;
917
+ .number_list {
918
+ display: grid;
919
+ grid-template-columns: repeat(3, 1fr);
920
+ text-align: center;
921
+ gap: var(--gap);
1124
922
 
1125
- // flex: 1;
1126
- font-weight: 400;
1127
- // border: 1px solid red;
1128
- .key {
1129
- padding: 0;
1130
- box-sizing: border-box;
1131
- font-size: 1.8vh;
923
+ .key_item {
924
+ border-radius: 3px;
1132
925
  font-weight: bold;
926
+ overflow: hidden;
927
+ user-select: none;
928
+ // @include key_color("key_color");
929
+ color: var(--key_color);
930
+ .key {
931
+ box-shadow: inset 0px 0px 2px 0px #8f9eae;
932
+ // @include key_background("key_background");
933
+ border-radius: var(--borra);
934
+
935
+ background: var(--keyboard_background);
936
+ height: var(--h);
937
+ display: flex;
938
+ justify-content: center;
939
+ align-items: center;
940
+ // padding: 6px 0;
941
+
942
+ &:active {
943
+ // @include key_background("key_active_background");
944
+ background: var(--key_active_background);
945
+ box-shadow: inset 0px 0px 2px 2px #65708220;
946
+ transform: scale(0.99);
947
+ }
948
+ }
1133
949
 
1134
- img {
1135
- height: 100%;
950
+ .keys {
951
+ display: flex;
952
+ gap: 4px;
953
+ height: var(--h);
954
+ display: flex;
955
+ justify-content: center;
956
+ align-items: center;
957
+
958
+ span {
959
+ flex: 1;
960
+ box-shadow: inset 0px 0px 2px 0px #8f9eae;
961
+ // @include key_background("key_background");
962
+ background: var(--key_background);
963
+ border-radius: 3px;
964
+ height: 100%;
965
+ display: flex;
966
+ justify-content: center;
967
+ align-items: center;
968
+
969
+ &:active {
970
+ // @include key_background("key_active_background");
971
+ background: var(--key_active_background);
972
+ box-shadow: inset 0px 0px 2px 2px #65708220;
973
+ transform: scale(0.99);
974
+ }
975
+ }
1136
976
  }
1137
- }
1138
977
 
1139
- &:first-child,
1140
- &:last-child {
1141
- width: var(--flw);
1142
- min-width: var(--mflw);
1143
- // font-size: 14px;
978
+ .del {
979
+ display: flex;
980
+ justify-content: center;
981
+ align-items: center;
982
+ height: var(--h);
983
+
984
+ img {
985
+ transform: scale(0.9);
986
+ // @include filter("key_filter");
987
+ height: 100%;
988
+ filter: var(--key_filter);
989
+ }
990
+ }
991
+ }
992
+ }
1144
993
 
994
+ .text_list {
995
+ --symbolP: 0 5%;
996
+ }
997
+ .isSymbol {
998
+ --symbolP: 0;
999
+ }
1000
+ .text_list {
1001
+ display: grid;
1002
+ grid-template-columns: repeat(1, 1fr);
1003
+ text-align: center;
1004
+ gap: var(--gap);
1005
+ color: rgb(238, 238, 238);
1006
+
1007
+ .key_item_row {
1145
1008
  display: flex;
1146
- justify-content: center;
1147
- align-items: center;
1009
+ gap: var(--gap);
1010
+ width: 100%;
1011
+ // border: 1px solid red;
1012
+ // 全部
1013
+ .key_item_column {
1014
+ // flex: 1;
1015
+ font-weight: bold;
1016
+ color: var(--key_color);
1017
+ overflow: hidden;
1018
+ user-select: none;
1019
+ box-sizing: border-box;
1020
+ display: flex;
1021
+ justify-content: center;
1022
+ align-items: center;
1023
+ height: var(--h);
1024
+ & span,
1025
+ & img {
1026
+ pointer-events: none;
1027
+ }
1028
+ .key {
1029
+ border-radius: var(--borra);
1030
+ display: flex;
1031
+ justify-content: center;
1032
+ align-items: center;
1033
+ height: 100%;
1034
+ width: 100%;
1035
+ font-size: var(--fontSize);
1036
+ box-shadow: inset 0px 0px 2px 0px #8f9eae;
1037
+
1038
+ background: var(--key_background);
1039
+ span {
1040
+ height: fit-content;
1041
+ line-height: 1.2vh;
1042
+ // border: 1px solid red;
1043
+ }
1044
+
1045
+ &:active {
1046
+ background: var(--key_active_background);
1047
+ box-shadow: inset 0px 0px 2px 2px #65708220;
1048
+ transform: scale(0.99);
1049
+ }
1050
+ }
1051
+ }
1148
1052
 
1149
- .key {
1150
- display: flex;
1151
- justify-content: center;
1152
- align-items: center;
1153
-
1154
- img {
1155
- transform: scale(0.8);
1156
- filter: var(--key_filter);
1157
- }
1053
+ // 单独第一行
1054
+ &:nth-child(1) {
1055
+ // justify-content: center;
1056
+ .key_item_column {
1057
+ // border: 1px solid red;
1058
+ flex: 1;
1059
+ flex-shrink: 0;
1060
+ .key {
1061
+ padding: 0;
1062
+ box-sizing: border-box;
1063
+ }
1064
+ // flex: 1;
1065
+ }
1158
1066
  }
1159
- }
1160
1067
 
1161
- &:nth-child(2) {
1162
- flex: 1;
1068
+ // 单独第2行
1069
+ &:nth-child(2) {
1070
+ display: flex;
1071
+ justify-content: center;
1072
+ padding: var(--symbolP);
1073
+ .key_item_column {
1074
+ flex-shrink: 0;
1075
+ flex: 1;
1076
+ .key {
1077
+ padding: 0;
1078
+ box-sizing: border-box;
1079
+ }
1080
+ }
1081
+
1082
+ // grid-template-columns: repeat(9, 1fr);
1083
+ }
1084
+
1085
+ --flw: 10%; // 3 4 头尾
1086
+ --mflw: 60px;
1087
+ // 单独第3行
1088
+ &:nth-child(3) {
1089
+ justify-self: center;
1090
+ display: flex;
1091
+
1092
+ .key_item_column {
1093
+ // flex: 1;
1094
+ &:nth-child(1) {
1095
+ padding: 0;
1096
+ .key {
1097
+ box-sizing: border-box;
1098
+ display: flex;
1099
+ justify-content: center;
1100
+ align-items: center;
1101
+ font-size: 1.8vh;
1102
+ // border: 1px solid red;
1103
+ img {
1104
+ transform: scale(0.7);
1105
+ // @include filter("key_filter");
1106
+ filter: var(--key_filter);
1107
+ }
1108
+ }
1109
+
1110
+ .toUpKeyCase {
1111
+ // box-shadow: none;
1112
+ // border: 1px solid red; ´
1113
+ img {
1114
+ // filter: invert(100%);
1115
+ }
1116
+ }
1117
+ }
1118
+
1119
+ &:first-child,
1120
+ &:last-child {
1121
+ width: var(--flw);
1122
+ min-width: var(--mflw);
1123
+
1124
+ img {
1125
+ transform: scale(0.8);
1126
+ height: 80%;
1127
+ // @include filter("key_filter");
1128
+ filter: var(--key_filter);
1129
+ }
1130
+ }
1131
+
1132
+ &:not(&:first-child, &:last-child) {
1133
+ flex: 1;
1134
+ }
1135
+
1136
+ .key {
1137
+ padding: 0;
1138
+ box-sizing: border-box;
1139
+ }
1140
+ }
1141
+ }
1163
1142
 
1164
- img {
1165
- transform: scale(0.8);
1166
- filter: var(--key_filter);
1143
+ // 单独第4行
1144
+ &:nth-child(4) {
1145
+ grid-template-columns: 0.3fr 1fr 0.3fr;
1146
+
1147
+ .key_item_column {
1148
+ flex-shrink: 0;
1149
+
1150
+ // flex: 1;
1151
+ font-weight: 400;
1152
+ // border: 1px solid red;
1153
+ .key {
1154
+ padding: 0;
1155
+ box-sizing: border-box;
1156
+ font-size: 1.8vh;
1157
+ font-weight: bold;
1158
+
1159
+ img {
1160
+ height: 100%;
1161
+ }
1162
+ }
1163
+
1164
+ &:first-child,
1165
+ &:last-child {
1166
+ width: var(--flw);
1167
+ min-width: var(--mflw);
1168
+ // font-size: 14px;
1169
+
1170
+ display: flex;
1171
+ justify-content: center;
1172
+ align-items: center;
1173
+
1174
+ .key {
1175
+ display: flex;
1176
+ justify-content: center;
1177
+ align-items: center;
1178
+
1179
+ img {
1180
+ transform: scale(0.8);
1181
+ filter: var(--key_filter);
1182
+ }
1183
+ }
1184
+ }
1185
+
1186
+ &:nth-child(2) {
1187
+ flex: 1;
1188
+
1189
+ img {
1190
+ transform: scale(0.8);
1191
+ filter: var(--key_filter);
1192
+ }
1193
+ }
1194
+ }
1167
1195
  }
1168
- }
1169
1196
  }
1170
- }
1171
1197
  }
1172
- }
1173
1198
  }
1174
1199
 
1175
1200
  // 显示动画
1176
1201
  .keyboardcon {
1177
- transition: all 0.3s ease-in-out;
1178
- transform: translateY(100%);
1179
- opacity: 0;
1202
+ transition: all 0.3s ease-in-out;
1203
+ transform: translateY(100%);
1204
+ opacity: 0;
1180
1205
  }
1181
1206
 
1182
1207
  .show {
1183
- transform: translateY(0%);
1184
- opacity: 1;
1208
+ transform: translateY(0%);
1209
+ opacity: 1;
1185
1210
  }
1186
1211
  </style>