如何为PrimeFaces p:spotlight添加显示隐藏淡入淡出效果?
为PrimeFaces Spotlight添加显示/隐藏动画的解决方案
我来帮你解决这个Spotlight动画的问题,确实它不像<p:dialog>那样自带showEffect和hideEffect属性,得手动处理下,下面给你两种可行的方案:
方案一:自定义显示/隐藏函数,结合jQuery动画
Spotlight的DOM元素在调用show()后才会被创建并显示,所以我们可以先控制元素的可见性,再结合jQuery动画实现效果:
1. 先给Spotlight指定widgetVar
在页面的<p:spotlight>标签里加上widgetVar属性,方便获取组件实例:
<p:spotlight widgetVar="mySpotlight" target="rowPayment" />
2. 编写自定义的显示/隐藏函数
// 带淡入效果显示Spotlight function showSpotlightWithFade() { var spotlight = PF('mySpotlight'); // 先执行组件原生显示逻辑,再隐藏元素并触发淡入动画 spotlight.show(); $(spotlight.jq).hide().fadeIn(500); // 500是动画时长,单位毫秒 } // 带淡出效果隐藏Spotlight function hideSpotlightWithFade() { var spotlight = PF('mySpotlight'); // 执行淡出动画,完成后再调用组件原生隐藏方法清理DOM $(spotlight.jq).fadeOut(500, function() { spotlight.hide(); }); }
之后你就可以通过调用showSpotlightWithFade()和hideSpotlightWithFade()来控制Spotlight的显示隐藏了。
方案二:扩展Spotlight组件原型,全局添加动画效果
如果想让所有Spotlight组件都默认带动画,可以重写它的show和hide方法:
$(document).ready(function() { // 保存组件原有的show和hide方法 const originalShow = PrimeFaces.widget.Spotlight.prototype.show; const originalHide = PrimeFaces.widget.Spotlight.prototype.hide; // 重写show方法,添加淡入动画 PrimeFaces.widget.Spotlight.prototype.show = function() { originalShow.call(this); // 先执行原有的显示逻辑 $(this.jq).hide().fadeIn(500); // 追加淡入动画 }; // 重写hide方法,添加淡出动画 PrimeFaces.widget.Spotlight.prototype.hide = function() { const self = this; $(this.jq).fadeOut(500, function() { originalHide.call(self); // 动画完成后执行原有的隐藏逻辑 }); }; });
这样之后,你直接调用PF('mySpotlight').show()或hide()时,就会自动触发淡入淡出效果了。
为什么你之前的方法没生效?
- 你用
PrimeFaces.cw传入showEffect和hideEffect无效,是因为Spotlight组件的底层实现并没有处理这两个参数,这是Dialog等少数组件特有的配置项; - 直接用
$('#id').fadeIn()无效,是因为Spotlight在未激活时,对应的DOM元素可能还未被创建,而且组件自身的show()方法会直接设置元素为display:block,覆盖了jQuery的动画状态,所以需要配合组件的原生方法来调整。
内容的提问来源于stack exchange,提问作者Newbie
相关产品推荐
相关产品推荐

