Vue|Vue 自定义下拉选择器(多选、搜索、隐藏更多)
需求描述:
- 实现一个element样式的选择器
- 搜索
- 单个取消,全部取消
- 隐藏两个以上的已选并显示...
文章图片
坑: 一开始使用element的多选选择器,但是element不支持隐藏已选Tag,使用了伪类样式成功实现第4个需求。但是发现搜索根本用不了,被挡住了。最后还是自定义了一个组件。
在交互上,还有很多需要注意的——当点击选择器以外时,需要隐藏选择器;下拉展开时,input需要一直聚焦的。一开始在input中加入blur事件,发现无法满足这两个交互。最后监听点击事件,判断点击的DOM是否在选择器中,以此控制失焦、聚焦和展示、隐藏下拉。
实现:
{{ item.label }}
.multiple-search-select {
.el-select__tags {
flex-wrap: nowrap;
}
.el-input__inner {
padding-right: 5px;
cursor: pointer;
.el-select__caret {
float: right;
color: #c0c4cc;
font-size: 14px;
-webkit-transition: -webkit-transform 0.3s;
transition: -webkit-transform 0.3s;
-o-transition: transform 0.3s;
transition: transform 0.3s;
transition: transform 0.3s, -webkit-transform 0.3s;
transition: transform 0.3s, -webkit-transform 0.3s;
-webkit-transform: rotateZ(180deg);
-ms-transform: rotate(180deg);
transform: rotateZ(180deg);
cursor: pointer;
}
}
.el-dropdown-menu__item:focus,
.el-dropdown-menu__item:not(.is-disabled):hover {
background-color: #f5f7fa;
color: #606266;
}
}
.search-ul-wrap {
.el-input__inner {
margin-left: 8px;
margin-right: 8px;
width: 94%;
}
}
.selected {
color: #409eff;
&:after {
position: absolute;
right: 20px;
font-family: element-icons;
content: '\E6DA';
font-size: 12px;
font-weight: 700;
-webkit-font-smoothing: antialiased;
}
}
.el-tag.el-tag--info {
margin-right: 2px;
float: left;
}
.close-icon {
position: absolute;
right: 10px;
top: 0;
color: #c0c4cc;
cursor: pointer;
}
// 隐藏两个之后的所有Tag,并在第三个Tag之前展示...
/deep/ .el-tag.el-tag--info:nth-child(n + 3) {
width: 0;
padding: 0;
height: 0;
margin: 0;
color: rgba(255, 255, 255, 0);
border-color: unset;
background: none;
i {
display: none;
}
}
/deep/ .el-tag.el-tag--info:nth-child(3) {
position: relative;
&:before {
content: '...';
position: absolute;
left: 4px;
top: -12px;
width: 26px;
height: 24px;
padding: 0 8px;
line-height: 22px;
font-size: 12px;
background-color: #f4f4f5;
color: #909399;
box-sizing: border-box;
border: 1px solid #e9e9eb;
border-radius: 4px;
}
}&::-webkit-scrollbar-track-piece {
background: unset;
}
&::-webkit-scrollbar {
width: 6px;
height: 6px;
}
&::-webkit-scrollbar-thumb {
transition: 0.3s background-color;
background-color: rgba(144, 147, 153, 0.3);
border-radius: 20px;
width: 6px;
height: 6px;
}
推荐阅读
- vue-cli|vue-cli 3.x vue.config.js 配置
- 2020-04-07vue中Axios的封装和API接口的管理
- SpringBoot调用公共模块的自定义注解失效的解决
- python自定义封装带颜色的logging模块
- 列出所有自定义的function和view
- tableView|tableView 头视图下拉放大 重写
- VueX--VUE核心插件
- vue组件中为何data必须是一个函数()
- 用npm发布一个包的教程并编写一个vue的插件发布
- Spring|Spring Boot 自动配置的原理、核心注解以及利用自动配置实现了自定义 Starter 组件