我正在使用primeface作为UI组件,我必须使用css样式临时设置布局单元的背景,
.layoutCustomStyle.ui-layout-unit-content
{
background-image: url('resources/images/backgrnd.png');
}
layoutunit的id是“layoutId”,使用的styleclass是“layoutCustomStyle”
在xhtml中,
<p:layoutUnit position="top" id= "layoutId" styleClass ="layoutCustomStyle">
</p:layoutUnit>
但我想要的是动态添加背景图像。图像将由文件浏览器选择,因此,我无法为其添加单独的类并使用bean。
UIViewRoot view = FacesContext.getCurrentInstance().getViewRoot();
UIComponent comp= view.findComponent("layoutId");
Map<String, Object> attrMap = comp.getAttributes();
String className = (String)attrMap.get("styleClass");
使用这个我可以设置和获取类名,但如何动态更改属性“background-image:”?
希望问题很清楚。任何帮助表示赞赏。
提前致谢, 飞马
答案 0 :(得分:4)
使用style
属性代替styleClass
。
答案 1 :(得分:0)
这是一个古老的问题,但目前已被浏览10,354次。我想分享我在primefaces 6.2中解决“动态添加CSS样式属性”的方式
在我的布局中,我有一个标头,需要每10 | 20秒动态更改图像。
<h:panelGrid id="cabecera" columns="2" cellpadding="1" columnClasses="..."
style="width:100%; background-size: cover; background-position: center; background-image: url('#{request.contextPath}/resources/images/header/Vignette/#{userSelected.headerFile}');">
<h:form id="...." >
我有一个列表,列出了我可以使用的所有图像的名称,并且 userSelected.headerFile 随机选择一个。
三个类似的选项:
1.-首先,我直接使用 p:poll 更新 panelGrid id 'cabecera':
<p:poll interval="10" update="@([id$=cabecera])" autoStart="true"/>
当然有效,每次更新背景图片更改。在某些情况下,更新和页面闪烁不成问题就足够了。
2.-使用一些JavaScript,这是 p:poll 的侦听器中的bean方法。 声明一个js函数来更改 background属性(或其他任何属性):
<script>
function headerBackground(urlBG) {
var laUrl = (urlBG);
document.getElementById('cabecera').style.backgroundImage = laUrl;
}
</script>
在我的Bean userSelected 中,我声明了通过 RequestContext.getCurrentInstance()。execute(...)调用javascript 函数的方法。我决定只收到 url ,然后在函数中添加其余值:
public void callJSheaderBackground(String url) {
String jsFunc="headerBackground(\"".concat(url.trim()).concat("\")");
try{
RequestContext requestContext = RequestContext.getCurrentInstance();
requestContext.execute(jsFunc);
}catch(Exception ex){
...
}
}
最后, p:投票
<p:poll interval="20" listener="#{userSelected.callJSheaderBackground('url(\''.concat(request.contextPath).concat('/resources/images/header/Vignette/').concat(userSelected.headerFile).concat('\')'))}" autoStart="true"/>
3.-直接调用JS函数 我的JS函数,使用 contextPath 和图像文件名作为参数:
function setVignetteAsBackground(contextPath,vignetteName) {
var laUrl = "url('" + (contextPath)+'/resources/images/header/Vignette/'+(vignetteName)+"')";
document.getElementById('cabecera').style.backgroundImage = laUrl;
}
然后在 onstart | oncomplete 事件上直接从 p:poll 调用:
<p:poll interval="20" onstart="setVignetteAsBackground('#{request.contextPath}','#{userSelected.headerFile}')" autoStart="true"/>
希望对某人有用。