Nuxt 在样式方面非常灵活。您可以编写自己的样式,或引用本地和外部样式表。您可以使用 CSS 预处理器、CSS 框架、UI 库和 Nuxt 模块来为您的应用程序设置样式。
如果您要编写本地样式表,最自然的位置是 app/assets/ 目录。
您可以直接在页面、布局和组件中导入样式表。您可以使用 JavaScript 导入或 CSS@import 语句.
<script>
// Use a static import for server-side compatibility
import '~/assets/css/first.css'
// Caution: Dynamic imports are not server-side compatible
import('~/assets/css/first.css')
</script>
<style>
@import url("~/assets/css/second.css");
</style>
您还可以在 Nuxt 配置中使用 css 属性。样式表的自然位置是 app/assets/ 目录。然后,您可以引用其路径,Nuxt 将其包含到应用程序的所有页面中。
export default defineNuxtConfig({
css: ['~/assets/css/main.css'],
})
将您的本地字体文件放在 public/ 目录中,例如在 public/fonts 中。然后,您可以在样式表中使用 url() 引用它们。
@font-face {
font-family: 'FarAwayGalaxy';
src: url('/fonts/FarAwayGalaxy.woff') format('woff');
font-weight: normal;
font-style: normal;
font-display: swap;
}
然后,在样式表、页面或组件中按名称引用您的字体
<style>
h1 {
font-family: 'FarAwayGalaxy', sans-serif;
}
</style>
您还可以引用通过 npm 分发的样式表。让我们以流行的 animate.css 库为例。
npm install animate.css
yarn add animate.css
pnpm install animate.css
bun install animate.css
然后,您可以直接在页面、布局和组件中引用它
<script>
import 'animate.css'
</script>
<style>
@import url("animate.css");
</style>
该包也可以在 Nuxt 配置的 css 属性中作为字符串引用。
export default defineNuxtConfig({
css: ['animate.css'],
})
您可以通过在 nuxt.config 文件的 head 部分添加链接元素来在应用程序中包含外部样式表。您可以通过不同的方法实现此结果。请注意,本地样式表也可以通过这种方式包含。
您可以使用 Nuxt 配置的 app.head 属性来操作 head
export default defineNuxtConfig({
app: {
head: {
link: [{ rel: 'stylesheet', href: 'https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css' }],
},
},
})
您可以使用 useHead 可组合项在代码中动态设置 head 中的值。
useHead({
link: [{ rel: 'stylesheet', href: 'https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css' }],
})
Nuxt 在底层使用 unhead,您可以参考其完整文档.
如果您需要更高级的控制,可以使用钩子拦截渲染的 html 并通过编程方式修改 head。
在 ~/server/plugins/my-plugin.ts 中创建如下插件
export default defineNitroPlugin((nitro) => {
nitro.hooks.hook('render:html', (html) => {
html.head.push('<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css">')
})
})
外部样式表是渲染阻塞资源:它们必须在浏览器渲染页面之前加载和处理。包含不必要大样式表的网页需要更长时间才能渲染。您可以在以下位置阅读更多信息web.dev.
要使用 SCSS、Sass、Less 或 Stylus 等预处理器,请先安装它们。
npm install -D sass
npm install -D less
npm install -D stylus
编写样式表的自然位置是 app/assets 目录。然后,您可以使用预处理器的语法在 app.vue(或布局文件)中导入源文件。
<style lang="scss">
@use "~/assets/scss/main.scss";
</style>
或者,您可以使用 Nuxt 配置的 css 属性。
export default defineNuxtConfig({
css: ['~/assets/scss/main.scss'],
})
如果您需要将代码注入到预处理文件中,例如Sass 部分使用颜色变量,您可以使用 Vite 的预处理器选项.
在 app/assets 目录中创建一些局部文件
$primary: #49240F;
$secondary: #E4A79D;
$primary: #49240F
$secondary: #E4A79D
然后,在您的 nuxt.config 中
export default defineNuxtConfig({
vite: {
css: {
preprocessorOptions: {
scss: {
additionalData: '@use "~/assets/_colors.scss" as *;',
},
},
},
},
})
export default defineNuxtConfig({
vite: {
css: {
preprocessorOptions: {
sass: {
additionalData: '@use "~/assets/_colors.sass" as *\n',
},
},
},
},
})
Nuxt 默认使用 Vite。如果您希望使用 webpack,请参阅每个预处理器加载器文档.
Vite 提供了一个实验性选项可以加快预处理器的使用。
您可以在 nuxt.config 中启用此功能
export default defineNuxtConfig({
vite: {
css: {
preprocessorMaxWorkers: true, // number of CPUs minus 1
},
},
})
Vue 和 SFC 最好的地方之一是它在自然处理样式方面表现出色。您可以直接在组件文件的样式块中编写 CSS 或预处理器代码,因此您将获得出色的开发体验,而无需使用 CSS-in-JS 之类的东西。但是,如果您希望使用 CSS-in-JS,您可以找到支持它的第三方库和模块,例如pinceau.
您可以参考Vue 文档以获取有关 SFC 中组件样式的全面参考。
您可以利用 Vue SFC 功能通过类和样式属性为组件设置样式。
<script setup lang="ts">
const isActive = ref(true)
const hasError = ref(false)
const classObject = reactive({
'active': true,
'text-danger': false,
})
</script>
<template>
<div
class="static"
:class="{ 'active': isActive, 'text-danger': hasError }"
/>
<div :class="classObject" />
</template>
<script setup lang="ts">
const isActive = ref(true)
const error = ref(null)
const classObject = computed(() => ({
'active': isActive.value && !error.value,
'text-danger': error.value && error.value.type === 'fatal',
}))
</script>
<template>
<div :class="classObject" />
</template>
<script setup lang="ts">
const isActive = ref(true)
const errorClass = ref('text-danger')
</script>
<template>
<div :class="[{ active: isActive }, errorClass]" />
</template>
<script setup lang="ts">
const activeColor = ref('red')
const fontSize = ref(30)
const styleObject = reactive({ color: 'red', fontSize: '13px' })
</script>
<template>
<div :style="{ color: activeColor, fontSize: fontSize + 'px' }" />
<div :style="[baseStyles, overridingStyles]" />
<div :style="styleObject" />
</template>
请参阅Vue 文档获取更多信息。
v-bind 的动态样式您可以使用 v-bind 函数在样式块中引用 JavaScript 变量和表达式。绑定将是动态的,这意味着如果变量值发生变化,样式也将更新。
<script setup lang="ts">
const color = ref('red')
</script>
<template>
<div class="text">
hello
</div>
</template>
<style>
.text {
color: v-bind(color);
}
</style>
scoped 属性允许您独立为组件设置样式。使用此属性声明的样式将仅应用于此组件。
<template>
<div class="example">
hi
</div>
</template>
<style scoped>
.example {
color: red;
}
</style>
您可以使用CSS 模块使用 module 属性。使用注入的 $style 变量访问它。
<template>
<p :class="$style.red">
This should be red
</p>
</template>
<style module>
.red {
color: red;
}
</style>
SFC 样式块支持预处理器语法。Vite 内置支持 .scss、.sass、.less、.styl 和 .stylus 文件,无需配置。您只需先安装它们,然后它们就可以直接在 SFC 中使用 lang 属性。
<style lang="scss">
/* Write scss here */
</style>
<style lang="sass">
/* Write sass here */
</style>
<style lang="less">
/* Write less here */
</style>
<style lang="stylus">
/* Write stylus here */
</style>
您可以参考Vite CSS 文档和@vitejs/plugin-vue 文档。对于 webpack 用户,请参阅vue 加载器文档.
Nuxt 内置了 postcss。您可以在 nuxt.config 文件中配置它。
export default defineNuxtConfig({
postcss: {
plugins: {
'postcss-nested': {},
'postcss-custom-media': {},
},
},
})
为了在 SFC 中获得正确的语法高亮显示,您可以使用 postcss lang 属性。
<style lang="postcss">
/* Write postcss here */
</style>
默认情况下,Nuxt 预配置了以下插件
@import 规则url() 语句如果您需要为应用程序的不同部分设置完全不同的样式,可以使用布局。为不同的布局使用不同的样式。
<template>
<div class="default-layout">
<h1>Default Layout</h1>
<slot />
</div>
</template>
<style>
.default-layout {
color: red;
}
</style>
Nuxt 在样式方面不持特定意见,并为您提供了多种选择。您可以使用任何您想要的样式工具,例如流行的库UnoCSS或Tailwind CSS.
社区和 Nuxt 团队开发了许多 Nuxt 模块,使集成更加容易。您可以在网站的 模块部分 发现它们。以下是一些帮助您入门的模块
Nuxt 模块为您提供了开箱即用的良好开发体验,但请记住,如果您喜欢的工具没有模块,这并不意味着您不能将其与 Nuxt 一起使用!您可以为自己的项目自行配置。根据工具的不同,您可能需要使用 Nuxt 插件 和/或 制作自己的模块。如果制作了,请与社区分享!
您可以使用Nuxt Google Fonts 模块加载 Google Fonts。
如果您正在使用UnoCSS,请注意它带有一个网络字体预设方便地从常见提供商(包括 Google Fonts 等)加载字体。
Nuxt 具有与 Vue 相同的 <Transition> 元素,并且还支持实验性的 视图转换 API。
我们建议使用Fontaine来减少您的CLS。如果您需要更高级的功能,请考虑创建 Nuxt 模块来扩展构建过程或 Nuxt 运行时。
您可以执行以下操作来加快全局 CSS 文件的下载速度
如果您使用 Cloudflare、Netlify 或 Vercel 等现代平台,其中大部分应该会自动为您完成。您可以在以下位置找到 LCP 优化指南web.dev.
如果您的所有 CSS 都由 Nuxt 内联,您可以(实验性地)完全阻止在渲染的 HTML 中引用外部 CSS 文件。您可以通过钩子实现这一点,您可以将其放置在模块中,或在您的 Nuxt 配置文件中。
export default defineNuxtConfig({
hooks: {
'build:manifest': (manifest) => {
// find the app entry, css list
const css = Object.values(manifest).find(options => options.isEntry)?.css
if (css) {
// start from the end of the array and go to the beginning
for (let i = css.length - 1; i >= 0; i--) {
// if it starts with 'entry', remove it from the list
if (css[i].startsWith('entry')) {
css.splice(i, 1)
}
}
}
},
},
})