我正在使用jquery globalcss插件来更改全局样式表。它不处理不透明度和IE。
我一直试图让它运转起来没有运气。这是我尝试强制插件尝试理解IE风格的不透明度。
function changeCss (property, value, target) {
if (property === "opacity") {
$(target).globalcss("filter","alpha(opacity="+value*100+")");
/* For IE 8 (and 9, 10, 11?). Don't miss the added quotes */
$(target).globalcss("-MS-filter","\"progid:DXImageTransform.Microsoft.Alpha(Opacity="+value*100+")\"");
}
$(target).globalcss(property,value);
}
布拉赫。如果有人可以提供帮助,那就太好了。感谢。
我在这里粘贴插件,因为它不再位于原始网站上了:
/*
* Global Stylesheet jQuery Plugin
* Version: 0.1
*
* Enables CSS modification that uses a 'global' stylesheet, rather than inline CSS.
*
* Copyright (c) 2009 Jeremy Shipman (http://www.burnbright.co.nz)
*
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*
* INSTRUCTIONS:
* use in the same way as the jQuery css function. Eg:
* $("some selector").globalcss("style","value");
*
* use the globalsetylesheet.print() function to return a string of the global stylesheet
*/
(function($) {
//global singleton class for
globalstylesheet = new function globalStylesheet(){
if(!document.styleSheets){
alert("document.Stylesheets not found");
return false;
}
var sheet = null;
var setrules = Array(); // rule cache
//set up a dummy noded
var cssNode = document.createElement('style');
cssNode.type = 'text/css';
cssNode.rel = 'stylesheet';
cssNode.media = 'screen';
cssNode.title = 'globalStyleSheet';
document.getElementsByTagName("head")[0].appendChild(cssNode);
//find the newly created stylesheet and store reference
for(var i = 0; i < document.styleSheets.length; i++){
if(document.styleSheets[i].title == "globalStyleSheet"){
sheet = document.styleSheets[i];
}
}
//set a CSS rule
this.setRule = function setRule(selector,ruleText){
if(setrules[selector] != undefined){
return setrules[selector];
}else{
if(sheet.addRule){ // IE
sheet.addRule(selector,ruleText,0);
}else{
sheet.insertRule(selector+'{'+ruleText+'}',0);
}
setrules[selector] = this.getRule(selector);
}
return setrules[selector];
}
//get a saved CSS rule
this.getRule = function getRule(selector){
if(setrules[selector] != undefined){
return setrules[selector];
}else{
var rules = allRules();
for(var i = 0; i < rules.length; i++){
if(rules[i].selectorText == selector){
return rules[i];
}
}
}
return false;
}
//helper function to get all rules
function allRules(){
if(sheet.cssRules){ //IE
return sheet.cssRules;
}else{
return sheet.rules;
}
}
//print out the stylesheet
this.print = function print(){
var styleinfo = "";
var rules = allRules();
for(var i = 0; i < rules.length; i++){
styleinfo+= rules[i].cssText+"\n"
}
return styleinfo;
}
//use jQuery's css selector function to set the style object
this.css = function css(jquery,key,value){
rule = this.setRule(jquery.selector,key+":"+value+";");
jQuery(rule).css(key,value);
}
}
//hook new function into jQuery
jQuery.fn.extend({
globalcss : function globalcss(key,value){
globalstylesheet.css(this,key,value);
}
});
})(jQuery);
编辑:我创建了一个jsbin现场演示。请在不同浏览器中进行比较 http://jsbin.com/iqadu/edit
答案 0 :(得分:2)
更新:
我下面的第一个想法不是问题。事实证明问题更多的是行人:确保在浮点数小于1之前加零。也许这是由于javascript如何处理字符串值到数字的转换?无论如何,在“.5”之前添加零来解决问题。
// works
var property = "opacity";
var value = "0.5";
var target = ".transparency";
// doesn't work
var property = "opacity";
var value = ".5";
var target = ".transparency";
在这里查看工作代码:http://jsbin.com/ikore3。顺便说一下,你的原始演示页面有一个javascript问题,大括号在错误的地方。我也解决了这个问题。
以下是造成这种情况的原始想法 - 不是问题
你可能遇到了与jquery无关的IE的怪癖:为了使opacity不起作用,元素必须有“layout”,这是一个IE特定的布尔状态,由CSS触发例如高度,宽度,缩放等。如果元素没有“布局”,则不透明度将不起作用。
解决方法是为元素添加特定的CSS以使其“布局”。不确定这是不是在你的情况下发生了什么,但通过添加一个提供布局的CSS属性并查看问题是否消失来检查它是很容易的。
来自http://joseph.randomnetworks.com/archives/2006/08/16/css-opacity-in-internet-explorer-ie/:
但只需设置过滤器/不透明度 IE中的值是不够的。结果 IE需要一个元素 为了过滤/不透明而定位 上班。如果你的元素没有 你可以解决这个问题的立场 将“zoom:1”添加到CSS中。那里 是其他黑客来处理这个, zoom是我选择的那个,似乎 工作得很好。
在JavaScript中,你可以找到一个 IE中的元素有一个位置组件 通过检查 element.currentStyle.hasLayout。如果 hasLayout是false然后是元素 没有CSS定位。
如果您想了解有关此问题的更多信息,请参阅阅读清单以获取您的信息:
◦探索OpacityStep-by-Step [断链]
使用您的代码,这是确保如何测试这是否是您的问题的一种可行方法:
function changeCss (property, value, target) {
if (property === "opacity") {
$(target).globalcss("filter","alpha(opacity="+value*100+")");
/* For IE 8 (and 9, 10, 11?). Don't miss the added quotes */
$(target).globalcss("-MS-filter","\"progid:DXImageTransform.Microsoft.Alpha(Opacity="+value*100+")\"");
$(target).globalcss("zoom","1"); // ensure the target has layout
}
$(target).globalcss(property,value);
}
更复杂的版本会检查缩放是否已经存在,只有在缺少时才添加。您还可以检查hasLayout属性并仅设置缩放,如果它是假的,只要您防止非IE的情况,其中hasLayout根本就不存在。
如果这不能解决问题,您是否可以发布HTML示例或网址,以便我们重新解决问题,这样可以更轻松地修改问题?谢谢!