2017-01-09 6 views
3

私は、周囲のCSSやそのセレクタを知らないCMSのアプリケーションを作成していますが、私のアプリは常に同じに見えるようにします。すべてのCSSスタイルをCSSセレクタで上書きする

私は外部のセレクタがbutton{height: 100px;}と私のセレクタbutton .class{width:100px;}を経由して例えば、私の要素のうちの1つを選択した場合height属性を指定していないこと、問題を抱えている、外部のセレクタは、私のボタンにこの属性を置き、そのスタイルを変更します。

これは単純な例です。「heightもセレクタに指定してください」と言うと、thinkable属性をすべてセレクタに入れて、設定されている可能性があるすべてを上書きできません。

簡単な例として、https://jsfiddle.net/u4rvx6Lk/を参照してください。最初のセレクタで青い要素の境界線を設定したくないのですが、もちろんそうです。

私はall: unset;all: initial;を試しましたが、Internet Explorerではうまく動作しません。

スコープ付きCSSについても知っていますが、これも非常に信頼性の高い方法ではありません。

(さらに情報:それは主にワードプレスCMSページに注入された角度1.xのアプリです、私はSASSを使用して、私のCSSをコンパイル)

+0

たぶん、あなたは '重要探しているに' – Hackerman

+1

私はセットカント属性を設定していけない場合は、このような重要な –

+0

:!!https://jsfiddle.net/u4rvx6Lk/1/ – Hackerman

答えて

2

私のために働いた解決策は、revertの値に設定されたCSSプロパティallを使用しています。

.css-class { 
    all: revert; 
} 

mozilla docs for revert

はうまくそれを説明する:プロパティは、現在のスタイルの起源にはスタイルが存在しない場合は、それが持っていたであろう値をとるように

復帰のCSSキーワードはカスケードをロールバックします。 FirefoxとChromeの

unsetを使用します。

.css-class { 
    all: unset; 
} 

は、クロスブラウザのソリューションのための現在のブラウザをチェックするための「メディアクエリーハック」を使用するためのbrowser hacksを参照してください。また、青いボックスが高さプロパティを継承しないこのフィドルを見てください。

このソリューションがあなたのプロジェクトでもうまくいくことを望みます。

+0

クロムとファイアフォックスの高さと境界線を継承しています。あなたの例のフィドル –

+0

im申し訳ありませんが、これは、firefoxやchromeの青いボックススタイルneigtherについては何も変わりません。 –

+0

これは 'all:unset'がすべての要素の** inherited **プロパティをデフォルトに設定しないために起こります。たとえば、 'height'は最初は' auto'に設定され、親の高さには依存しません。 – Siavas

0

は簡単たとえば、このfiddleを参照してください。残念なことに、最初のセレクタは青い要素の枠線を設定します。

境界線が2番目のボックスで定義されている理由は、境界線を定義したbuttonであるためです。それがCSSの仕組みです。 2番目の要素に境界線を指定しない場合は、2番目の要素にborder: 0;を定義するか、境界線を定義する元のセレクタでbuttonを指定する必要があります。button:not(#id1)などの2番目のボックスを除外します。

+0

私は最初のセレクタには何の影響もなく、その属性が何であるかを述べました。たとえば、パディングやその他のものを設定することができます。私は私のスニペットがGoogleマップスニペットのように注入されるウェブサイトを知っていないので、それが存在することさえ知りません。それはどこにでも適用できます。私は外部のCSSが私の要素に影響するのを防ぐ方法を探しています。 –

+0

CSSがページに読み込まれている場合は、その要素に影響を与えないようにすることはできません。あなたができることは、CSSをロードしたり、スタイルシートやスタイルタグをクライアント側のコードで削除したりしないことです。 –

+0

インラインスタイルを使用し、classList.removeなどですべてのクラスを削除することをおすすめしますか?もしあなたが望むならば、 –

0

私は何とかそれを働かせました。答えをありがとう。

all: unset and revert私にとっては、all: initialでした。

また、私は内部クラスに非常に固有の名前を与えます。 class=my-project-classのように、外部クラスセレクタが独自の属性を挿入するのを防ぎます。

これはIEでは機能しません。

このフィドルを参照してください:https://jsfiddle.net/Lvxxnh8r/13/

+0

また、私のこの謎には:https ://jsfiddle.net/Lvxxnh8r/14/ 'all:unset'はうまく動作します。このフィドルの誰かがpostet:https://jsfiddle.net/Lvxxnh8r/10/それdoenst。私は非常に混乱しています。 –

+0

私は理由を知っています:あなたが言ったように私のためにそれが正しくない場合でも、コメント '//Firefox'などはそれを破った –

1

ウェブが現在存在しているとしてあなたの要素を変形からCSSコードを停止することは事実上不可能です。あなたが本質的に話しているのは、サンドボックス要素で、他のコードによって変更されないようにします。

これはiframeで行うことができますが、それは恐ろしい、そして確かにあまりにも多くの愚か者です。

一方、未来は明るいです!シャドーDOMと呼ばれる機能があります。この機能は基本的に、独自の要素を実装し、残りのコードからサンドボックスを取り込むことを可能にします。すでにinputvideoのような要素が背後でどのように機能しているのですか。今、私たちはブラウザが何年も何をしてきたかを知ります。

要素を作成することができます:solid-buttonとします。

<solid-button></solid-button> 

次に、そのコードを書き込んでください。我々はそれをしたいまでそれが画面に表示されませんtemplateでこれを入れます:

<template id="solid-button-src"> 
    <style> 
    button { 
     width: 100px; 
     height: 100px; 
     background-color: green; 
     border: solid 1px black; 
    } 

    </style> 
    <button></button> 
</template> 

私たちは、その後に、テンプレートに影DOMを作成するためのJavascriptの少しを使用してコンテンツを追加しますそれ:

customElements.define('solid-button', class extends HTMLElement { 
    constructor() { 
    super(); 

    const shadowRoot = this.attachShadow({ 
     mode: 'open' 
    }); 
    const template = document.querySelector('#solid-button-src'); 
    const clone = document.importNode(template.content, true); 
    shadowRoot.appendChild(clone); 
    } 
}); 

これは今にいくつかののブラウザで動作しますが、それ生産準備をするのに十分などこにも近いです。ユーザーはsolid-buttonにスタイルを適用できますが、内部のコンテンツには影響しません。最新のブラウザをお持ちの場合は、下記のとおりです。

明らかにこれはあなたにとって今の解決策ではありませんが、将来の可能性があります。

customElements.define('solid-button', class extends HTMLElement { 
 
    constructor() { 
 
    super(); 
 

 
    const shadowRoot = this.attachShadow({ 
 
     mode: 'open' 
 
    }); 
 
    const template = document.querySelector('template'); 
 
    const clone = document.importNode(template.content, true); 
 
    shadowRoot.appendChild(clone); 
 
    } 
 
});
button { 
 
    height: 100px; 
 
    width: 100px; 
 
    background-color: red; 
 
    border: solid 1px black; 
 
} 
 

 
.class1 { 
 
    height: 100px; 
 
    width: 100px; 
 
    background-color: blue; 
 
} 
 

 
my-button { 
 
    background: red; /* does nothing visible */ 
 
}
<button></button> 
 
<button id="id1" class="class1"></button> 
 
<solid-button></solid-button> 
 
<solid-button class="class1"></solid-button> 
 

 
<template> 
 
    <style> 
 
    button { 
 
     width: 100px; 
 
     height: 100px; 
 
     background-color: green; 
 
     border: solid 1px black; 
 
    } 
 

 
    </style> 
 
    <button> 
 
    <slot name="content"></slot> 
 
    </button> 
 
</template>

+0

素晴らしい答えです。 'all:initial'が仕事をした –

関連する問題