英文:
Overriding CSS variable in Svelte
问题
I'm trying to set opacity of HSLA background color dynamically using CSS variables.
First I created a variable --color
for color, which has --alpha
variable in it as alpha. It works, but I am not able to override the --alpha
variable at element level. The --alpha: .5
on h1
tag is applied to the element, but I am not seeing the transparency on the element.
REPL here: https://svelte.dev/repl/d4e15ba129324149915c2e124eeecb76?version=3.59.1
<script>
let name = 'world';
</script>
<h1 style="--alpha: .5">Hello {name}!</h1>
<style>
:global(:root) {
--alpha: 1;
--color: hsla(225, 50%, 50%, var(--alpha));
}
h1 {
background-color: var(--color);
}
</style>
英文:
I'm trying to set opacity of HSLA background color dynamically using CSS variables.
First I created a variable --color
for color, which has --alpha
variable in it as alpha. It works, but I am not able to override the --alpha
variable at element level. The --alpha: .5
on h1
tag is applied to the element, but i am not seeing the transparency on the element.
REPL here: https://svelte.dev/repl/d4e15ba129324149915c2e124eeecb76?version=3.59.1
<script>
let name = 'world';
</script>
<h1 style="--alpha: .5">Hello {name}!</h1>
<style>
:global(:root) {
--alpha: 1;
--color: hsla(225, 50%, 50%, var(--alpha));
}
h1 {
background-color: var(--color);
}
</style>
答案1
得分: 2
因为变量是在不同的元素上定义的,位于树的更高层,所以对--alpha
的更改不会影响--color
,因为它在不同级别以不同的--alpha
值解析。
解决这个问题的一种方法是在组件的所有元素上定义这些变量(如果可能,不建议使用:global
,如果另一个组件中的某些子元素依赖于此,可能是必要的)。
* {
--alpha: 1;
--color: hsla(225, 50%, 50%, var(--alpha));
}
对于作用域样式,选择器被转化为类选择器的形式.svelte-[hash]
,但对于全局样式,最好避免这种方法,如果对性能产生负面影响。
如果需要:global
,更优化的方法是将颜色声明移到一个特殊的类中,然后需要将这个类应用到引用--color
的元素上(在这种情况下是h1
或任何子组件):
:global(.custom-color) {
--color: hsla(225, 50%, 50%, var(--alpha));
}
如果提取所有其他颜色组件(色调、饱和度、亮度)并完全去掉--color
,则可以避免这种情况,尽管您还必须在任何地方详细说明hsla
的定义。
英文:
Because the variable is defined on a different element, higher in the tree, the change to --alpha
will not affect --color
as that is resolved at a different level with a different --alpha
value.
One way around that would be to define the variables on all elements in the component (would not recommend using :global
if it can be avoided, if some children in another component rely on this it may be necessary though).
* {
--alpha: 1;
--color: hsla(225, 50%, 50%, var(--alpha));
}
For scoped styles the selector is turned into just a class selector in the form .svelte-[hash]
but for global styles it might be best to avoid this approach if it negatively impacts performance.
A more optimized way if you need :global
would be to move just the color declaration to a special class which then needs to be applied on elements where the --color
is being referenced (in this case the h1
or any child components):
:global(.custom-color) {
--color: hsla(225, 50%, 50%, var(--alpha));
}
If you extract all other color components (hue, saturation, lightness) and drop --color
altogether, you could avoid this situation, though you also would always have to spell out a lengthy hsla
definition everywhere.
答案2
得分: 0
I am not sure what's the best approach for you as I don't know what you are trying to do but one solution would be setting the CSS variable using Javascript:
<script>
let alpha = 0.5;
let root = document.querySelector(":root")
$: root.style.setProperty('--alpha', alpha);
</script>
Now whenever you change the alpha value the root.style.setProperty('--alpha', alpha);
will rerun achieving what I think you want.
英文:
I am not sure what's the best approach for you as I don't know what you are trying to do but one solution would be setting the CSS variable using Javascript:
<!--language:html-->
<script>
let alpha = 0.5;
let root = document.querySelector(":root")
$: root.style.setProperty('--alpha', alpha);
</script>
Now whenever you change the alpha value the root.style.setProperty('--alpha', alpha);
will rerun achieving what I think you want.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论