xj.ripple 点击波纹特效

基本介绍

简介 : 这是一个无依赖,独立且开源的,前端点击波纹效果插件,它开箱即用(引入插件后为标签设置 xj-ripple 类名即可),且参数丰富(30+ 参数涵盖了各种细节设置),由于它采用了委托绑定的形式,所以通过配置,甚至能不需要设置类名就自动响应,如果你已经厌倦了乏味的点击效果,不妨为你的项目增加一些波纹吧,让交互变得更加有趣一些,顺便还能省去编写 :active{} 伪类样式的麻烦。

兼容 : IE10+ / Edge12+ / Firefox / Chrome / Safari / Opera / IOS Webkit / Android Platform

更新 : https://github.com/xjZone/xj.ripple/blob/master/upgrade.md

源码 : https://github.com/xjZone/xj.ripple/

协议 : Apache License 2.0

版本 :


引入插件

首先是引入相关的文件,推荐使用带 immutableJSDelivr CDN:


如何使用

引入插件之后,在目标节点上添加 xj-ripple 类名,那么这个节点在被点击的时候就会自动响应波纹了,下面是一个简单的例子,为了展示波纹的效果,所以这里设置了一个 .box 类名来定义容器的样式,在后面的其他例子中,我们也会用这个 .box 来充当示范的容器,但其实它并没有什么特别之处,为了代码的简洁性,所以在之后的案例中我们就不再展示 .box 的样式代码了,大家了解即可。


四种模式

插件提供了四个类名,用于实现不同模式的波纹,xj-ripple 禁止波纹溢出,xj-ripple-out 允许波纹溢出,xj-ripple-mid 禁止波纹溢出且波纹将自动居中,xj-ripple-out-mid 允许波纹溢出且波纹将自动居中,下面是一个简单的例子,展示了四种模式的波纹效果,需要注意的是,溢出的波纹可能会导致父容器生成临时的滚动条,除非你能精确的控制尺寸,否则溢出模式的波纹一般只用于测试。


参数设置

插件提供了非常丰富的参数,用于定义波纹的各种细节,无论是圆角或颜色,亦或是尺寸或定位,皆可自由掌控,而这些参数都可通过使用目标容器上的 xj-ripple="{}" 这个内联属性来完成设置,下面是一个简单的例子,使用 radius 参数可修改波纹圆角(默认值是 50%),使用 color 参数可修改波纹颜色(默认值是 currentColor),如果你想了解更多的参数,可查阅文档后面的 # 参数列表


测试状态

默认情况下,当波纹的 opacity 动画执行完毕,波纹节点就会被自动移除掉,这样可以节约浏览器资源,但立即移除节点也导致了我们很难在 DevTool 面板中检查并调试它,所以插件提供了 debug 参数,当这个参数被设为 true 时,波纹就不会被自动移除了,伴随波纹节点的还有节点 xj-ripple-temporary,它用于确定点击位置和容器左上角的距离,更多细节可查阅后面的 # 项目备注 - 02


尺寸控制

在默认的情况下,波纹尺寸总是刚好能覆盖到容器的四个边角(包括 padding 不含 border),但你也可以使用插件提供的 width / height, minWidth / minHeight, maxWidth / maxHeight, extraWidth / extraHeight 这些参数来进一步调整波纹的尺寸,这些参数既可以使用绝对的 px 单位,也可以使用相对的 % 单位(基于波纹所在容器),下面是使用这些参数的简单案例。


圆心定位

在默认的情况下,波纹圆心要么是在点击的位置,要么是在容器的水平居中和垂直居中的交汇点,这取决于你使用的 xj-ripple 类名后面是否有带 -mid,但你也可以使用插件提供的 left / topoffsetLeft / offsetTop 这四个参数,来进一步调整波纹位置,这些参数既可以使用绝对的 px 单位,也可以使用相对的 % 单位(基于波纹所在容器),下面是使用这些参数的简单案例。


参数继承

内联属性 xj-ripple="{}" 不是非得设置在响应波纹的那个节点上,其实设置在目标节点的上层节点也是可以的,只要 inherit 参数不明文设为 false,那么这个内联属性的设置就可以被继承,正如下面的例子中所展示的那样,当目标节点和它的上层节点设置了同个属性时,层级越低的属性权重就越高,继承的好处是如果想定义某个区域的波纹,不需要逐个设置,只需要设置父容器然后继承就行。


禁止响应

当节点有 disabled 属性或 xj-ripple-disabled 类名或 cursor:not-allowed 样式时,节点被点击将不响应波纹,当节点的上层节点存在这些设置时,节点被点击也不响应波纹,但如果 forbid 参数被设置为 false,则子节点不受上层节点的影响,唯一例外是 cursor:not-allowed 样式,因为子节点会自动继承上层节点的指针样式,所以即使设置 forbid:false,子节点依旧是不响应波纹。


使用背景

波纹不是非得使用纯色的,插件提供了 bg 参数,可以用于设置波纹的 background 样式,也就是说我们可以为波纹添加背景图,甚至是可以使用线性渐变或径向渐变来作为波纹的背景色,这样一来可套用一句老话:“限制住你的就只有你的想象力…”,如果你不习惯在 background 样式中设置所有的属性,当然也可以使用插件提供的 styleObject 参数,以 CSS 对象的形式来进行各种样式的设置。


修改目标

可用 insertTarget 参数定义波纹生成的位置,该参数默认值为 'auto',也就是在点击的节点生成波纹,可以接受选择器或函数作为值让波纹在其他位置生成,在没设置 left / top 参数或 offsetLeft / offsetTop 参数时,波纹将定位于容器中心,波纹参数只会在触发点击的那个节点上获取,与目标容器没关系,目标容器需要做的是设置 position 不为 static 确保波纹能顺利定位。


通过配置实现自动响应

如果你觉得手动添加 xj-ripple 类名还是太麻烦了点,那么或许可以考虑通过全局配置的 defaultSelector 参数,将目标节点的选择器追加到这个参数里,这样就能实现点击自动响应波纹了,甚至 HTML 结构都不需要改动,配置完成后你唯一需要做的,就只是为标签设置 position:relative;overflow:hidden;,这是为了波纹能在标签中进行绝对定位且不要溢出,下面是个全局配置的例子。


通过预设定义动画细节

如果你对动画细节不满意,例如觉得波纹过于缓慢,那么可通过参数预设来对所有波纹的动画进行重定义,插件提供了 transitionProperty, transitionDuration, transitionTimingFunction, transitionDelay 共四个参数用于控制动画的细节,你当然也可以在内联属性 xj-ripple="{}" 上使用这些属性,但如果逐个设置未免太没效率了,此时依靠参数预设来让全局的波纹都生效会更加方便。


单标签响应波纹

单标签元素如 inputimg,由于它们并不支持子标签,所以无法在这类标签中实现波纹效果,另外就是 selectvideo 等特殊标签也不支持普通元素作为它们的子标签,所以这些标签也无法实现波纹,但是如果你非要实现,也可以将这类标签嵌在一个双标签之中来处理,例如说把标签放在一个 div 中,然后将类名添加在这个 div 上,例如下例中第二个 input 就被嵌套在 div 中。


使用预设的类名

你可以通过使用预设的类名,来更加方便的设置波纹样式,插件默认提供了 .xj-ripple-primary, .xj-ripple-success, .xj-ripple-warning, .xj-ripple-danger, .xj-ripple-extra, .xj-ripple-info, .xj-ripple-black, .xj-ripple-white 总共八个类名,用于定义不同颜色或者说状态的波纹,你当然也可以通过相同的写法,来预设更多的类名,下面是关于类名预设的一个简单案例。


xj.ripple 对象

全局中的 xj.ripple 对象上只有一个属性和一个方法,xj.ripple.version 属性会返回当前插件的版本,xj.ripple.create() 方法则是用于手动创建波纹,该方法接受两个参数,第一个参数是生成波纹的容器(必填),第二个参数是设置波纹的参数对象(可选),下面是一个使用该方法的例子,点击左侧容器可在右侧容器中生成一个波纹,当方法的参数与容器的参数重复时,方法的参数优先级会更高。


配置列表

以下 Demo 罗列了本插件所有可用的配置,并且展示了插件进行全局配置的具体操作方法,需要注意的是,全局配置得在引入插件之前就设置好,否则插件加载并执行的时候找不到配置,就会认为配置不存在,并且版本号也要对得上,否则插件也是不理会的,例如本页面使用的插件是 0.5.0 的版本,在 xj.rippleConfig 对象后面跟着的就是 ['0.5.0'],版本匹配是考虑到插件多版本并存而设计的。


参数列表

以下 Demo 罗列了本插件所有可用的参数,并且展示了插件进行参数预设的具体操作方法,需要注意的是,参数预设得在引入插件之前就设置好,否则插件加载并执行的时候找不到预设,就会认为预设不存在,并且版本号也要对得上,否则插件也是不理会的,例如本页面使用的插件是 0.5.0 的版本,在 xj.rippleOption 对象后面跟着的就是 ['0.5.0'],版本匹配是考虑到插件多版本并存而设计的。


项目备注

01. 在 V0.2.X 和 V0.3.X 时,插件是使用了 box-shadow 样式生成波纹,由于 box-shadow 并不会实际占据空间,所以即使波纹溢出了,也不会导致波纹所在容器出现滚动条,但是 Chrome 从 V101 开始修改了 box-shadow 的圆角算法,导致 大于容器那部分的阴影再也无法保持纯圆 状态,所以不得已 XJ 只好在 V0.4.X 又走回了 V0.1.X 的老路,也就是使用标签的 width & height 样式来生成波纹,使用 width & height 来实现波纹的尺寸,可为标签实现背景图和渐变色等效果,但缺点就是波纹溢出时可能会生成滚动条。

02. 当开启 debug 模式时,你会发现目标容器在生成波纹节点的同时,还会出现一个 xj-ripple-temporary 节点,这个节点用于确定点击位置和目标容器左上角那个点的距离,之所以要用一个临时节点来计算距离,是因为其他手段如 DomRect.left & DomRect.topevent.offsetX & event.offsetY,它们都没考虑到滚动条在左侧时的情况,结果可能存在偏差,只能用临时节点来解决这个问题。

03. SVG 标签无法接受普通标签作为子节点,所以也就没法实现波纹效果,XJ 当然也想过在 SVG 中改用 circle 标签来实现波纹,但 SVG 标签的样式和操作等细节跟 HTML 标签还是有些区别,不是简单的替换就能解决的,所以这个需求只能是未来再考虑要不要实现了。

04. 有疑问或者发现 BUG,可到 GitHub 提 Issue,如果觉得插件写得还行,在 GitHub 中为本项目点个 ★Star 吧,感谢啦 ಠ‿ಠ ❤。


推荐阅读

XJ.Chen - 浅谈 :active 伪类选择器和点击后样式变化无效的交互问题


Copyright © 2015- XJ.Chen All Rights Reserved
More XJ Plugins : https://github.com/xjZone/