2

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

4

1 に答える 1

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 の癖に遭遇している可能性があります。不透明度を機能させるには、要素に「layout」が必要です。これは、高さ、幅、ズームなどの CSS によってトリガーされる IE 固有のブール値の状態です。など。要素に「レイアウト」がない場合、不透明度は機能しません。

回避策は、特定の CSS を要素に追加して「レイアウト」を与えることです。これがあなたのケースで起こっているかどうかはわかりませんが、レイアウトを提供する CSS 属性の 1 つを追加して問題が解決するかどうかを確認するのは簡単です。

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

しかし、IE でフィルター/不透明度の値を設定するだけでは十分ではありません。フィルター/不透明度を機能させるには、IE で要素を配置する必要があることがわかりました。要素に位置がない場合は、CSS に「zoom: 1」を追加することでこれを回避できます。これに対処するためのハックは他にもあります。ズームは私が選んだもので、十分に機能しているようです。

JavaScript では、element.currentStyle.hasLayout を確認することで、IE の要素に位置コンポーネントがあるかどうかを確認できます。hasLayout が false の場合、要素には CSS 配置がありません。

この問題について詳しく知りたい場合は、次の参考文献リストを参照してください。

◦ OpacityStep-by-Step の探索 [リンク切れ]

レイアウトについて

不透明度 @ QuirksMode

コードを使用して、これが問題であるかどうかをテストする方法を確認する方法の 1 つを次に示します。

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 を投稿していただけますか? ありがとう!

于 2009-11-05T17:34:24.693 に答える