关于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. 有时候,正是因为没有答案,才会让你踏出这一步,开始自己的新的旅程。

原文地址:https://www.cnblogs.com/Arunoido/p/10463792.html

时间: 2024-11-07 19:09:11

关于input的监听聚焦事件的相关文章

input, textarea,监听输入事件

IE使用'propertychange'事件监听,其它浏览器使用'input'事件测试了IE7-10, Chrome, FF, 输入没有问题.♥但在IE9下,  删除,  回退,  Ctrl+X 没有监听到! var $input = $('#textinput'); var $span = $('#num'); var customLength = 40; var pressHandle = function(){ var txtLen = $input.val().length; if (t

vue监听滑动事件,隐藏移动端键盘或者input失去焦点

在页面加载的地方mounted或者created写监听事件,注意使用touchmove事件 window.addEventListener("touchmove",this.myTouchMove) // 监听滑动事件 // 滑动关闭键盘 myTouchMove: function (evt) { if(document.hasFocus){ const inputId = document.getElementById('myBox') // 获取ID inputId.blur()

JS 事件绑定、事件监听、事件委托详细介绍

事件绑定 要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数.所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称. 在JavaScript中,有三种常用的绑定事件的方法: 在DOM元素中直接绑定: 在JavaScript代码中绑定: 绑定事件监听函数. 在DOM中直接绑定事件 我们可以在DOM元素上绑定onclick.onmouseover.onmouseout.onmousedown.onmouseup.ondblclick.onkeyd

JS 中的事件绑定、事件监听、事件委托

事件绑定 要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数.所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称. 在JavaScript中,有三种常用的绑定事件的方法: 在DOM元素中直接绑定: 在JavaScript代码中绑定: 绑定事件监听函数. 在DOM中直接绑定事件 我们可以在DOM元素上绑定onclick.onmouseover.onmouseout.onmousedown.onmouseup.ondblclick.onkeyd

ionic 监听路由事件 验证登录

.run(['$rootScope', '$location' , '$state', '$http','$ionicPopup', function($rootScope, $location, $state,$http,$ionicPopup){ var loginname=['tab.member','loan','repayment','iftab.exe']; $http.jsonp(apiurl+"/home/appapi/isLogin?callback=JSON_CALLBACK

原 JS监听回车事件

原 JS监听回车事件 发表于2年前(2014-06-04 10:16)   阅读(6101) | 评论(0) 11人收藏此文章, 我要收藏 赞0 1月16日厦门 OSC 源创会火热报名中,奖品多多哦   JS监听某个输入框 ? 1 2 3 4 5 6 7 //回车事件绑定     $('#search_input').bind('keyup', function(event) {         if (event.keyCode == "13") {             //回车

vue监听滚动事件,实现滚动监听

在vue中实现滚动监听和原生js无太大差异,下面是一个简单的demo,可在控制台查看结果 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script type="text/javascript" src="https://unpkg

Qt实现小功能之列表无限加载(创意很不错:监听滚动条事件,到底部的时候再new QListWidgetItem)

概念介绍 无限加载与瀑布流的结合在Web前端开发中的效果非常新颖,对于网页内容具备较好的表现形式.无限加载并没有一次性将内容全部加载进来,而是通过监听滚动条事件来刷新内容的.当用户往下拖动滚动条或使用鼠标滚轮的时候,页面会自动加载剩余的内容.如下: 简约而不简单,正是这种别出心裁,突破常规的设计才能得到用户的青睐…… 实现思路 在前端开发可以使用一些jQuery插件实现这种效果,后台只需要准备好数据就行了.在Qt中如何给列表组件(QListWidget,QTreeWidget, QTableWi

javascript事件监听与事件委托

事件监听与事件委托 在js中,常用到element.addEventListener()来进行事件的监听.但是当页面中存在大量需要绑定事件的元素时,这种方式可能会带来性能影响.此时,我们可以用事件委托的方式来进行事件的监听. 每个事件都经历三个阶段 捕获 到达目标 冒泡 事件委托需要用到事件的冒泡,冒泡就是事件发生时,上层会一层一层的接收这个事件. 如下页面结构: <body> <div id="div1"> <div id="div2"