vue style样式中@import和/deep/几点说明

博客介绍了在main.js中全局引入css、less、scss等样式文件的方法,可全局覆盖。对于框架样式的全局替换可写在index.scss,修改特定组件样式可写在组件样式中或抽离公共样式文件引用。还提到改变框架组件内部样式,在有scoped时的处理方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里写自定义目录标题

import

在main.js中import全局引入的css、less、scss等样式文件,全局覆盖,代码如下:

import 'element-ui/lib/theme-chalk/index.css'
import '@/styles/index.scss'

如果对于引入的框架的样式想要做全局替换可以写在index.scss,例如
在这里插入图片描述 在这里插入图片描述
第一张图为element-ui默认table表头的样式,如果想改成下面的样式,可以在index.scss
中写如下代码

.el-table td,
.el-table th.is-leaf {
  text-align: center;
}
.el-table th.is-leaf{
  background: #f5f7fa;
  color: #333;
}

如果只是想修改某个组件的样式,可以直接写在组件样式中,如果是想抽离公共的样式文件,在特定组件引用则可利用以下方式:

@import "style.css";
@import url("style.css");

这2中语法应该是没什么区别,但是个人在实际使用中发现使用上面一种情况有时会报模块找不到的情况,但是相同的路径用下面这种就会引用成功,至于为什么个人目前也不知道。
这里要特别说明的一点就是,引入的时候要直接引入在样式的最上面,即

<style type="text/css">
  @import "import.css";
  .hd{
    color: orange;
  }
</style>
...
<p class="hd">我是什么颜色</p>

/deep/

如果想改变框架组件的内部样式文件,如果在样式中加了scoped中的,可以在要修改的样式类名前面加/deep/,例如:

/deep/.el-dialog__footer {
  border-top: none; 
  padding: 10px 20px 20px
}
<template> <div class="login-container"> <CustomForm class="login-form"> <CustomFormItem label="账号"> <CustomInput v-model="form.employeeId" placeholder="请输入账号" @blur="validateEmployeeId" /> </CustomFormItem> <CustomFormItem label="密码"> <CustomInput v-model="form.password" type="password" placeholder="请输入密码" :show-password="true" @blur="validatePassword" /> </CustomFormItem> <CustomFormItem> <button class="custom-button" @click.prevent="onSubmit" :disabled="loading"> <span v-if="!loading">提交</span> <span v-else class="loading">登录中...</span> </button> </CustomFormItem> <CustomFormItem v-if="errorMessage" class="error-container"> <div class="error-message"> {{ errorMessage }} </div> </CustomFormItem> </CustomForm> </div> </template> <script setup> import { ref, reactive } from 'vue' import { useRouter } from 'vue-router' import useUserStore from '@/store/modules/user' import productApi from '@/api/products' import CustomInput from '@/components/zhangaipiao/customInput.vue' import CustomForm from '@/components/zhangaipiao/customForm.vue' import CustomFormItem from '@/components/zhangaipiao/customFormItem.vue' const userStore = useUserStore() const router = useRouter() const loading = ref(false) const errorMessage = ref('') const form = reactive({ employeeId: '', password: '', role: '', employeeName: '' }) // 记录用户是否触碰过输入框,用于控制错误提示是否显示 const touched = reactive({ employeeId: false, password: false }) // 字段验证规则 const rules = { employeeId: { required: true, message: '账号不能为空' }, password: { required: true, message: '密码不能为空' } } // 字段错误信息 const errors = reactive({ employeeId: '', password: '' }) const validateField = (field) => { const rule = rules[field] const value = form[field] if (rule && rule.required && (!value || !value.trim())) { errors[field] = rule.message return false } errors[field] = '' return true } const validateForm = () => { // 标记所有字段为已触碰 Object.keys(touched).forEach(key => { touched[key] = true }) // 验证所有字段 const validResults = Object.keys(rules).map(field => validateField(field)) return validResults.every(result => result) } const onSubmit = async () => { if (!validateForm()) { errorMessage.value = '请填写账号密码' return } errorMessage.value = '' loading.value = true try { const userData = await loginWithBackend() userStore.login({ ...userData, employeeId: form.employeeId }) router.push('home') } catch (error) { errorMessage.value = error.message } finally { loading.value = false } } const loginWithBackend = async () => { try { const response = await productApi.selectLogin(form) if (response?.status === 200 && response.data) { return response.data } throw new Error(response?.message || '登录失败,请检查账号密码') } catch (error) { throw new Error(error.message || '网络错误,请稍后再试') } } </script> <style scoped src="@/assets/styles.css"></style> <style scoped> :deep(.form-item) { margin-bottom: 0.5rem; } .login-container { display: flex; min-height: 100vh; background-color: #e0f7ff; /* 浅蓝色背景 */ } </style> 详细解释代码
最新发布
07-25
D:\financial-ui\financial-ui\src\views\setting\PermissionSetting\UserForm.vue 73 | prop: "avatar", 74 | cellRenderer: ({ row }) => ( 75 | <vxe-image src={row.avatar || userAvatar} class="w-[24px] h-[24px] rounded-full align-middle object-fill" show-preview={true}></vxe-image> | ^ 76 | ), 77 | width: 90 @ ./src/views/setting/PermissionSetting/UserForm.vue?vue&type=script&setup=true&lang=js 1:0-307 1:0-307 1:308-604 1:308-604 @ ./src/views/setting/PermissionSetting/UserForm.vue 2:0-70 3:0-65 3:0-65 8:49-55 @ ./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./node_modules/windicss-webpack-plugin/dist/loaders/windicss-template.cjs!./src/views/setting/PermissionSetting/AddUser.vue?vue&type=script&setup=true&lang=js 11:0-70 94:19-27 179:16-24 @ ./src/views/setting/PermissionSetting/AddUser.vue?vue&type=script&setup=true&lang=js 1:0-306 1:0-306 1:307-602 1:307-602 @ ./src/views/setting/PermissionSetting/AddUser.vue 2:0-69 3:0-64 3:0-64 6:49-55 @ ./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[0]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./node_modules/windicss-webpack-plugin/dist/loaders/windicss-template.cjs!./src/views/setting/PermissionSetting.vue?vue&type=script&lang=js 6:0-68 39:19-26 @ ./src/views/setting/PermissionSetting.vue?vue&type=script&lang=js 1:0-296 1:0-296 1:297-582 1:297-582 @ ./src/views/setting/PermissionSetting.vue 2:0-68 3:0-63 3:0-63 6:49-55 @ ./src/router.js 89:11-58 @ ./src/main.js 16:0-30 31:80-86
03-22
error in ./src/components/index/IndexAsideStatic.vue?vue&type=style&index=0&id=0175fa3e&lang=scss&scoped=true& Module build failed (from ./node_modules/sass-loader/dist/cjs.js): Error: Cannot find module 'node-sass' Require stack: - E:\bishezuihzongban\daima\admin\node_modules\sass-loader\dist\getDefaultSassImplementation.js - E:\bishezuihzongban\daima\admin\node_modules\sass-loader\dist\getSassImplementation.js - E:\bishezuihzongban\daima\admin\node_modules\sass-loader\dist\index.js - E:\bishezuihzongban\daima\admin\node_modules\sass-loader\dist\cjs.js - E:\bishezuihzongban\daima\admin\node_modules\loader-runner\lib\loadLoader.js - E:\bishezuihzongban\daima\admin\node_modules\loader-runner\lib\LoaderRunner.js - E:\bishezuihzongban\daima\admin\node_modules\webpack\lib\NormalModule.js - E:\bishezuihzongban\daima\admin\node_modules\webpack\lib\NormalModuleFactory.js - E:\bishezuihzongban\daima\admin\node_modules\webpack\lib\Compiler.js - E:\bishezuihzongban\daima\admin\node_modules\webpack\lib\webpack.js - E:\bishezuihzongban\daima\admin\node_modules\@vue\cli-service\lib\commands\serve.js - E:\bishezuihzongban\daima\admin\node_modules\@vue\cli-service\lib\Service.js - E:\bishezuihzongban\daima\admin\node_modules\@vue\cli-service\bin\vue-cli-service.js at Function.Module._resolveFilename (internal/modules/cjs/loader.js:931:15) at Function.Module._load (internal/modules/cjs/loader.js:774:27) at Module.require (internal/modules/cjs/loader.js:1003:19) at require (internal/modules/cjs/helpers.js:107:18) at getDefaultSassImplementation (E:\bishezuihzongban\daima\admin\node_modules\sass-loader\dist\getDefaultSassImplementation.js:24:10) at getSassImplementation (E:\bishezuihzongban\daima\admin\node_modules\sass-loader\dist\getSassImplementation.js:19:72) at Object.loader (E:\bishezuihzongban\daima\admin\node_modules\sass-loader\dist\index.js:40:61) @ ./node_modules/vue-style-loader??ref--8-oneOf-1-0!./node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/ postcss-loader/src??ref--8-oneOf-1-2!./node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/index/IndexAsideStatic.vue?vue&type=style&index=0&id=0175fa3e&lang=scss&scoped=true& 4:14-489 14:3-18:5 15:22-497 @ ./src/components/index/IndexAsideStatic.vue?vue&type=style&index=0&id=0175fa3e&lang=scss&scoped=true& @ ./src/components/index/IndexAsideStatic.vue @ ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/views/index.vue?vue&type=script&lang=js& @ ./src/views/index.vue?vue&type=script&lang=js& @ ./src/views/index.vue @ ./src/router/router-static.js @ ./src/main.js @ multi (webpack)-dev-server/client?http://172.20.10.6:8081/sockjs-node (webpack)/hot/dev-server.js ./src/main.js
06-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值