3 个版本 (稳定版)
1.0.2 | 2023年10月15日 |
---|---|
1.0.0-alpha | 2023年9月26日 |
#11 in #scoped-css
每月 109 次下载
76KB
1.5K SLoC
Stylers
- 为 Leptos 等Rust 网页框架提供范围化 CSS。
style!
宏用于在 Rust 函数中直接编写 CSS。它还会验证 CSS 属性。style_sheet!
宏用于在外部 CSS 文件中编写 CSS,并在 Rust 函数中导入它。style_str!
宏与style!
宏相同,但返回元组(class_name, style_val)
而不是将 style_val 保存到单独的文件中。style_sheet_str!
与style_sheet!
宏相同,但返回元组(class_name, style_val)
而不是将 style_val 保存到单独的文件中。
重要说明
- 此 Readme 文件是 stylers 1.0.0-alpha 的最新版本。您可以在此处找到先前版本的说明。
安装
cargo添加 stylers
先决条件
- 如果您正在使用
style
或style_sheet
宏,那么您必须在您的 Cargo.toml 文件中将stylers
crate 添加为依赖项和构建依赖项。
[dependencies]
stylers = { version = "*" }
[build-dependencies]
stylers = { version = "*" }
- 然后您必须在您的根目录中添加
build.rs
文件,并在其中添加以下代码片段。
use stylers::build;
fn main() {
build(Some(String::from("./target/main.css")));
}
- 在上面的例子中,输出 CSS 文件将生成在
./target/main.css
路径。您可以将该main.css
文件包含到您的index.html
文件中。(如果您使用的是 Trunk.rs 这样的构建工具,则必须遵循适当的方法将 main.css 文件包含到您的项目中)。
您可以在此处找到这些新更改的重要性。
Leptos 示例
注意:Leptos 版本 > 0.4.9 有一些新更改。但 stylers 在所有版本的 Leptos 中都以相同的方式工作。
style!
#[component]
fn Hello(cx: Scope, name: &'static str) -> impl IntoView {
let styler_class = style! {
#two{
color: blue;
}
div.one{
color: red;
content: raw_str(r#"\hello"#);
font: "1.3em/1.2" Arial, Helvetica, sans-serif;
}
div {
border: 1px solid black;
margin: 25px 50px 75px 100px;
background-color: lightblue;
}
h2 {
color: purple;
}
@media only screen and (max-width: 1000px) {
h3 {
background-color: lightblue;
color: blue
}
}
};
view! {cx, class = styler_class,
<div class="one">
<h1 id="two">"Hello"</h1>
<h2>"World"</h2>
<h2>{name}</h2>
<h3>"Hello Kanna"</h3>
</div>
}
}
style_sheet!
#[component]
fn Hello(cx: Scope, name: &'static str) -> impl IntoView {
let class_name = style_sheet!("./hello.css");
view! {cx, class = class_name,
<div class="one">
<h1 id="two">"Hello"</h1>
<h2>"World"</h2>
</div>
}
}
- 在上面的情况下,
hello.css
文件位于项目的root
目录中。
style_str!
#[component]
pub fn GreenButton(cx: Scope) -> impl IntoView {
let (class_name, style_val) = style_str! {
button {
background-color: green;
border-radius: 8px;
border-style: none;
box-sizing: border-box;
color: yellow;
cursor: pointer;
display: inline-block;
font-family: r#"Haas Grot Text R Web"#, r#"Helvetica Neue"#, Helvetica, Arial, sans-serif;
font-size: 14px;
font-weight: 500;
height: 40px;
line-height: 20px;
list-style: none;
margin: 0;
outline: none;
padding: 10px 16px;
position: relative;
text-align: center;
text-decoration: none;
transition: color 100ms;
vertical-align: baseline;
user-select: none;
-webkit-user-select: none;
}
button:hover{
background-color: yellow;
color: green;
}
};
view! {cx, class = class_name,
<style>{style_val}</style>
<button>"I am green button"</button>
}
}
style_sheet_str!
#[component]
pub fn BlueButton(cx: Scope) -> impl IntoView {
let (class_name, style_val) = style_sheet_str!("./src/button.css");
view! {cx, class = class_name,
<style>{style_val}</style>
<button>"I am blue button"</button>
}
}
- 在这种情况下,
button.css
文件位于项目的src
目录中。
自定义伪类
- 在某些情况下,我们可能需要我们的 CSS 影响 DOM 树的
深层
。为了实现这一点,我们有一个自定义伪类,称为:deep()
。例如,以下 CSS 是有效的。
输入
div :deep(h3) {
color: orange;
}
输出
div.l-243433 h3{color: orange;}
- 如果您想特定的 CSS 成为
全局
,您可以使用:deep()
指令,而无需任何前导选择器。
输入
:deep(h3 div) {
color: orange;
}
输出
h3 div{color: orange;}
它是如何工作的
- 此
stylers::build
方法将在构建步骤中解析路径/src/**/*.rs
中的所有 Rust 文件,以查找style
和style_sheet
宏的使用位置,并生成单个输出 CSS 文件。 style_str
和style_sheet_str
直接返回元组 (class_name, output_css)。
处理 style!
宏的边缘情况
- 默认情况下,将移除 CSS 属性值周围的引号( " )。如果用户想要保留引号,他们必须使用
raw_str
进行包装,如下所示 - 这些规则适用于
style!
和style_str!
宏
输入
style!(
div{
content: raw_str(r#"\hello"#);
font: "1.3em/1.2" Arial;
}
)
输出
div.l-23432{
content: "\hello";
font: 1.3em/1.2 Arial;
}
可选的 Trunk 构建过程(仅在您使用 style!
或 style_sheet!
宏时)
-
您必须在 index.html 中包含生成的 main.css(例如
<link rel="stylesheet" href="/main.css">
)。 -
在
Trunk.toml
中,您必须添加以下行,将main.css
文件从./target/
目录移动到./dist/
目录。
[[hooks]]
stage = "post_build"
command = "sh"
command_arguments = ["-c", "cp ./target/main.css $TRUNK_STAGING_DIR/"]
- 当您使用
style_sheet!
宏包含外部 CSS 文件时,每次您更改 CSS 文件时,都必须保存相应的 Rust 文件 (*.rs),以便在浏览器中更新 CSS。有关 Trunk 的更多信息,请参阅 此处。 - 如果样式有问题,请删除
./target/stylers
目录并重新构建您的包。如果问题仍然存在,请在此处提出问题。
依赖关系
~710KB
~14K SLoC