
上一讲是动画,动画这块是svelte的一个非常不错的亮点。今天讲下样式
一、类指令
与任何其他属性一样,您可以使用 JavaScript 属性指定类,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| <script> let current = 'foo'; </script>
<button class="{current === 'foo' ? 'selected' : ''}" on:click="{() => current = 'foo'}" >foo</button>
<button class="{current === 'bar' ? 'selected' : ''}" on:click="{() => current = 'bar'}" >bar</button>
<button class="{current === 'baz' ? 'selected' : ''}" on:click="{() => current = 'baz'}" >baz</button>
<style> button { display: block; }
.selected { background-color: #ff3e00; color: white; } </style>
|
这是 UI 开发中的一种常见模式,Svelte 包含一个特殊指令来简化它:
1 2 3 4
| <button class:selected="{current === 'foo'}" on:click="{() => current = 'foo'}" >foo</button>
|
selected 类在表达式的值为真时添加到元素中,为假时删除它。
通过上面例子可以看出这个特殊指令就是class:样式名={expression}
二、class 指令简写形式
通常,如果说类的名称与它所依赖的值的名称相同,例如:
1 2 3
| <div class:big={big}> </div>
|
在这样的情况下,我们可以使用简写形式:
1 2 3
| <div class:big> </div>
|
三、行内/内联样式
除了在样式标签中添加样式外,您还可以使用样式属性为单个元素添加样式。 通常您会希望通过 CSS 进行样式设置,但样式属性对于动态样式非常有用,尤其是与 CSS 自定义属性结合使用时。
来看例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <script> let bgOpacity = 0.5; $: color = bgOpacity < 0.6 ? '#000' : '#fff'; </script>
<input type="range" min="0" max="1" step="0.1" bind:value={bgOpacity} />
<p>This is a paragraph.</p>
<style> p { font-family: "Comic Sans MS", cursive; background: rgba(255, 62, 0, var(--opacity)); } </style>
|
将以下样式属性添加到p元素: style="color: {color}; --opacity: {bgOpacity};"
1
| <p style="color: {color}; --opacity: {bgOpacity};">This is a paragraph.</p>
|
太好了,现在您可以使用根据您的输入更改的变量来设置p的样式,而无需为每个可能的值创建一个类了。
REPL
四、style 指令
能够动态设置 CSS 属性很好。 但是,如果您必须编写一个长字符串,这可能会变得笨拙。 缺少任何分号等错误可能会使整个字符串无效。 因此,Svelte 提供了一种更好的方式来使用 style 指令编写内联样式。
依然使用上面的例子,将p的样式属性更改为以下内容:
1 2 3 4
| <p style:color style:--opacity="{bgOpacity}" >
|
style 指令与 class 指令有一些共同点。 当属性名称和变量名称相同时,您可以使用简写。 所以 style:color="{color}" 可以写成 style:color。
与 class 指令类似,如果您尝试通过 style 属性设置相同的属性,则 style 指令将优先。这其实就是告诉你style优先级高于class。
总结
本讲总体来说还是比较简单的,其实就是原生的class和style的加强版本。
- class指令和style指令在属性名称和变量名称相同可以简写
- style指令优先级高于class指令
- 内联样式对于
动态样式非常有用,当然style指令更好些。
- 需要注意
Props那一讲的时候说到了属性传递,我们需要注意class传递会报错的,作为保留字导致的,你可以使用$$props.class代替
子组件Nested.svelte
1 2 3
| <script> export let class; </script>
|
父组件
1 2 3 4 5
| <script> import Nested from './Nested.svelte'; </script>
<Nested class="active"/>
|
上面的代码会报错Unexpected keyword 'class',解决的方案就是使用$$props.class代替
1 2 3 4 5 6 7 8 9 10
| <script> export let answer; </script>
<p class={$$props.class}>The answer is {answer}</p> <style> .active { color:red; } </style>
|