Appearance
css 助手
¥css Helper
css 助手 - hono/css
- 是 Hono 在 JS(X) 中内置的 CSS。
¥The css helper - hono/css
- is Hono's built-in CSS in JS(X).
你可以在名为 css
的 JavaScript 模板字面量中以 JSX 形式编写 CSS。css
的返回值将是类名,它设置为类属性的值。然后 <Style />
组件将包含 CSS 的值。
¥You can write CSS in JSX in a JavaScript template literal named css
. The return value of css
will be the class name, which is set to the value of the class attribute. The <Style />
component will then contain the value of the CSS.
导入
¥Import
ts
import { Hono } from 'hono'
import { css, cx, keyframes, Style } from 'hono/css'
css
实验性
¥css
Experimental
你可以在 css
模板字面量中编写 CSS。在这种情况下,它使用 headerClass
作为 class
属性的值。不要忘记添加 <Style />
,因为它包含 CSS 内容。
¥You can write CSS in the css
template literal. In this case, it uses headerClass
as a value of the class
attribute. Don't forget to add <Style />
as it contains the CSS content.
ts
app.get('/', (c) => {
const headerClass = css`
background-color: orange;
color: white;
padding: 1rem;
`
return c.html(
<html>
<head>
<Style />
</head>
<body>
<h1 class={headerClass}>Hello!</h1>
</body>
</html>
)
})
你可以使用 嵌套选择器、&
来设置伪类(如 :hover
)的样式:
¥You can style pseudo-classes like :hover
by using the nesting selector, &
:
ts
const buttonClass = css`
background-color: #fff;
&:hover {
background-color: red;
}
`
扩展
¥Extending
你可以通过嵌入类名来扩展 CSS 定义。
¥You can extend the CSS definition by embedding the class name.
tsx
const baseClass = css`
color: white;
background-color: blue;
`
const header1Class = css`
${baseClass}
font-size: 3rem;
`
const header2Class = css`
${baseClass}
font-size: 2rem;
`
此外,${baseClass} {}
的语法支持嵌套类。
¥In addition, the syntax of ${baseClass} {}
enables nesting classes.
tsx
const headerClass = css`
color: white;
background-color: blue;
`
const containerClass = css`
${headerClass} {
h1 {
font-size: 3rem;
}
}
`
return c.render(
<div class={containerClass}>
<header class={headerClass}>
<h1>Hello!</h1>
</header>
</div>
)
全局样式
¥Global styles
名为 :-hono-global
的伪选择器允许你定义全局样式。
¥A pseudo-selector called :-hono-global
allows you to define global styles.
tsx
const globalClass = css`
:-hono-global {
html {
font-family: Arial, Helvetica, sans-serif;
}
}
`
return c.render(
<div class={globalClass}>
<h1>Hello!</h1>
<p>Today is a good day.</p>
</div>
)
或者你可以在 <Style />
组件中使用 css
字面量编写 CSS。
¥Or you can write CSS in the <Style />
component with the css
literal.
tsx
export const renderer = jsxRenderer(({ children, title }) => {
return (
<html>
<head>
<Style>{css`
html {
font-family: Arial, Helvetica, sans-serif;
}
`}</Style>
<title>{title}</title>
</head>
<body>
<div>{children}</div>
</body>
</html>
)
})
keyframes
实验性
¥keyframes
Experimental
你可以使用 keyframes
写入 @keyframes
的内容。在这种情况下,fadeInAnimation
将是动画的名称
¥You can use keyframes
to write the contents of @keyframes
. In this case, fadeInAnimation
will be the name of the animation
tsx
const fadeInAnimation = keyframes`
from {
opacity: 0;
}
to {
opacity: 1;
}
`
const headerClass = css`
animation-name: ${fadeInAnimation};
animation-duration: 2s;
`
const Header = () => <a class={headerClass}>Hello!</a>
cx
实验性
¥cx
Experimental
cx
组合了两个类名。
¥The cx
composites the two class names.
tsx
const buttonClass = css`
border-radius: 10px;
`
const primaryClass = css`
background: orange;
`
const Button = () => (
<a class={cx(buttonClass, primaryClass)}>Click!</a>
)
它还可以编写简单的字符串。
¥It can also compose simple strings.
tsx
const Header = () => <a class={cx('h1', primaryClass)}>Hi</a>
与 安全标头 中间件结合使用
¥Usage in combination with Secure Headers middleware
如果要将 css 助手与 安全标头 中间件结合使用,可以将 nonce
属性 添加到 <Style nonce={c.get('secureHeadersNonce')} />
中,以避免 css 助手导致的 Content-Security-Policy。
¥If you want to use the css helpers in combination with the Secure Headers middleware, you can add the nonce
attribute to the <Style nonce={c.get('secureHeadersNonce')} />
to avoid Content-Security-Policy caused by the css helpers.
tsx
import { secureHeaders, NONCE } from 'hono/secure-headers'
app.get(
'*',
secureHeaders({
contentSecurityPolicy: {
// Set the pre-defined nonce value to `styleSrc`:
styleSrc: [NONCE],
},
})
)
app.get('/', (c) => {
const headerClass = css`
background-color: orange;
color: white;
padding: 1rem;
`
return c.html(
<html>
<head>
{/* Set the `nonce` attribute on the css helpers `style` and `script` elements */}
<Style nonce={c.get('secureHeadersNonce')} />
</head>
<body>
<h1 class={headerClass}>Hello!</h1>
</body>
</html>
)
})
提示
¥Tips
如果你使用 VS Code,则可以使用 vscode-styled-components 进行语法高亮,并使用 IntelliSense 进行 css 标记字面量。
¥If you use VS Code, you can use vscode-styled-components for Syntax highlighting and IntelliSense for css tagged literals.