作者 若依
提交者 Gitee

!695 下拉图标选择组件优化:1.已选择图标高亮回显 2.滚动条采用el-scrollbar

Merge pull request !695 from 绿色心情/icon-select
1 #app { 1 #app {
2 2
3 .main-container { 3 .main-container {
4 - min-height: 100%; 4 + height: 100%;
5 transition: margin-left .28s; 5 transition: margin-left .28s;
6 margin-left: $base-sidebar-width; 6 margin-left: $base-sidebar-width;
7 position: relative; 7 position: relative;
1 <!-- @author zhengjie --> 1 <!-- @author zhengjie -->
2 <template> 2 <template>
3 <div class="icon-body"> 3 <div class="icon-body">
4 - <el-input v-model="name" style="position: relative;" clearable placeholder="请输入图标名称" @clear="filterIcons" @input="filterIcons"> 4 + <el-input v-model="name" class="icon-search" clearable placeholder="请输入图标名称" @clear="filterIcons" @input="filterIcons">
5 <i slot="suffix" class="el-icon-search el-input__icon" /> 5 <i slot="suffix" class="el-icon-search el-input__icon" />
6 </el-input> 6 </el-input>
7 <div class="icon-list"> 7 <div class="icon-list">
8 - <div v-for="(item, index) in iconList" :key="index" @click="selectedIcon(item)">  
9 - <svg-icon :icon-class="item" style="height: 30px;width: 16px;" />  
10 - <span>{{ item }}</span> 8 + <el-scrollbar>
  9 + <div class="list-container">
  10 + <div v-for="(item, index) in iconList" class="icon-item-wrapper" :key="index" @click="selectedIcon(item)">
  11 + <div :class="['icon-item', { active: activeIcon === item }]">
  12 + <svg-icon :icon-class="item" class-name="icon" style="height: 30px;width: 16px;" />
  13 + <span :title="item">{{ item }}</span>
11 </div> 14 </div>
12 </div> 15 </div>
13 </div> 16 </div>
  17 + </el-scrollbar>
  18 + </div>
  19 + </div>
14 </template> 20 </template>
15 21
16 <script> 22 <script>
17 import icons from './requireIcons' 23 import icons from './requireIcons'
18 export default { 24 export default {
19 name: 'IconSelect', 25 name: 'IconSelect',
  26 + props: {
  27 + activeIcon: {
  28 + type: String
  29 + }
  30 + },
20 data() { 31 data() {
21 return { 32 return {
22 name: '', 33 name: '',
@@ -46,22 +57,55 @@ export default { @@ -46,22 +57,55 @@ export default {
46 .icon-body { 57 .icon-body {
47 width: 100%; 58 width: 100%;
48 padding: 10px; 59 padding: 10px;
  60 + .icon-search {
  61 + position: relative;
  62 + margin-bottom: 5px;
  63 + }
49 .icon-list { 64 .icon-list {
50 height: 200px; 65 height: 200px;
51 - overflow-y: scroll;  
52 - div { 66 + ::v-deep .el-scrollbar {
  67 + height: 100%;
  68 + .el-scrollbar__wrap {
  69 + overflow-x: hidden;
  70 + }
  71 + }
  72 + .list-container {
  73 + display: flex;
  74 + flex-wrap: wrap;
  75 + .icon-item-wrapper {
  76 + width: calc(100% / 3);
53 height: 30px; 77 height: 30px;
54 line-height: 30px; 78 line-height: 30px;
55 margin-bottom: -5px; 79 margin-bottom: -5px;
56 cursor: pointer; 80 cursor: pointer;
57 - width: 33%;  
58 - float: left; 81 + display: flex;
  82 + .icon-item {
  83 + display: flex;
  84 + max-width: 100%;
  85 + height: 100%;
  86 + padding: 0 2px;
  87 + &:hover {
  88 + background: #ececec;
  89 + border-radius: 5px;
  90 + }
  91 + .icon {
  92 + flex-shrink: 0;
59 } 93 }
60 span { 94 span {
61 display: inline-block; 95 display: inline-block;
62 vertical-align: -0.15em; 96 vertical-align: -0.15em;
63 fill: currentColor; 97 fill: currentColor;
  98 + padding-left: 2px;
64 overflow: hidden; 99 overflow: hidden;
  100 + text-overflow: ellipsis;
  101 + white-space: nowrap;
  102 + }
  103 + }
  104 + .icon-item.active {
  105 + background: #ececec;
  106 + border-radius: 5px;
  107 + }
  108 + }
65 } 109 }
66 } 110 }
67 } 111 }
1 <template> 1 <template>
2 <div :class="classObj" class="app-wrapper" :style="{'--current-color': theme}"> 2 <div :class="classObj" class="app-wrapper" :style="{'--current-color': theme}">
3 - <el-scrollbar>  
4 <div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside"/> 3 <div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside"/>
5 <sidebar v-if="!sidebar.hide" class="sidebar-container"/> 4 <sidebar v-if="!sidebar.hide" class="sidebar-container"/>
6 <div :class="{hasTagsView:needTagsView,sidebarHide:sidebar.hide}" class="main-container"> 5 <div :class="{hasTagsView:needTagsView,sidebarHide:sidebar.hide}" class="main-container">
  6 + <el-scrollbar>
7 <div :class="{'fixed-header':fixedHeader}"> 7 <div :class="{'fixed-header':fixedHeader}">
8 <navbar/> 8 <navbar/>
9 <tags-view v-if="needTagsView"/> 9 <tags-view v-if="needTagsView"/>
@@ -12,9 +12,9 @@ @@ -12,9 +12,9 @@
12 <right-panel> 12 <right-panel>
13 <settings/> 13 <settings/>
14 </right-panel> 14 </right-panel>
15 - </div>  
16 </el-scrollbar> 15 </el-scrollbar>
17 </div> 16 </div>
  17 + </div>
18 </template> 18 </template>
19 19
20 <script> 20 <script>
@@ -134,7 +134,7 @@ @@ -134,7 +134,7 @@
134 trigger="click" 134 trigger="click"
135 @show="$refs['iconSelect'].reset()" 135 @show="$refs['iconSelect'].reset()"
136 > 136 >
137 - <IconSelect ref="iconSelect" @selected="selected" /> 137 + <IconSelect ref="iconSelect" @selected="selected" :active-icon="form.icon" />
138 <el-input slot="reference" v-model="form.icon" placeholder="点击选择图标" readonly> 138 <el-input slot="reference" v-model="form.icon" placeholder="点击选择图标" readonly>
139 <svg-icon 139 <svg-icon
140 v-if="form.icon" 140 v-if="form.icon"