Sass で、特定の要素が既に継承している値を操作することは可能ですか?
私はこのようなものを目指しています:
body
color: blue
.warning
color: red
strong
color: darken(inherit,20)
Sass で、特定の要素が既に継承している値を操作することは可能ですか?
私はこのようなものを目指しています:
body
color: blue
.warning
color: red
strong
color: darken(inherit,20)
いいえ、Sass はどのセレクターから色を継承するかを「認識」していません。strong
が の子孫であることを知る必要がありbody
ます。体の外では許可されていないので、それはあなたと私にとって十分に合理的な仮定のように思えますが、そのような仮定strong
はほとんどのセレクターについて行うことはできません. Sass は、他の祖先要素からカスケードが発生していないことも認識している必要があります。
ul {
color: red;
}
ol {
color: blue;
}
li {
// which color do I inherit from ????
}
Sass は、以前に宣言された変数の値へのアクセスをいかなる方法でも許可しません。「ボディカラーより濃いめ」の指定はできません。CSS ルールはオブジェクトまたはマッピングではなく、どのような方法でもアクセスできません。あなたのケースは単純かもしれませんが、次のようなより複雑なケースを考えてみましょう:
.foo {
background: mix(white, blue); // fallback for non-rgba browsers
background: rgba(blue, .5);
.baz & {
background: yellow;
}
@media (min-width 30em) {
background: orange;
}
@supports (flex-wrap: wrap) {
background: red;
}
}
.bar {
// access which background color from .foo ????
}
必要なことを行うには、変数を使用するか、バニラ CSS の機能である必要があります。
一部のプロパティは、ブラウザーで長年サポートされているものを使用して動的に生成/継承されているように見せることができます。
ul.one {
background: white;
}
ul.two {
background: yellow;
}
ul {
background: rgba(0, 120, 255, .2);
padding: 1em;
}
<ul class="one">
<li><ul>
<li><ul>
<li>Foo</li>
</ul></li>
</ul></li>
</ul>
<ul class="two">
<li><ul>
<li><ul>
<li>Foo</li>
</ul></li>
</ul></li>
</ul>
CSS 変数の生成は、継承されたプロパティを操作できるようになるのとほぼ同じです。ブラウザーのサポートはまだ完全ではありませんが ( caniuseを確認してください)、次のようになります。
サス:
ul {
--list-color: orange;
--darker-color: darken(orange, 15%);
color: var(--list-color);
}
ol {
--list-color: green;
--darker-color: darken(green, 10%);
color: var(--list-color);
}
li {
background: var(--darker-color);
}
出力:
ul {
--list-color: orange;
--darker-color: #b37400;
color: var(--list-color);
}
ol {
--list-color: green;
--darker-color: #004d00;
color: var(--list-color);
}
li {
background: var(--darker-color);
}
<ul>
<li>Foo</li>
</ul>
<ol>
<li>Bar</li>
</ol>
CSS 変数をサポートするブラウザーを使用している場合、結果は次のようになります。
同じものを探していて、こちらにたどり着きました。あなたの質問には答えましたが、問題は解決しませんでした。
解決策は次のとおりです。http://codepen.io/monsto/pen/tiokl
HTML が次の場合:
<div class="main">
<header class="header">
<div class="warning">
<p><strong>Danger,</strong> Will Robinson!</p>
</div>
</header>
</div>
次に、SASSを使用してこれを行うことができます:
$bg: #f88;
@mixin colorize {
$bg: darken($bg,15%) !global; // !global flag required for 3.4 or later, remove if using 3.3 or older
background: $bg;
}
.warning {
background: $bg;
p {
@include colorize;
strong {
@include colorize;
}
}
}
SASS は、その出力の結果を認識していないようです。したがって、それにinherit
は何の意味もありません。基本的に、出力する前に出力が何であるかを知るように求めています。
ただし、デフォルトでは厳密にスコープが設定されているため、変数であることは認識しています。ドキュメントから:
変数は、変数が定義されているネストされたセレクターのレベル内でのみ使用できます。ネストされたセレクターの外側で定義されている場合は、どこでも使用できます。
ミックスイン内の AND THEN 変数:
mixin に渡されたコンテンツのブロックは、mixin のスコープではなく、ブロックが定義されているスコープで評価されます。
これにより、上記の mixin は、親レベルで定義された既知の変数を取得し、現在のレベルでそれを再定義して、その子で使用できるようになります。$x = $x + 1
マルチネストされたループ内で行うようなものです
TBPH、これは SASS に対する私の考え方をかなり変えます。私が思っていたよりも明らかにプログラマティックです。
この回答は、具体的には機能に対応しています。考えられる代替手段は、SASS (または LESS)関数の代わりにdarken
CSS フィルターを使用することです。フィルターが他の要素に影響を与えないように、基本的にタグ内で色をラップする必要があります。brightness()
darken()
span
簡単なデモ:
.red {color: red}
.blue {color: blue}
.green {color: green}
span {
display: inline-block;
padding: 1em;
}
.darken span {
-webkit-filter: brightness(0.4);
filter: brightness(0.4);
}
<span class="red">Red</span>
<span class="blue">Blue</span>
<span class="green">Green</span>
<div class="darken">
<span class="red">Red</span>
<span class="blue">Blue</span>
<span class="green">Green</span>
</div>
jsFiddle: https://jsfiddle.net/azizn/hhorhz9s/
ブラウザの互換性に注意する必要があります。IE Edge、最新の Firefox、および Chrome で動作するはずです。詳細については、 caniuseまたはMDNを参照してください。
背景を暗くする場合は、不透明度のある疑似セレクターを使用するか、半透明の黒い PNG 背景画像を追加できます。