# Vue3 el-drawer 表格输入框样式问题

> **问题标签**: `vue3`, `element-plus`, `drawer`, `table`, `input`, `style`, `background`  
> **框架**: Vue3  
> **严重程度**: 中等（UI 不符合预期）

---

## 🔍 问题识别

### 用户描述关键词
- "drawer 里的输入框背景色不对"
- "输入框在抽屉中样式异常"
- "禁用状态和启用状态背景一样"
- "表格中的输入框透明"

### 问题特征
- [ ] el-drawer 中的 el-table 内，el-input/el-select 样式异常
- [ ] 禁用和启用状态背景色一样
- [ ] 输入框边框丢失或显示异常
- [ ] 使用了硬编码颜色（如 `#fff`）

---

## 🎯 核心原理

**根本原因**：el-drawer 中的表格输入控件需要特殊处理，区分禁用/启用状态，并使用 CSS 变量适配主题。

### 问题代码模式

```scss
// ❌ 错误：硬编码颜色，不区分状态
.el-input__wrapper {
  background-color: #fff !important;  // 导致所有状态都是白色
}

// ❌ 错误：全局覆盖
.el-input__wrapper {
  background-color: transparent !important;  // 导致所有输入框透明
}
```

---

## ✅ 正确解决方案

### 使用 CSS 变量 + 状态选择器

```vue
<style scoped lang="scss">
:deep(.el-drawer) {
  .el-table__body {
    // 禁用状态：透明背景，无边框
    .el-input__wrapper,
    .el-select .el-input__wrapper {
      background-color: transparent !important;
      box-shadow: none !important;
    }
    
    // 启用状态：使用 CSS 变量适配主题
    .el-input:not(.is-disabled) .el-input__wrapper,
    .el-select:not(.is-disabled) .el-input__wrapper {
      background-color: var(--el-fill-color-blank) !important;
      box-shadow: 0 0 0 1px var(--el-border-color) inset !important;
    }
    
    // 聚焦状态
    .el-input:not(.is-disabled).is-focus .el-input__wrapper,
    .el-select:not(.is-disabled).is-focus .el-input__wrapper {
      box-shadow: 0 0 0 1px var(--el-color-primary) inset !important;
    }
  }
}
</style>
```

### CSS 变量说明

| CSS 变量 | 说明 | 默认值（浅色主题） |
|----------|------|--------------------|
| `--el-fill-color-blank` | 空白填充色 | `#ffffff` |
| `--el-border-color` | 边框颜色 | `#dcdfe6` |
| `--el-color-primary` | 主题色 | `#409eff` |
| `--el-text-color-disabled` | 禁用文字色 | `#a8abb2` |

### 完整示例

```vue
<template>
  <el-drawer v-model="visible" :title="$t('编辑数据')" size="60%">
    <el-table :data="list" border>
      <el-table-column :label="$t('名称')" prop="name">
        <template #default="{ row }">
          <el-input v-model="row.name" :disabled="editR" :placeholder="$t('请输入')" />
        </template>
      </el-table-column>
      
      <el-table-column :label="$t('类型')" prop="type">
        <template #default="{ row }">
          <el-select v-model="row.type" :disabled="editR" :placeholder="$t('请选择')">
            <el-option :label="$t('类型A')" value="A" />
            <el-option :label="$t('类型B')" value="B" />
          </el-select>
        </template>
      </el-table-column>
    </el-table>
  </el-drawer>
</template>

<script setup lang="ts">
import { ref } from 'vue'

const visible = ref(false)
const editR = ref(false)  // false=编辑模式, true=查看模式
const list = ref([
  { name: '测试1', type: 'A' },
  { name: '测试2', type: 'B' }
])
</script>

<style scoped lang="scss">
:deep(.el-drawer) {
  .el-table__body {
    // 禁用状态：透明背景，无边框
    .el-input__wrapper,
    .el-select .el-input__wrapper {
      background-color: transparent !important;
      box-shadow: none !important;
    }
    
    // 启用状态：使用 CSS 变量适配主题
    .el-input:not(.is-disabled) .el-input__wrapper,
    .el-select:not(.is-disabled) .el-input__wrapper {
      background-color: var(--el-fill-color-blank) !important;
      box-shadow: 0 0 0 1px var(--el-border-color) inset !important;
    }
  }
}
</style>
```

---

## ❌ 常见错误排查路线（避免重复）

| 尝试方向 | 为什么无效 | 浪费时间 |
|----------|-----------|---------|
| 硬编码 `#fff` | 不适配暗色主题，所有状态一样 | 2-3 轮 |
| 全局覆盖 `.el-input__wrapper` | 影响其他页面的输入框 | 3-5 轮 |
| 不区分 `.is-disabled` | 禁用和启用状态样式一样 | 2-4 轮 |
| 使用 `style="..."` 内联样式 | 无法适配主题，优先级问题 | 1-2 轮 |

---

## 📋 样式检查清单

**在 el-drawer 中使用表格输入框时，必须确认：**

- [ ] 使用 CSS 变量（`var(--el-xxx)`）而非硬编码颜色
- [ ] 区分禁用状态（`.is-disabled`）和启用状态
- [ ] 使用 `:deep()` 穿透 scoped 样式
- [ ] 限定作用域（`.el-drawer .el-table__body`）不影响其他组件
- [ ] 禁用状态：透明背景 + 无边框
- [ ] 启用状态：白色背景 + 边框

---

## 📁 适用场景

- ✅ el-drawer 中的表格编辑功能
- ✅ 需要区分禁用/启用状态的输入框
- ✅ 需要适配浅色/暗色主题
- ✅ 表格内嵌 el-input、el-select、el-date-picker 等

---

## 🔗 相关案例

- [table-编辑取消.md](./table-编辑取消.md) - 表格编辑取消逻辑
- [table-边框问题.md](./table-边框问题.md) - 表格边框样式
- [style-优先级问题.md](./style-优先级问题.md) - 样式优先级问题
