关于input的监听聚焦事件
今天是打算开始实战自己一直要写的网站,然后开始疯狂的翻网站找灵感,在路过阿里云的时候,突然发现——欸?这个输入框的效果看着可以欸,于是乎,电源一拔坐了起来,分析效果。
其实这个效果并不难理解:
1. 当鼠标指向的时候,文本框会拉长 ;
2. 当鼠标移开的时候,文本框会恢复原来长度;
3. 当点击输入框后,光标在输入框中聚焦后,鼠标再移开,它会保持拉长后的长度;
4. 当失去聚焦的时候,文本框长度再次缩短;
一分析完,就开始埋头劈里啪啦的一阵猛敲:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>个人比较喜欢用18号字, Fira Code, 行距 1.02 看着特舒服</title>
</head>
<style>
.search{
width: 10rem; /* 初始宽度 */
font-size: 1.1rem;
color: ghostwhite;
padding: 0.411rem 1rem; /* 为了让输入框文本在中心(当时写的时候没有注意到这点,直接设置的高度,导致输入聚焦有点偏了...) */
background-color: #0001;
border: 1px solid #7b4aff;
-webkit-border-radius: 0.2rem; /* 圆角 */
-moz-border-radius: 0.2rem;
border-radius: 0.2rem;
-webkit-transition: 1.2s cubic-bezier(0.46, 0.26, 0.22, 0.76); /* 变换动画1.2s 速度使用贝塞尔曲线 */
-moz-transition: 1.2s cubic-bezier(0.46, 0.26, 0.22, 0.76);
-ms-transition: 1.2s cubic-bezier(0.46, 0.26, 0.22, 0.76);
-o-transition: 1.2s cubic-bezier(0.46, 0.26, 0.22, 0.76);
transition: 1.2s cubic-bezier(0.46, 0.26, 0.22, 0.76);
}
.search:hover{
width: 22rem; /* 光标经过拉长 */
border: 1px solid #7b4aff;
background-color: rgba(18, 18, 39, 0.4);
-webkit-border-radius: 0.2rem;
-moz-border-radius: 0.2rem;
border-radius: 0.2rem;
}
</style>
<body>
<header>
<div class="topBar">
<input class="search" type="text" value=""/>
</div>
</header>
</body>
</html>
第一步鼠标经过的算是解决了,终于遇到了正真的问题:
不知道如何监听聚焦事件,找了很多篇文章,基本上都是说用这种方法可以获取聚焦:
1 <script>
2 document.getElementById('search').focus();
3 </script>
……这哪是监听聚焦事件啊,这就是默认把光标停在input里面嘛,根本没有解决我的问题。
无奈之下,只好开始各种令人无语的尝试,几乎所有的可能性都试过了,抱着试试的心理,敲下了一段addEventListener(); 在一种似乎是巧合的情况下,我在监听事件里的语法提示中找到了focus 和 blur !!
于是就有了接下来的内容:
1 <script>
2 var search = document.getElementsByClassName('search'); // 根据class名称获取标签 返回的是一个数组
3
4 search[0].addEventListener('focus', function(){ // 监听光标聚焦事件
5 search[0].style.width = 22 + 'rem'; // 选中保持拉长状态
6 })
7
8 search[0].addEventListener('blur', function(){
9 search[0].style.width = 10 + 'rem'; // 未被选中的时候恢复状态
10 search[0].value = null; // 清空内容
11 })
12
13 </script>
到这里的时候,已经能看到效果了,分析出来的四个条件都满足了,但是,就这样了么?
很明显不行啊,颜色什么的都没有调,用户体验一定很不爽对不对?而且改一个样式你得要写一堆代码对不对?代码没有封装以后每次都要重新copy累不累?
其实这样写还有一个小问题:
hover标签在这里成了一次性的快餐盒(如果有心情的话可以去试试~~)
后来又加了一句 search[0].value = null; 来清除文本框内的内容,为了测试是不是因为里面有了内容才会让hover这个伪类失效的...但是事实并非是input内容的问题。
当时也不是很在意这个问题,也就将它放了放,开始解决前面几个问题……全靠js写的话,一定要写大量完全不需要写的代码,再加上二次分析了阿里的网站,我发现了完全可以用js来更换html的网页的class属性——于是又写了一个类,用js去交替两个样式,下面贴出完整代码:
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>标题会变欸~~~</title>
6 </head>
7
8 <style>
9 * {
10 padding: 0px;
11 margin: 0px;
12 box-sizing: border-box;
13 }
14
15
16 /*********************************** header ***********************************/
17
18 .topBar{
19 width: 100%;
20 height: 10rem; /* 160px */
21 }
22
23 /* 搜索条的颜色变化 */
24 .search{
25 width: 10rem;
26 font-size: 1.1rem;
27 color: ghostwhite;
28 padding: 0.411rem 1rem;
29 background-color: #0001;
30 border: 1px solid #7b4aff;
31
32 -webkit-border-radius: 0.2rem;
33 -moz-border-radius: 0.2rem;
34 border-radius: 0.2rem;
35 -webkit-transition: 1.2s cubic-bezier(0.46, 0.26, 0.22, 0.76);
36 -moz-transition: 1.2s cubic-bezier(0.46, 0.26, 0.22, 0.76);
37 -ms-transition: 1.2s cubic-bezier(0.46, 0.26, 0.22, 0.76);
38 -o-transition: 1.2s cubic-bezier(0.46, 0.26, 0.22, 0.76);
39 transition: 1.2s cubic-bezier(0.46, 0.26, 0.22, 0.76);
40 }
41
42 .search:hover{
43 width: 22rem;
44 border: 1px solid #7b4aff;
45 background-color: rgba(18, 18, 39, 0.4);
46 -webkit-border-radius: 0.2rem;
47 -moz-border-radius: 0.2rem;
48 border-radius: 0.2rem;
49 }
50
51 .search-bar-on-selected{
52 width: 22rem;
53 font-size: 1.1rem;
54 color: ghostwhite;
55 padding: 0.411rem 1rem;
56 background-color: rgba(18, 18, 39, 0.4);
57 border: 1px solid #7b4aff;
58
59 -webkit-border-radius: 0.2rem;
60 -moz-border-radius: 0.2rem;
61 border-radius: 0.2rem;
62 -webkit-transition: 1.2s cubic-bezier(0.46, 0.26, 0.22, 0.76);
63 -moz-transition: 1.2s cubic-bezier(0.46, 0.26, 0.22, 0.76);
64 -ms-transition: 1.2s cubic-bezier(0.46, 0.26, 0.22, 0.76);
65 -o-transition: 1.2s cubic-bezier(0.46, 0.26, 0.22, 0.76);
66 transition: 1.2s cubic-bezier(0.46, 0.26, 0.22, 0.76);
67 }
68
69 </style>
70
71 <body>
72
73 <header>
74 <div class="topBar">
75 <input class="search" type="text" value=""/>
76 </div>
77 </header>
78
79 </body>
80
81 <script>
82 var search = document.getElementsByClassName('search');
83
84 // 搜索条选中和移除事件 修改class名称的方法能更好的封装代码
85 search[0].addEventListener('focus', function(){
86 search[0].className = 'search-bar-on-selected'; // 更改类名
87 })
88
89 search[0].addEventListener('blur', function(e){
90 document.getElementsByClassName('search-bar-on-selected')[0].className = 'search'; // 因为类名已经改变了,所以要重新获取下类名(总想到Java了)
91 search[0].value = null; // 清空内容
92 })
93
94 </script>
95
96 </html>
神奇的是,因为样式的交错,刚好让hover标签从一次性便成了用完后自动恢复至初态!!
嗯,在最后总结下,总结的东西不多,但是等到将来的某一天回头望去,能够看到过去各种奇奇怪怪的思维锚点:
1. input的聚焦监听可以使用addEventListener(focus, function(){}); 来实现。
2. 很多事情都不需要去考虑,大多数情况做好自己的事情,自己所在意的东西就会迎刃而解。
3. 有时候,正是因为没有答案,才会让你踏出这一步,开始自己的新的旅程。