Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

插曲:样式

任何创建网站或应用程序的人很快就会遇到样式问题。对于小型应用程序,单个 CSS 文件可能足以为您的用户界面设置样式。但随着应用程序的增长,许多开发人员发现普通 CSS 变得越来越难以管理。

一些前端框架(如 Angular、Vue 和 Svelte)提供了内置的方法来将 CSS 限定到特定组件,使得在整个应用程序中管理样式变得更容易,而不会让用于修改一个小组件的样式产生全局影响。其他框架(如 React 或 Solid)不提供内置的 CSS 作用域,而是依赖生态系统中的库来为它们做这件事。Leptos 属于后一阵营:框架本身对 CSS 没有任何意见,但提供了一些工具和原语,允许其他人构建样式库。

以下是为您的 Leptos 应用程序设置样式的几种不同方法,从普通 CSS 开始。

普通 CSS

使用 Trunk 的客户端渲染

trunk 可用于将 CSS 文件和图像与您的站点捆绑在一起。为此,您可以通过在 <head> 中的 index.html 中定义它们来将它们添加为 Trunk 资产。例如,要添加位于 style.css 的 CSS 文件,您可以添加标签 <link data-trunk rel="css" href="./style.css"/>

您可以在 Trunk 文档的资产部分找到更多信息。

使用 cargo-leptos 的服务端渲染

cargo-leptos 模板默认配置为使用 SASS 来捆绑 CSS 文件并在 /pkg/{project_name}.css 输出它们。如果您想加载额外的 CSS 文件,您可以通过将它们导入到该 style.scss 文件中,或者将它们添加到 public 目录来做到这一点。(例如,public/foo.css 的文件在 /foo.css 提供服务。)

要在组件中加载样式表,您可以使用 Stylesheet 组件。

TailwindCSS:实用优先的 CSS

TailwindCSS 是一个流行的实用优先 CSS 库。它允许您通过使用内联实用类来为应用程序设置样式,使用自定义 CLI 工具扫描您的文件以查找 Tailwind 类名并捆绑必要的 CSS。

这允许您编写这样的组件:

#[component]
fn Home() -> impl IntoView {
    let (count, set_count) = signal(0);

    view! {
        <main class="my-0 mx-auto max-w-3xl text-center">
            <h2 class="p-6 text-4xl">"Welcome to Leptos with Tailwind"</h2>
            <p class="px-10 pb-10 text-left">"Tailwind will scan your Rust files for Tailwind class names and compile them into a CSS file."</p>
            <button
                class="bg-sky-600 hover:bg-sky-700 px-5 py-3 text-white rounded-lg"
                on:click=move |_| *set_count.write() += 1
            >
                {move || if count.get() == 0 {
                    "Click me!".to_string()
                } else {
                    count.get().to_string()
                }}
            </button>
        </main>
    }
}

一开始设置 Tailwind 集成可能有点复杂,但您可以查看我们的两个示例,了解如何将 Tailwind 与客户端渲染的 trunk 应用程序服务端渲染的 cargo-leptos 应用程序一起使用。cargo-leptos 还有一些内置的 Tailwind 支持,您可以将其用作 Tailwind CLI 的替代方案。

Stylers:编译时 CSS 提取

Stylers 是一个编译时作用域 CSS 库,让您在组件主体中声明作用域 CSS。Stylers 将在编译时将此 CSS 提取到 CSS 文件中,然后您可以将其导入到您的应用程序中,这意味着它不会向您的应用程序的 WASM 二进制大小添加任何内容。

这允许您编写这样的组件:

use stylers::style;

#[component]
pub fn App() -> impl IntoView {
    let styler_class = style! { "App",
        #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! { class = styler_class,
        <div class="one">
            <h1 id="two">"Hello"</h1>
            <h2>"World"</h2>
            <h2>"and"</h2>
            <h3>"friends!"</h3>
        </div>
    }
}

Stylance:在 CSS 文件中编写的作用域 CSS

Stylers 让您在 Rust 代码中内联编写 CSS,在编译时提取它,并限定其作用域。Stylance 允许您在组件旁边的 CSS 文件中编写 CSS,将这些文件导入到您的组件中,并将 CSS 类限定到您的组件。

这与 trunkcargo-leptos 的实时重新加载功能配合得很好,因为编辑的 CSS 文件可以立即在浏览器中更新。

import_style!(style, "app.module.scss");

#[component]
fn HomePage() -> impl IntoView {
    view! {
        <div class=style::jumbotron/>
    }
}

您可以直接编辑 CSS 而不会导致 Rust 重新编译。

.jumbotron {
  background: blue;
}

Styled:运行时 CSS 作用域

Styled 是一个与 Leptos 很好集成的运行时作用域 CSS 库。它让您在组件函数主体中声明作用域 CSS,然后在运行时应用这些样式。

use styled::style;

#[component]
pub fn MyComponent() -> impl IntoView {
    let styles = style!(
      div {
        background-color: red;
        color: white;
      }
    );

    styled::view! { styles,
        <div>"This text should be red with white text."</div>
    }
}

欢迎贡献

Leptos 对您如何为网站或应用程序设置样式没有意见,但我们很乐意为您试图创建的任何工具提供支持,以使其更容易。如果您正在开发想要添加到此列表中的 CSS 或样式方法,请告诉我们!