2017-06-19 10 views
0

この '共用体クラス'の場合と同じように、フィルタプロパティの効果を要約する。2つのCSSクラスのプロパティをフィルタ属性で結合する

.class1{filter:brightness(125%);} 
.class2{filter:blur(5px);} 
.unionClass{filter:brightness(125%) blur(5px);} 

しかし、このようにコードを記述するとどうなりますか?

//i want this 
<p class="class1 class2">Hello</p> 
//instead of 
<p class="unionClass">Hello</p> 

最初の例では、結果としてclass2クラスのみが適用されるため、class1クラスのプロパティは失われます。 2番目のクラスでは、 'unionClass'クラスには、既に含まれているすべての統合プロパティが表示されます。 「class = "class1 class2"」と同じ効果を見たいのですが、どうすればいいですか?CSSには正しい方法がありませんか?つまり、javascriptでは正しい方法は何でしょうか?

+2

@charlietfl使用して行うことができる方法の例を示すためにあったが、このスクリプトはもちろん、最適化することができ、約あなたは確かにそれ?これは同じプロパティ( 'filter')で、異なるプロパティではありません。私の実験では、OPが言っているように動作します(私はそれをマージすることを望んでいましたが、いいえ):https://jsfiddle.net/h48d99bp/(私は 'brightness'ではなく' drop-shadow'を使用しなければなりませんでした。 ;「明るさ」の違いを見ることができませんでした) –

+0

残念ながら、これはそうではありません。firefox mozillaは両方を適用しますが、最初は無視され、適用されません。 – User

+0

LessまたはSassの場合のように聞こえます。なぜなら、それらのスタイルを組み合わせたルールで複製する必要があるからです。 –

答えて

2

CSSを使用して行うことが可能ではない。そのようsplitt'dとき、それは他のプロパティとの意志として

、後者は、前者上書きされます。

メンテナンスから読みやすいこのようなことをすることは面白いかもしれません。

その後、
.fil-bright-125 { 
    filter:brightness(125%); 
} 

.fil-blur-5 { 
    filter:blur(5px); 
} 

.fil-bright-125.fil-blur-5 { 
    filter:brightness(125%) blur(5px); 
} 

万全を期すために

を更新しました。この

p { 
 
    color: blue; 
 
    background: yellow; 
 
} 
 

 
.fil-bright-175 { 
 
    filter:brightness(175%); 
 
} 
 

 
.fil-blur-1 { 
 
    filter:blur(1px); 
 
} 
 

 
.fil-bright-175.fil-blur-1 { 
 
    filter:brightness(175%) blur(1px); 
 
}
<p class="fil-bright-175">I am bright</p> 
 

 
<p class="fil-blur-1">I am blurry</p> 
 

 
<p class="fil-bright-175 fil-blur-1">I am bright and blurry</p>


のようにそれを使用し、ここでのスタイルでクラスを探すスクリプトを使用してのバージョンが、ありますシートを作成し、新しいものを作成して、それらを結合します。

上記と比較して、私は以下の維持可能性をほとんど見いだせません。

注目的は、スクリプト

(function(d, w) { 
 
    w.addEventListener("load", function() { 
 

 
    function getStyle(cls) { 
 
     var classes = d.styleSheets[0].rules || d.styleSheets[0].cssRules; 
 
     var val = ''; 
 
     for (var x = 0; x < classes.length; x++) { 
 
     for (var y = 0; y < cls.length; y++) { 
 
      if (classes[x].selectorText == cls[y]) { 
 
      val += ' ' + ((classes[x].cssText) ? classes[x].cssText : classes[x].style.cssText).split('filter')[1].replace(/[:;} ]/g, ''); 
 
      } 
 
     } 
 
     } 
 
     return val; 
 
    } 
 
    var val = getStyle(['.fil-bright-175','.fil-blur-1']); 
 
    val = '.fil-bright-175.fil-blur-1 {filter:' + val + '}'; 
 

 
    var head = d.head || d.getElementsByTagName('head')[0], 
 
     style = d.createElement('style'); 
 
    style.type = 'text/css'; 
 
    if (style.styleSheet) { 
 
     style.styleSheet.cssText = val; 
 
    } else { 
 
     style.appendChild(d.createTextNode(val)); 
 
    } 
 
    head.appendChild(style); 
 

 
    }, false); 
 
}(document, window));
p { 
 
    color: blue; 
 
    background: yellow; 
 
} 
 
.fil-bright-175 { 
 
    filter: brightness(175%); 
 
} 
 
.fil-blur-1 { 
 
    filter: blur(1px); 
 
}
<p class="fil-bright-175">I am bright</p> 
 

 
<p class="fil-blur-1">I am blurry</p> 
 

 
<p class="fil-bright-175 fil-blur-1">I am bright and blurry</p>

+0

しかし、純粋なCSSでは、私はそこに方法があるとは思わない。いくつかのメタCSSの事柄(Less、Sass)は、少なくとも実際の値を繰り返すことを避けることを可能にします。 –

+0

@ T.J.Crowderいいえ、ありません。 OPはまた、スクリプトで尋ねたので、私はそれを提案しようとしています。 – LGSon

関連する問題