Element UI中日期选择日(date-picker)等其他选择器下拉显示错位、位置错误解决

省流版

给选择器加上唯一key(下面的想看就看)

问题复现

需求是用一个下拉切换时间维度的选择,分别为年度、季度、月度,但是开发的时候发现,当切换的时候,视图可正常切换,但点击选择时却发现选择器跑到了左上角,代码和问题截图如下:
日期选择器跑到左上角
问题代码:

      <el-form inline>
        <el-form-item label="统计维度">
          <el-select size="small" style="width: 80px;" v-model="timeCategory">
            <el-option :value="item.value" :label="item.label" v-for="item in timeCategoryOption"></el-option>
          </el-select>
        </el-form-item>
        <el-form-item v-if="timeCategory===0" label="年度选择">
          <el-date-picker type="year" format="yyyy年" value-format="yyyy-01-01 00:00:00, yyyy-12-31 23:59:59" v-model="topChooseTime" style="width: 150px;" size="small"></el-date-picker>
        </el-form-item>
        <el-form-item v-if="timeCategory===1" label="季度选择">
          <el-select v-model="topChooseTime">
            <el-option :value="item.value" :label="item.label" v-for="item in quarterOption"></el-option>
          </el-select>
        </el-form-item>
        <el-form-item v-if="timeCategory===2" label="月度选择">
          <el-date-picker type="monthrange" value-format="yyyy-MM-dd" v-model="topChooseTime" style="width: 180px;" size="small"></el-date-picker>
        </el-form-item>
      </el-form>

BUG产生原因及思路:

  • 原来想着这样的原因可能是v-if导致的,我们知道v-if是操作dom树进行显示/隐藏的控制,切换为另一个组件时我想可能是找不到ref或者id之类的东西,所以改成v-show。
  • 但是尝试发现,改成v-show确实能够解决位置偏移问题,但由于共用了一个绑定值,并且切换时是不同的组件类型,elementUI封装的一些方法会找不到报错,所以改成v-show对于我这种情况不可行。
  • 后来查找资料发现,可以给选择器加一个唯一的key,即可解决这个问题,代码如下:
      <el-form inline>
        <el-form-item label="统计维度">
          <el-select size="small" style="width: 80px;" v-model="timeCategory">
            <el-option :value="item.value" :label="item.label" v-for="item in timeCategoryOption"></el-option>
          </el-select>
        </el-form-item>
        <el-form-item v-if="timeCategory===0" label="年度选择">
          <el-date-picker type="year" key="yearSelect" format="yyyy年" value-format="yyyy-01-01 00:00:00, yyyy-12-31 23:59:59" v-model="topChooseTime" style="width: 150px;" size="small"></el-date-picker>
        </el-form-item>
        <el-form-item v-if="timeCategory===1" label="季度选择">
          <el-select v-model="topChooseTime" key="quarterSelect">
            <el-option :value="item.value" :label="item.label" v-for="item in quarterOption"></el-option>
          </el-select>
        </el-form-item>
        <el-form-item v-if="timeCategory===2" label="月度选择">
          <el-date-picker type="monthrange" key="monthrange" value-format="yyyy-MM-dd" v-model="topChooseTime" style="width: 180px;" size="small"></el-date-picker>
        </el-form-item>
      </el-form>
<think>好的,我现在要解决的问题是如何将Element UI中的el-date-picker组件的样式改为圆形边框。根据用户提供的引用内容,我需要回顾之前的解决方案,看看是否有适用的方法。 首先,用户提到使用/deep/无法修改el-date-picker的样式,因为该组件将元素挂载到body下,而不是组件内部。这时候,引用[1]和[2]指出可以使用popper-class属性来给下拉框添加自定义类名,然后通过CSS来修改样式。而用户现在想要的是圆角边框,可能需要同时修改输入框本身和下拉面板的样式。 输入框部分属于组件内部的结构,但可能因为作用域的问题,普通的scoped样式无法穿透。根据引用[4],可能需要使用样式穿透的方法,比如在Vue中使用::v-deep或者/deep/,但由于el-date-picker的部分元素在body下,可能需要全局样式或者结合popper-class。 接下来,我需要确定如何定位到el-date-picker的输入框元素。通常,输入框的类名可能包含.el-input__inner,所以可以尝试通过这个类名来修改边框样式。但要注意,可能需要使用!important来覆盖Element UI的默认样式。 对于下拉面板,使用popper-class属性添加自定义类名,比如“round-picker”,然后在样式中针对这个类名下的元素设置圆角边框。引用[3]中提到了使用popper-class来修改弹出窗的样式,这同样适用于下拉面板的边框。 另外,用户可能需要同时修改输入框和下拉面板的边框,所以需要分两部分处理:输入框部分使用全局样式或穿透,下拉面板使用popper-class。同时,要注意样式的优先级和是否正确应用。 最后,验证步骤需要检查是否应用了自定义类名,样式是否被正确加载,以及是否有其他样式冲突导致圆角不生效。如果仍然有问题,可能需要更具体的选择器或调整样式的顺序。</think>要将Element UI的$el-date-picker$组件样式改为圆形边框,需分两步处理输入框和下拉面板。具体操作步骤如下: ### 一、修改输入框圆角样式 ```vue <style scoped> /* 穿透修改输入框 */ ::v-deep .el-date-editor.el-input { --radius: 20px; .el-input__inner { border-radius: var(--radius) !important; } /* 清除图标区域的直角 */ .el-input__suffix { border-radius: 0 var(--radius) var(--radius) 0; } } </style> ``` $$ border-radius = \frac{\text{圆角尺寸}}{\text{输入框高度}} \times 100\% $$ 当输入框高度为32px时,设置20px圆角可达到圆形效果[^4] ### 二、修改下拉面板圆角 1. 添加自定义类名 ```vue <el-date-picker popper-class="round-date-picker" v-model="date" /> ``` 2. 创建全局样式文件 ```css /* round-date.css */ .round-date-picker { border-radius: 12px !important; overflow: hidden; .el-picker-panel__body { border-radius: 12px; } .el-date-table th { border-radius: 8px; } } ``` ### 三、最终效果验证 | 组件部位 | 样式特征 | 验证方法 | |---------|---------|---------| | 输入框 | 左右完全圆角 | 检查元素computed样式 | | 下拉面板 | 整体圆角+单元格圆角 | 交互后目视检查 | | 时间选择 | 无布局错位 | 选择不同期测试 |
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值