当前位置: 首页 > Web前端 > vue.js

【Vue组件】自定义下拉选择器:多选、搜索、隐藏更多

时间:2023-03-31 20:31:39 vue.js

.multiple-search-select{.el-select__tags{flex-wrap:nowrap;}.el-input__inner{padding-right:5px;游标:指针;.el-select__caret{浮动:正确;颜色:#c0c??4cc;字体大小:14px;-webkit-transition:-webkit-transform0.3s;过渡:-webkit-transform0.3s;-o-transition:变换0.3s;过渡:变换0.3s;transition:transform0.3s,-webkit-transform0.3s;transition:transform0.3s,-webkit-transform0.3s;-webkit-transform:rotateZ(180deg);-ms变换:旋转(180度);变换:旋转Z(180度);游标:指针;}}.el-dropdown-menu__item:focus,.el-dropdown-menu__item:not(.is-disabled):hover{background-color:#f5f7fa;颜色:#606266;}}.search-ul-wrap{.el-input__inner{margin-left:8px;右边距:8px;宽度:94%;}}.selected{颜色:#409eff;&:after{位置:绝对;右:20px;字体系列:元素图标;内容:'\E6DA';字体大小:12px;字体粗细:700;-webkit-font-smoothing:抗锯齿;}}.el-tag.el-tag--info{margin-right:2px;float:left;}.close-icon{position:absolute;右:10px;顶部:0;颜色:#c0c??4cc;cursor:pointer;}//隐藏两个之后的所有Tag,并在第3个Tag之前显示.../deep/.el-tag.el-tag--info:nth-child(n+3){宽度:0;填充:0;高度:0;保证金:0;颜色:rgba(255、255、255、0);边框颜色:未设置;背景:无;我{显示:无;}}/deep/.el-tag.el-tag--info:nth-child(3){位置:相对;&:before{内容:'...';位置:绝对;左:4px;顶部:-12px;宽度:26px;高度:24px;填充:08px;行高:22px;字体大小:12px;背景颜色:#f4f4f5;颜色:#909399;框大小:边框框;边框:1px实心#e9e9eb;边界半径:4px;}}&::-webkit-scrollbar-track-piece{background:unset;}&::-webkit-scrollbar{width:6px;height:6px;}&::-webkit-scrollbar-thumb{transition:0.3sbackground-color;背景颜色:rgba(144、147、153、0.3);边界半径:20px;宽度:6px;高度:6px;}说明:实现一个元素样式的选择器,用于搜索单个取消,取消隐藏两个以上选中并显示...效果图:坑:一开始用的是element的多选选择器,但是element不支持隐藏选中的Tag,使用伪类样式成功实现了第四个需求。但是发现搜索根本没用,被屏蔽了。最后定制了一个组件。在交互方面,还是有很多需要注意的地方——点击选择器外部时,需要隐藏选择器;当下拉展开时,输入需要一直聚焦。一开始在input中加入了blur事件,发现无法满足这两个交互。最后监听点击事件,判断被点击的DOM是否在选择器中,从而控制失焦、聚焦显示、隐藏下拉。现实:.multiple-search-select{.el-select__tags{flex-wrap:nowrap;}.el-input__inner{padding-right:5px;游标:指针;.el-select__caret{浮动:正确;颜色:#c0c??4cc;字体大小:14px;-webkit-transition:-webkit-transform0.3s;过渡:-webkit-transform0.3s;-o-transition:变换0.3s;过渡:变换0.3s;transition:transform0.3s,-webkit-transform0.3s;transition:transform0.3s,-webkit-transform0.3s;-webkit-transform:rotateZ(180deg);-ms变换:旋转(180度);变换:旋转Z(180度);游标:指针;}}.el-dropdown-menu__item:focus,.el-dropdown-menu__item:not(.is-disabled):hover{background-color:#f5f7fa;颜色:#606266;}}.search-ul-wrap{.el-input__inner{margin-left:8px;右边距:8px;宽度:94%;}}.selected{颜色:#409eff;&:after{位置:绝对;右:20px;字体系列:元素图标;内容:'\E6DA';字体大小:12px;字体粗细:700;-webkit-font-smoothing:抗锯齿;}}.el-tag.el-tag--info{margin-right:2px;float:left;}.close-icon{position:absolute;右:10px;顶部:0;颜色:#c0c??4cc;cursor:pointer;}//隐藏两个之后的所有Tag,并在第3个Tag之前显示.../deep/.el-tag.el-tag--info:nth-child(n+3){宽度:0;填充:0;高度:0;保证金:0;颜色:rgba(255、255、255、0);边框颜色:未设置;背景:无;我{显示:无;}}/deep/.el-tag.el-tag--info:nth-child(3){位置:相对;&:before{内容:'...';位置:绝对;左:4px;顶部:-12px;宽度:26px;高度:24px;填充:08px;行高:22px;字体大小:12px;背景颜色:#f4f4f5;颜色:#909399;框大小:边框框;边框:1px实心#e9e9eb;边界半径:4px;}}&::-webkit-scrollbar-track-piece{background:unset;}&::-webkit-scrollbar{width:6px;height:6px;}&::-webkit-scrollbar-thumb{transition:0.3sbackground-color;背景颜色:rgba(144、147、153、0.3);边界半径:20px;宽度:6px;高度:6px;}