#css #scoped-css #style-sheet #macro #leptos #web-framework #stylers

nightly macro stylers_macro

为 Leptos 等Rust 网页框架提供范围化 CSS

3 个版本 (稳定版)

1.0.2 2023年10月15日
1.0.0-alpha2023年9月26日

#11 in #scoped-css

Download history 41/week @ 2024-03-11 26/week @ 2024-03-18 26/week @ 2024-03-25 55/week @ 2024-04-01 23/week @ 2024-04-08 15/week @ 2024-04-15 23/week @ 2024-04-22 16/week @ 2024-04-29 11/week @ 2024-05-06 26/week @ 2024-05-13 28/week @ 2024-05-20 36/week @ 2024-05-27 30/week @ 2024-06-03 33/week @ 2024-06-10 22/week @ 2024-06-17 16/week @ 2024-06-24

每月 109 次下载

MIT 许可证

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

先决条件

  • 如果您正在使用 stylestyle_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 文件,以查找 stylestyle_sheet 宏的使用位置,并生成单个输出 CSS 文件。
  • style_strstyle_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