【问题标题】:jquery globalcss IE opacityjquery globalcss IE不透明度
【发布时间】:2010-12-12 12:38:24
【问题描述】:

我正在使用 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

【问题讨论】:

  • 执行此操作后,IE6/7 中elemntid.style.filter 的值是多少?其中elementid 是您测试它的元素的ID。
  • 另外,尝试使用elementid.style.filter 手动设置过滤器并发布结果。

标签: jquery css internet-explorer jquery-plugins opacity


【解决方案1】:

更新:

我下面的第一个想法不是问题。事实证明这个问题更加简单:确保在小于 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 怪癖:为了使不透明度起作用,元素必须具有“layout”,这是由 CSS 触发的特定于 IE 的布尔状态,例如高度、宽度、缩放等。如果元素没有“布局”,则不透明度将不起作用。

解决方法是向元素添加特定的 CSS 以赋予其“布局”。不确定这是否是您的情况,但很容易通过添加提供布局的 CSS 属性之一并查看问题是否消失来检查。

来自http://joseph.randomnetworks.com/archives/2006/08/16/css-opacity-in-internet-explorer-ie/

但只需设置过滤器/不透明度 IE 中的价值是不够的。原来 IE 需要一个元素 为了过滤器/不透明度而定位 去工作。如果您的元素没有 您可以通过以下方式解决此问题 将“缩放:1”添加到您的 CSS。那里 是其他黑客来处理这个, zoom 是我选择的那个,看起来 工作得很好。

在 JavaScript 中,您可以找出是否存在 IE中的元素有一个位置组件 通过检查 element.currentStyle.hasLayout。如果 hasLayout 为 false 则元素 没有 CSS 定位。

如果您想了解有关此问题的更多信息,请阅读以下阅读清单:

◦ 逐步探索不透明度 [断开的链接]

On having layout

Opacity @ QuirksMode

使用您的代码,这是确保如何测试这是否是您的问题的一种可能方法:

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 属性,并且仅在它为 false 时设置缩放,只要您防御 hasLayout 根本不存在的非 IE 情况。

如果这不能解决问题,您能否发布一个 HTML 示例或 URL,以便我们重现问题,从而更容易提出修复建议?谢谢!

【讨论】:

  • 好的,感谢您的帮助。我在 jsbin 上创建了一个现场演示:jsbin.com/iqadu/edit
  • 酷——演示让事情变得更加清晰,结果问题很简单:使用“.5”而不是“0.5”作为数字!请参阅上面的修订答案。并感谢您的赏金! :-)
猜你喜欢
  • 2010-10-29
  • 2010-12-05
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
  • 2011-05-25
  • 2010-11-21
  • 2013-05-07
  • 1970-01-01
相关资源
最近更新 更多