CSS是一门很神奇的语言,很多和它不相干的功能却能起到很显著的效果,有些在js看起来实现都有一定的工作量,CSS一句属性就能轻而易举的解决,下面来看几个例子(主要和js事件相关)。

很多都是开脑洞想出来的,实现效果却意外的惊人

原issues

github.com/XboxYan/not…

事件禁用

在js中对事件禁用并不复杂,但是却容易影响到业务逻辑

function buy(){if(XX){return false;}//其他业务代码
}
复制代码

当然,元素也要设置相应的样式,让它看起来不可点击。

css对事件禁用就比较简单了,主要有两种方式

1. disabled

原生表单元素是有默认的禁用属性的,比如

<button disabled onclick="alert(11)">按钮</button>
复制代码

可以看出,禁用的默认样式为

button:disabled {color: graytext;
}
复制代码

所以,在这里你可以随意的修改禁用的样式

button:disabled {color: red;
}
button[disabled] {/**属性选择器也行**/color: red;
}
button:hover { /**:hover支持**/color: red;
}
button:active,button:focus{/**不支持,其实也好理解,会触发focus()事件,所以也禁用了**/color:red
}
复制代码

一般情况下,使用这种方式是比较好的,天然的禁用属性,兼容性也不错

2. pointer-events:none

这个属性应该也不陌生,最常见的用法就是禁用一个按钮,而且不局限于表单元素,任意元素均可(比如很多人喜欢用的a标签)

button.disabled {pointer-events:none;user-select:none;/*去除选中效果*/color: graytext;
}
复制代码

这个属性用处很多,很多js绞尽脑汁想要过滤掉的方法,直接就用一行属性解决,这里就不展开了,网上教程很多。

查看这个demo

See the Pen css 禁用事件 by XboxYan (@xboxyan) on CodePen.

长按事件

原生js中并没有长按事件,通常开发者一般会顺着思路,使用定时器来完成

下面是伪代码

el.onmousedown = function(){this.timer && clearTimeout(this.timer);this.timer = settimeout(function(){//业务代码},350)
}
el.onmouseup = function(){this.timer && clearTimeout(this.timer);
}
复制代码

当然,可以借助css来完成,而且效果更好,易于控制

这里为什么说是“借助”呢,因为不能完全有css来完成,只是利用了某些特性

css3中新增了过渡和动画属性,与之相对应的也预设了这些动画的回调事件,如下

事件 说明
transitionstart 在开始过渡时触发
transitionrun 在进行过渡时触发
transitioncancel 在取消过渡时触发
transitionend 在完成过渡后触发
animationstart 在 animation 开始时触发
animationiteration 在 animation 完成一个周期时触发
animationend 在 animation 完成时触发
animationcancel 在 animation 取消时触发

有些事件存在兼容性问题,有兴趣的可以详细研究

有了这些事件,要做一个长按事件就很容易了,这里有两种种思路,大家可以脑洞一下

假设需要延时1s;

  1. 过渡时间设置为1s,调用transitionend或者animationend
  2. 延时1s,调用transitionstart或者animationstart

这里以第一种情况transitionend(过渡比动画实现要容易多,代码也少,优先用过渡)来实现

button:hover:active{opacity:.99;/**随便选取一个不影响页面的可以过渡的样式**/transition:opacity 1s;
}
复制代码

相应的,js需要监听transitionend事件,不需要借助定时器(个人有点鄙视定时器的思想^)

el.addEventListener('transitionend',function(){//业务代码
})
复制代码

是不是精简很多呢,需要改长按时间可以直接通过css来控制

这里封装了一下自定义事件,可以更好的在项目中使用(虽然代码本身就很少了)。

查看这个demo

See the Pen css 长按事件 by XboxYan (@xboxyan) on CodePen.

单次点击事件

jquery中有一个once(好像是这个)方法,表示绑定一次性事件,点击一次后就不再生效。

原生js实现这个也不复杂,通常做法就是定义一个标识,点击后改变一下,下面是伪代码

el.onclick = function(){if(!this.once){//业务代码this.once = true;}
}
复制代码

借助上面的思路,css也可以实现类似的效果,深究了一番,总结以下两个方法

1.animationend

animationend是动画结束后触发,显然我们可以在这里做文章

比如我们可以在初始状态给一个暂停状态animation-play-state:paused,然后在点击时运动animation-play-state:running,结束后一直保持在最后状态animation-fill-mode: forwards

.button{animation: once .01s paused forwards;/**给一个足够小的运动时间,确保能够在`:active`时运动完成**/
}
.button:hover:active{animation-play-state:running;
}
@keyframes once {to{opacity:.8;}
}
复制代码

js只需要对animationend进行监听

el.addEventListener('animationend',function(){//业务代码
})
复制代码

2.纯css实现

不知道在上面的例子中有没有发现,在动画结束时把元素禁用会怎么样?

@keyframes once {to{opacity:.8;pointer-events:none;user-select:none;}
}
复制代码
<button class="button" onclick="fn()">按钮</button>
复制代码

这样就可以在运动完直接禁用,好像很完美?

事实上,这里运动的时间很难把控,大家都知道,onclick其实是包含按下和抬起两个过程的,如果抬起的太慢,那么此时元素已经禁用了,触发不了事件;如果抬起太快,如果快速点击,由于还没运动完成,会触发多次事件。

解决方式也很简单,用onmousedown代替即可

<button class="button" onmousedown="fn()">按钮</button>
复制代码

查看这个demo

See the Pen css 单次事件 by XboxYan (@xboxyan) on CodePen.

onresize事件

大家都知道window有个onresize事件,可以在窗口拉伸的时候触发,然后就能实时获取窗体的尺寸等等属性。

window.onresize = function(ev){//业务代码
}
复制代码

但是,普通的元素却没有这个监听,比如

div.onresize = function(ev){//不生效...
}
复制代码

为什么需要这个功能呢?

大家可能知道有这样一个属性,可以原生拉伸元素,改变尺寸

.box{overflow: hidden;/**需要配合overflow才能生效**/resize: both;
}
复制代码

只需一个属性,就可以实现元素的拉伸(虽然稍有瑕疵),不需要大量的js来计算。

视觉展示还好,但是如果需要实时知道元素的尺寸怎么办呢,js通常有两种思路

1. onmousemove事件

拉伸的时候很自然的想到是有鼠标按住然后拖拽完成,所以可以给元素添加onmouse-*一系列事件,同时要注意鼠标抬起要取消监听

//大概是这样的逻辑
div.onmousedown = function(){div.onmousemove = fn;//监听div.onmouseup = function(){div.onmousemove = null;}
}
复制代码

2. 定时器

借助setInterval或者requestAnimFrame来实现监听,同样是需要注意取消监听的时机

//大概是这样的逻辑
div.onmousedown = function(){this.timer && clearInterval(this.timer)this.timer = setInterval(fn,300);//监听div.onmouseup = function(){this.timer && clearInterval(this.timer)}
}
复制代码

很显然,上面的方法都不是特别的舒适,很多情况下都会出现监听取消的问题,导致不停的触发,影响体验。

这时候,又轮到css出场了,很多时候js觉得实现起来不顺畅的时候都可以用css的思维来重新认识。

那么,如何借助css来监听这些呢?

可以从过渡和动画两个思路来考虑。

1. CSS过渡

首先,我们可以知道的是,在通过resize: both进行元素拉伸的时候,改变的是widthheight,这一点可以从开发者工具直接看到

我们需要通过transitionrun或者transitionend来监听widthheight,所以需要给这两个属性加上过渡

.box{transition:width .3s,ehight .3s;//分别给width和height设置过渡,其他属性不需要
}
复制代码

这样就可以拿到监听了,不过这种方式有一个弊端,由于过渡需要时间,所以有一种不跟随,卡顿的感觉。

所以我们来看第二种方式

2. animationiteration

css动画可以设置播放次数,如果设置成animation-iteration-count: infinite就表示无限轮播,配合animationiteration回调,不就可以实现监听了么

.box:active{animation: resize .3s infinite forwards;
}@keyframes resize{to {opacity: .99;/**用一个无关紧要的属性来触发动画**/}
}
复制代码

js很简单,一个监听就能解决问题,也不需要什么取消监听什么,这些都已经在css完成了

el.addEventListener('animationiteration',function(){//业务代码
})
复制代码

这里是每个动画完成一次就回调一次,所以我们可以通过设置动画时长来控制监听的频率,比如上面是.3s的触发频率。

下面写了一个demo,可以实现自定义onresize事件

查看这个demo

See the Pen css resize事件 by XboxYan (@xboxyan) on CodePen.

小节

以上通过借助css,实现了许多js都很棘手的问题,可能还会有更多的应用场景,欢迎小伙伴留言讨论~

借助CSS来管理js事件相关推荐

  1. html js不触发_图文详解鼠标事件CSS:hover和JS:mouseover的区别

    在工作中为了使页面更具有吸引力,前端开发人员经常会在页面中加上鼠标移入和移出的效果.鼠标移入移出的设置,一般有两种方法,一种是单纯用CSS中的hover伪类,另一种可以用JS 中的DOM事件,即onm ...

  2. 城市能源管理系统、实时监测、运行监测、负荷效应、预警管理、设备管理、设备入库、设备安装、设备检修、设备报废、设备查询、控制策略、系统集成、HTML/CSS/Bootstrap/jQuery/JS

    源码类别: 后台模板 文件大小: 3074 KB 城市能源管理系统响应式HTML模板 前端技术: HTML/CSS/Bootstrap/jQuery/JS 适用范围:PC端,前端页面展示 文件类型: ...

  3. 常用CSS与Flex布局、媒体查询、JS事件控制css、VUE对象语法、Gride布局(待补全) CSS权重 页面适配笔记本缩放

    css属性就是要用的多用的熟 知道的多 就像一本工具书 除了基础原理 剩下的就是知识面了 极力推荐MDN用过的人都说好~ 页面适配笔记本等自带缩放的场景 let t = window.devicePi ...

  4. 前端(四)移动端js事件、bootstrap-学习笔记整理

    移动端js事件 移动端的操作方式和PC端是不同的,移动端主要用手指操作,所以有特殊的touch事件,touch事件包括如下几个事件: touchstart: //手指放到屏幕上时触发 touchmov ...

  5. 【JavaScript、CSS】css动画、js动画

    动画 js动画 css动画 Web动画的本质是元素状态改变造成的样式变更,CSS动画和JS动画的区别并不是由语言来决定的,而是由两者的特点和适用场景来判断的. CSS动画简洁高效,提升交互体验而编写的 ...

  6. 【译】CSS动画 vs JS动画

    原文地址 目前有两个主流的方法在web上创建动画:使用CSS或JS.到底选择哪种方法来实现动画,完全取决于你的项目以及你想要达到的效果. tips: 对于简单的只出现一次的过渡效果,可以采用CSS动画 ...

  7. JS 事件冒泡和事件捕获

    原文:https://www.cnblogs.com/qq9694526/p/5653728.html JS 事件冒泡和事件捕获 本文中关于事件冒泡和事件捕获的描述和例子都是OK的,错就错在后面用jq ...

  8. js事件技巧方法整合

    window.resizeTo(800,600); //js设置浏览器窗口尺寸 window.open (function(){resizeTo(640,480);//设置浏览器窗口尺寸moveTo( ...

  9. js事件流的三个阶段

    2019独角兽企业重金招聘Python工程师标准>>> js事件流分为三个阶段: 1.事件捕获:当某个元素出发某个事件,顶层对象document就会发出一个事件流, 随着DOM树的节 ...

  10. 【JavaScript】JS事件机制学习

    常用的事件 通过事件机制,达到与用户的交互,与java的swing交互类似. 主要是结合js的函数使用. 当你添加一个事件之后没有达到想要的效果时,就要检查一下是不是给HTML标签添加了合适的事件,以 ...

最新文章

  1. c语言程序设计教程ppt,《C语言程序设计教程》.ppt
  2. python代码大全表解释-【初学】Python异常代码含义对照表
  3. 动态分辨率是什么意思_ISP基础(02):宽动态范围WDR
  4. java数组之binarySearch查找
  5. .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)...
  6. Java学习需要掌握哪些技能?
  7. webpack 插件: html-webpack-plugin
  8. Spark精华问答:DataFrame与RDD的主要区别在哪?
  9. u8转完看不到菜单_填制凭证界面上的菜单看不见
  10. 线性地址到物理地址的映射
  11. Maven 3.0 RC1 发布
  12. 分享7个超实用的Emmet(zen coding)HTML代码使用技巧
  13. python递归函数分叉树枝_python递归函数绘制分形树的方法
  14. 非线性系统【三】LaSalle不变原理
  15. SSM实现毕业设计管理系统
  16. java sql编写教务系统_教务管理系统的设计与实现(SQLServer)
  17. 【JavaWeb】如何优雅的实现第三方开放api接口签名(有状态/无状态)
  18. html幸运数字游戏,十二生肖的幸运数字
  19. 搭建Maven私服Nexus
  20. Forethought Future Cup - Elimination Round G. Zoning Restrictions 最大流(最小割)

热门文章

  1. 【转】Centos7 ftp 配置及报错处理
  2. js复制隐藏域中的文字
  3. tensorflow 变量共享
  4. 08.CXF发布WebService(Java项目)
  5. (2)css的复合选择器与特性
  6. 基于嵌入式linux路由转发功能的实现
  7. Swift给每个开发者赢取500万的机会!不看一生后悔。
  8. android 学习之SurfaceView
  9. struts2 s:file标签使用及文件上传例子
  10. Swift - 高级运算符介绍