HTML元素样式设置
内联样式与样式表
对于网页开发新手来说,了解设置HTML元素样式的两种方式很重要:内联样式和样式表。
内联样式直接定义在元素标签上。在原始HTML中,看起来是这样的:
同时,任何HTML页面都可以引用样式表列表,其中定义了大量样式,每个样式都绑定到一个选择器(用于选择应用这些样式的元素的规则)。
这里有一个简短的样式表示例:
你可以用这个样式表来设置以下文档的样式:
当样式表和内联声明中存在冲突的样式时,内联样式优先。
我们稍后会介绍和讨论修饰符 ( Modifier) 和 CSS 样式块 ( CssStyle)。 但通常来说,当你直接将修饰符作为参数传递给可组合组件时,这些会变成内联样式,而如果你使用CSS样式块来定义样式,这些样式会被嵌入到网站的样式表中:
样式表的优势
虽然没有绝对的规则,但通常在手写HTML/CSS时,样式表比内联样式更受欢迎,因为它更好地保持了关注点分离。也就是说,HTML应该表示网站的内容,而CSS控制外观和感觉。
但是!我们不是在手写HTML/CSS。我们在使用Compose HTML!在Kotlin中我们还需要关心这个吗?
事实证明,有时你必须使用样式表,因为没有它们,你就无法为高级行为定义样式(特别是伪类、 伪元素和 媒体查询)。 例如,如果不使用样式表方法,你就无法覆盖已访问链接的颜色。所以值得意识到这些根本性的区别。
最后,当你倾向于使用样式表而不是内联样式时,使用浏览器工具调试页面也会更容易,因为这样可以使你的DOM树更容易阅读 (例如:<div class="title">
vs. <div style="color:yellow; background-color:black; font-size: 24px; ...">
)。
选择哪种方式?
作为初学者,甚至是在原型设计时的高级用户,可以尽可能多地使用内联修饰符,如果发现需要使用伪类、伪元素或媒体查询时,再转向CSS样式块。 在Kobweb中,将内联样式迁移到样式表是相当容易的。
在我自己的项目中,我倾向于对非常简单的布局声明使用内联样式(例如:Row(Modifier.fillMaxWidth())
), 而对复杂和/或可重用的组件使用CSS样式块。
修饰符(Modifier)
Kobweb引入了Modifier
类,以提供类似于Jetpack Compose中的体验。 (如果你不熟悉这个概念,可以在这里阅读更多)。
在Compose HTML世界中,你可以将Modifier
视为CSS样式和部分属性的包装器。
所以这样的代码:
当传入Kobweb提供的组件(如Box
)时:
会生成等效的HTML:
链式调用
像在Jetpack Compose中一样,修饰符可以使用then
方法链式调用:
由于修饰符是不可变的,你可以放心地重用和组合它们。
toAttrs
Modifier
是Kobweb的概念,但Compose HTML对此一无所知。它使用一个叫做AttrsScope
的概念来声明属性和样式。
因此,如果你有一个想要传递给Compose HTML元素的Modifier
,你可以使用toAttrs
方法将其转换为AttrsScope
:
你还可以传入一个回调给toAttrs
,让你修改最终的AttrsScope
,类型会根据当前元素确定:
例如,当使用Compose HTML的Input
可组合组件时,你可以用这个方法添加输入特定的属性:
attrsModifier
和styleModifier
Kobweb提供了大量的修饰符扩展(而且还在增长),比如上面的background
、color
和padding
。 但当你遇到缺少的修饰符时,还有两个后备方案:attrsModifier
和styleModifier
。
在这一点上,你是在与Compose HTML交互,这是Kobweb的下一层。
使用它们看起来像这样:
请注意,style
本身就是一个属性,所以你甚至可以在attrsModifier
中定义样式:
但在上述情况下,为了简单起见,建议使用styleModifier
。
attr
和property
在偶尔(希望很少见!)的情况下,当Kobweb没有提供修饰符,而Compose HTML也没有提供你需要的属性或样式支持时, 你可以使用attrsModifier
加attr
方法或styleModifier
加property
方法。这个后备方案中的后备方案允许你提供任何自定义值。
上述情况可以重写为:
最后,请注意,根据CSS的设计,样式可以应用于任何元素,而属性通常与特定元素绑定。例如,id
属性可以应用于任何元素, 但href
只能应用于a
标签。由于修饰符没有上下文知道它们被传递给哪个元素,Kobweb只提供 全局属性的属性修饰符 (例如Modifier.id("example")
),而不提供其他属性。
如果你发现在自己的代码库中需要使用styleModifier { property(key, value) }
,请考虑 告诉我们, 这样我们就可以将缺失的样式修饰符添加到框架中。
至少,我们鼓励你定义自己的扩展方法来创建类型安全的样式修饰符: