Firefoxの最新バージョンは CSS変数 をサポートしていますが、Chrome、IEおよび他のブラウザのロードはサポートしていません。DOMにアクセスできるはずですNodeまたは、ブラウザがこの機能をサポートしているかどうかを返す小さなメソッドを記述しますが、現在これを実行できるものを見つけることができませんでした。必要なのは、次のように使用できるソリューションです。ブラウザがこの機能をサポートしていない場合にコードを実行するための条件。次のようになります。
if (!browserCanUseCssVariables()) {
// Do stuff...
}
_CSS.supports
_ でこれを行うことができます。これは、現在Firefox、Chrome、OperaおよびAndroidブラウザで利用可能なCSSの_@supports
_ルールのJavaScript実装です( を参照)使用できますか... )。
CSS.supports()
staticメソッドは、ブラウザが特定のCSS機能をサポートしているかどうかを示すブール値を返します。
– Mozilla Developer Network
これにより、次のことが簡単になります。
_CSS.supports('color', 'var(--fake-var)');
_
この結果は、ブラウザーがCSS変数をサポートしている場合はtrue
になり、サポートしていない場合はfalse
になります。
(CSS.supports('--fake-var', 0)
が機能すると思うかもしれませんが、この回答のコメントに記載されているように、Safariにはバグがあり、失敗しているようです。)
Firefoxでは、上記の_CSS.supports
_呼び出しがtrue
を返すため、このコードスニペットは緑色の背景を生成します。 CSS変数をサポートしていないブラウザでは、背景が赤になります。
_var body = document.getElementsByTagName('body')[0];
if (window.CSS && CSS.supports('color', 'var(--fake-var)')) {
body.style.background = 'green';
} else {
body.style.background = 'red';
}
_
ここで、_window.CSS
_が存在するかどうかを確認するチェックも追加したことに注意してください。これにより、このJavaScript実装をサポートしていないブラウザーでエラーがスローされるのを防ぎ、それをfalse
として扱います。 (_CSS.supports
_はCSS
globalが導入されたのと同時に導入されたため、同様にチェックする必要はありません。)
browserCanUseCssVariables()
関数の作成あなたの場合、同じロジックを実行するだけでbrowserCanUseCssVariables()
関数を作成できます。以下のスニペットは、サポートに応じてtrue
またはfalse
のいずれかを警告します。
_function browserCanUseCssVariables() {
return window.CSS && CSS.supports('color', 'var(--fake-var)');
}
if (browserCanUseCssVariables()) {
alert('Your browser supports CSS Variables!');
} else {
alert('Your browser does not support CSS Variables and/or CSS.supports. :-(');
}
_
CSS変数を使用してCSSスタイルを設定し、Javascriptを使用して証明します。設定されている場合はgetComputedStyle()
... getComputedStyle()
は多くのブラウザーでサポートされています: http://caniuse.com /#feat = getcomputedstyle
[〜#〜] html [〜#〜]
<div class="css-variable-test"></div>
[〜#〜] css [〜#〜]
:root {
--main-bg-color: rgb(1, 2, 3); /* or something else */
}
.css-variable-test {
display: none;
background-color: var(--main-bg-color);
}
JavaScript
var computedStyle = getComputedStyle(document.getElementsByClassName('css-variable-test')[0], null);
if (computedStyle.backgroundColor == "rgb(1, 2, 3)") { // or something else
alert('CSS variables support');
}
Do stuff...
がJavascript自体でない限り、ブラウザがカスタムプロパティをサポートしているかどうかを検出するためにJavascriptは必要ありません。あなたがサポートを検出しているのはCSSなので、あなたがやろうとしているのはすべてCSSだと思います。したがって、この特定の問題からJSを削除する方法がある場合は、 機能クエリ をお勧めします。
@supports (display: var(--prop)) {
h1 { font-weight: normal; }
/* all the css, even without var() */
}
機能クエリは、構文のサポートをテストします。 display
を照会する必要はありません。必要なプロパティを使用できます。同様に、--prop
の値も存在する必要はありません。あなたがしているのは、ブラウザがその構文の読み方を知っているかどうかを確認することだけです。
(ほとんどすべてのブラウザがサポートしているため、display
を選択しました。flex-wrap
などを使用すると、カスタムプロップをサポートしているがフレックスボックスをサポートしていないブラウザを見つけることができません。)
補足:私はそれらをカスタムプロパティと呼ぶことを好みます。著者。はい、変数として使用できますが、DOM継承など、プロパティとしての利点がいくつかあります。
body { --color-heading: green; }
article { --color-heading: blue; }
h1 { color: var(--color-heading); } /* no need for descendant selectors */
chrome 49(ネイティブサポートがあるにもかかわらず)でcss変数をテストするためにwindow.CSS.supports
メソッドを機能させるのに問題がありました)。
var supportsCssVars = function() {
var s = document.createElement('style'),
support;
s.innerHTML = ":root { --tmp-var: bold; }";
document.head.appendChild(s);
support = !!(window.CSS && window.CSS.supports && window.CSS.supports('font-weight', 'var(--tmp-var)'));
s.parentNode.removeChild(s);
return support;
}
console.log("Supports css variables:", supportsCssVars());
私がテストしたすべてのブラウザで動作するようです。おそらく、コードは最適化できます。