当前位置: 首页 > news >正文

基础篇四 Nuxt4 全局样式与 CSS 模块

文章目录

    • 一、全局样式
    • 二、CSS 变量与主题切换
    • 三、Scoped CSS
    • 四、CSS Modules
    • 五、Tailwind CSS
    • 六、UnoCSS
    • 七、预处理器支持
    • 八、PostCSS 配置
    • 九、动态样式
    • 总结

写 CSS 看起来简单,但项目大了问题就来了:类名冲突、样式覆盖、主题切换……Nuxt 提供了多种样式管理方案,今天我们来梳理一下最佳实践。

一、全局样式

全局样式放在assetscss目录,在nuxt.config.ts中引入:

exportdefaultdefineNuxtConfig({css:['~/assets/css/main.css','~/assets/css/reset.css']})

创建assets/css/main.css

/* 全局变量 */:root{--primary-color:#00dc82;--text-color:#333;--bg-color:#fff;--border-radius:4px;}/* 暗色主题 */.dark{--primary-color:#00b36b;--text-color:#fff;--bg-color:#1a1a1a;}/* 全局基础样式 */body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;color:var(--text-color);background-color:var(--bg-color);line-height:1.6;}a{color:var(--primary-color);text-decoration:none;}a:hover{text-decoration:underline;}

二、CSS 变量与主题切换

CSS 变量让主题切换变得简单:

<script setup lang="ts"> const isDark = ref(false) const toggleTheme = () => { isDark.value = !isDark.value document.documentElement.classList.toggle('dark', isDark.value) } // 初始化时检查系统主题 onMounted(() => { isDark.value = window.matchMedia('(prefers-color-scheme: dark)').matches document.documentElement.classList.toggle('dark', isDark.value) }) </script> <template> <button @click="toggleTheme"> {{ isDark ? '🌙' : '☀️' }} </button> </template>

配合@nuxtjs/color-mode模块更方便:

pnpmadd@nuxtjs/color-mode
// nuxt.config.tsexportdefaultdefineNuxtConfig({modules:['@nuxtjs/color-mode']})
<script setup lang="ts"> const colorMode = useColorMode() const toggleTheme = () => { colorMode.preference = colorMode.value === 'dark' ? 'light' : 'dark' } </script> <template> <button @click="toggleTheme"> {{ colorMode.value === 'dark' ? '🌙' : '☀️' }} </button> </template>

三、Scoped CSS

组件内的样式使用scoped避免污染:

<template> <div class="card"> <h2 class="title">标题</h2> <p class="content">内容</p> </div> </template> <style scoped> .card { border: 1px solid #eee; border-radius: var(--border-radius); padding: 1rem; } .title { color: var(--primary-color); margin-bottom: 0.5rem; } .content { color: var(--text-color); } </style>

scoped会给样式加上唯一的属性选择器,不会影响其他组件。

四、CSS Modules

想要更严格的类名隔离,用 CSS Modules:

<script setup lang="ts"> import styles from './ArticleCard.module.css' </script> <template> <article :class="styles.card"> <h2 :class="styles.title">文章标题</h2> <p :class="styles.content">文章内容</p> </article> </template>

ArticleCard.module.css

.card{border:1px solid #eee;padding:1rem;}.title{color:#333;}.content{color:#666;}

编译后类名会变成_card_abc123这样的唯一值。

五、Tailwind CSS

Nuxt 对 Tailwind 支持很好:

pnpmadd-D@nuxtjs/tailwindcss
// nuxt.config.tsexportdefaultdefineNuxtConfig({modules:['@nuxtjs/tailwindcss'],tailwindcss:{cssPath:'~/assets/css/tailwind.css',configPath:'tailwind.config.ts'}})

创建tailwind.config.ts

importtype{Config}from'tailwindcss'exportdefault{content:['./components/**/*.{js,vue,ts}','./layouts/**/*.vue','./pages/**/*.vue','./plugins/**/*.{js,ts}','./app.vue'],theme:{extend:{colors:{primary:'#00dc82'}}}}satisfies Config

现在可以直接用 Tailwind 类名:

<template> <div class="p-4 border rounded-lg"> <h1 class="text-2xl font-bold text-primary">标题</h1> <p class="text-gray-600 mt-2">内容</p> <button class="mt-4 px-4 py-2 bg-primary text-white rounded hover:opacity-80"> 按钮 </button> </div> </template>

六、UnoCSS

UnoCSS 是原子化 CSS 引擎,比 Tailwind 更快:

pnpmadd-D@unocss/nuxt
// nuxt.config.tsexportdefaultdefineNuxtConfig({modules:['@unocss/nuxt']})

创建uno.config.ts

import{defineConfig,presetUno,presetAttributify,presetIcons}from'unocss'exportdefaultdefineConfig({presets:[presetUno(),presetAttributify(),presetIcons()]})

使用方式和 Tailwind 类似:

<template> <div p-4 border rounded-lg> <h1 text-2xl font-bold text-primary>标题</h1> <button mt-4 px-4 py-2 bg-primary text-white rounded hover:opacity-80> 按钮 </button> </div> </template>

七、预处理器支持

Nuxt 支持 Sass、Less、Stylus 等预处理器:

pnpmadd-Dsass

使用:

<style scoped lang="scss"> $primary: #00dc82; .card { border: 1px solid #eee; .title { color: $primary; &:hover { opacity: 0.8; } } .content { color: #666; } } </style>

全局 Sass 变量,创建assets/css/variables.scss

$primary: #00dc82; $text-color: #333;

nuxt.config.ts配置:

exportdefaultdefineNuxtConfig({vite:{css:{preprocessorOptions:{scss:{additionalData:'@use "~/assets/css/variables.scss" as *;'}}}}})

现在所有组件都能直接用这些变量:

<style scoped lang="scss"> .title { color: $primary; // 直接使用,无需 import } </style>

八、PostCSS 配置

Nuxt 内置了 PostCSS,可以添加插件:

// nuxt.config.tsexportdefaultdefineNuxtConfig({postcss:{plugins:{'postcss-nested':{},// 支持嵌套'autoprefixer':{}// 自动添加前缀(默认已开启)}}})

九、动态样式

根据状态动态改变样式:

<script setup lang="ts"> const theme = ref({ primary: '#00dc82', fontSize: '14px' }) const styleVars = computed(() => ({ '--primary': theme.value.primary, '--font-size': theme.value.fontSize })) </script> <template> <div :style="styleVars" class="container"> <p class="text">这段文字会根据主题变化</p> <button @click="theme.primary = '#ff0000'">换成红色</button> </div> </template> <style scoped> .text { color: var(--primary); font-size: var(--font-size); } </style>

总结

样式管理方案对比:

方案特点适用场景
全局 CSS简单直接基础样式、变量
Scoped CSSVue 原生支持组件内部样式
CSS Modules类名隔离严格大型项目
Tailwind/UnoCSS原子化、快速快速开发
Sass/Less变量、嵌套复杂样式需求

推荐组合:全局 CSS 变量 + Scoped CSS + Tailwind(可选)

下一篇聊聊静态资源管理,让你的图片、字体管理更规范。

相关文章

入门篇三:Nuxt4组件自动导入:写代码少敲一半字

入门篇二:Nuxt 4路由自动生成:告别手动配置路由的日子

延伸阅读

nuxt4完整系列,持续更新中。。,欢迎来逛逛


内容有帮助?点赞、收藏、关注三连!评论区等你 💪

http://www.cnnetsun.cn/news/1804461.html

相关文章:

  • Mermaid图表引擎:文本驱动可视化的技术架构与工程实践
  • Windows系统下OmniParser V2保姆级安装教程(含权重文件下载避坑指南)
  • PoeCharm深度解析:打造你的流放之路角色构建专家
  • 终极指南:使用DeepSORT和YOLOv5实现实时多目标跟踪
  • 从混乱到有序:用pd.to_numeric()高效清洗数据中的数字陷阱
  • SAP AA 事务代码AFAB报错“AA687”的深度解析与实战解决方案
  • 三维ins和卫星组合导航、卡尔曼滤波+ESKF滤波Matlab仿真对比
  • 突破Cursor API限制:cursor-free-vip架构解密与设备指纹重构技术深度解析
  • 探索视觉框架VM PRO 2.7:强大功能与实践指南
  • 诗词在线平台技术拆解与实践
  • Elasticsearch-01篇(单机版避坑指南)
  • 用Cursor从零撸一个运费管理系统:Vue3+SpringBoot实战避坑全记录
  • Qwen3.6-Plus,不只是更强一点:它正在把大模型推向“真实世界 Agent”
  • NVIDIA显卡风扇控制难题:从硬件限制到智能散热优化的完整方案
  • DRV8701实战:如何为你的智能车电机选择合适的MOSFET和采样电阻?(附型号推荐清单)
  • 2026届毕业生推荐的AI辅助论文平台实际效果
  • 为什么97%的AI项目死于交付?——20年DevOps老兵亲授AI原生研发的3道生死防火墙
  • 芯片互连的“速度革命”:铜互连为何能替代铝,成为高端芯片标配?
  • LangChain+RexUniNLU:构建知识增强型对话系统
  • 3分钟快速上手:GetQzonehistory帮你永久保存QQ空间记忆
  • 嵌入式AI语音识别突破:sherpa-onnx在RK3566上的实战部署与性能优化
  • 如何解决ComfyUI BrushNet维度冲突:5个高效技巧实现完美图像修复
  • Kotlin + Compose Flow State 手册
  • AI辅助技术:企业数字化转型的关键驱动力与实践指南
  • 动漫爱好者福音:Flux2 Klein写实转换,让你的角色活起来
  • 从仿真到实物:基于Multisim 12的直流稳压电源设计与实现
  • 低查重AI教材生成工具,快速编写专业教材,提升教学资料产出效率!
  • AI教材生成神器登场!快速编写教材,轻松搞定低查重难题
  • 华中科技大学毕业论文LaTeX模板:终极完整使用指南
  • LrcHelper:3步搞定网易云音乐双语歌词下载,索尼Walkman用户必看!