1
1
<template >
2
- <div >accordion</div >
2
+ <ul class =" devui-accordion-list" v-if =" !innerListTemplate || deepth === 0" >
3
+ <li class =" devui-accordion-item" v-for =" category in data" :key =" category.title" >
4
+ <div
5
+ class =" devui-accordion-item-title devui-over-flow-ellipsis"
6
+ :class =" {
7
+ open: open,
8
+ active: childActived,
9
+ disabled: disabled
10
+ }"
11
+ :title =" category.title"
12
+ @click =" !disabled && toggle($event)"
13
+ >
14
+ <div
15
+ class =" devui-accordion-splitter"
16
+ :class =" {
17
+ 'devui-parent-list': deepth === 0
18
+ }"
19
+ :style =" { left: deepth * 20 + 10 + 'px' }"
20
+ ></div >
21
+ {{ category.title }}
22
+ </div >
23
+ <ul class =" devui-accordion-submenu" >
24
+ <li class =" devui-accordion-item" v-for =" component in category.children" :key =" component.title" >
25
+ <router-link :to =" component.link" >{{ component.title }}</router-link >
26
+ </li >
27
+ </ul >
28
+ </li >
29
+ </ul >
3
30
</template >
4
31
5
32
<script lang="ts">
@@ -18,4 +45,261 @@ export default defineComponent({
18
45
console .log (' linkType:' , linkType );
19
46
}
20
47
})
21
- </script >
48
+ </script >
49
+
50
+ <style lang="scss">
51
+ @import ' ../style/mixins/index' ;
52
+ @import ' ../style/theme/color' ;
53
+ @import ' ../style/theme/shadow' ;
54
+ @import ' ../style/theme/corner' ;
55
+
56
+ :host {
57
+ display : block ;
58
+ }
59
+
60
+ d-accordion-menu ,
61
+ d-accordion-item ,
62
+ d-accordion-item-hreflink ,
63
+ d-accordion-item-routerlink ,
64
+ d-accordion-list {
65
+ display : block ;
66
+ }
67
+
68
+ /* 菜单底色 */
69
+ .devui-accordion-menu {
70
+ display : block ;
71
+ background : $devui-base-bg ;
72
+ width : 100% ;
73
+ overflow-y : auto ;
74
+ border-radius : $devui-border-radius ;
75
+ height : 100% ;
76
+
77
+ & .devui-accordion-menu-normal {
78
+ box-shadow : $devui-shadow-length-base $devui-shadow ;
79
+ }
80
+
81
+ & > .devui-accordion-list {
82
+ padding : 10px 0 ;
83
+ }
84
+
85
+ .devui-over-flow-ellipsis {
86
+ overflow : hidden ;
87
+ white-space : nowrap ;
88
+ text-overflow : ellipsis ;
89
+ }
90
+ }
91
+
92
+ .devui-accordion-submenu {
93
+ background : $devui-base-bg ;
94
+ width : 100% ;
95
+ }
96
+
97
+ /* 单行菜单 */
98
+ .devui-accordion-item-title {
99
+ display : block ;
100
+ height : 40px ;
101
+ width : 100% ;
102
+ padding : 0 10px 0 20px ;
103
+ font-weight : 400 ;
104
+ line-height : 40px ;
105
+ color : $devui-text-weak ;
106
+ background : transparent ;
107
+ cursor : pointer ;
108
+
109
+ & .disabled {
110
+ color : $devui-disabled-text ;
111
+ cursor : not-allowed ;
112
+
113
+ & > a {
114
+ color : $devui-disabled-text ;
115
+ }
116
+ }
117
+
118
+ & :not (.disabled ) {
119
+ & :hover {
120
+ background : $devui-list-item-hover-bg ;
121
+ color : $devui-list-item-hover-text ;
122
+ }
123
+
124
+ & .devui-router-active ,
125
+ & .active :not (.open ) {
126
+ color : $devui-brand-active ;
127
+ font-weight : bold ;
128
+
129
+ & > a {
130
+ color : $devui-brand-active ;
131
+ }
132
+ }
133
+ }
134
+
135
+ & > a {
136
+ text-decoration : none ;
137
+ display : block ;
138
+ width : 100% ;
139
+ color : $devui-text-weak ;
140
+
141
+ & :hover {
142
+ color : inherit ;
143
+ text-decoration : none ;
144
+ }
145
+ }
146
+ }
147
+
148
+ /* 解决链接可点击区域大小不是100%宽度问题 */
149
+ d-accordion-item-hreflink ,
150
+ d-accordion-item-routerlink {
151
+ & .devui-accordion-item-title {
152
+ padding : 0 ;
153
+
154
+ & > a {
155
+ padding : 0 10px 0 20px ;
156
+ }
157
+ }
158
+ }
159
+
160
+ /* 展开图标相关 */
161
+ .devui-accordion-menu-item > .devui-accordion-item-title {
162
+ position : relative ;
163
+
164
+ & > .devui-accordion-open-icon {
165
+ display : inline-block ;
166
+ text-indent : 0 ;
167
+ pointer-events : none ; /* 让鼠标穿透 */
168
+ position : absolute ;
169
+ right : 10px ;
170
+ top : 12px ;
171
+ width : 16px ;
172
+ height : 16px ;
173
+ line-height : 16px ;
174
+ transition : transform ease-out 0.3s ;
175
+
176
+ & > svg {
177
+ width : 16px ;
178
+ height : 16px ;
179
+
180
+ polygon {
181
+ fill : $devui-text-weak ;
182
+ }
183
+ }
184
+ }
185
+
186
+ & :not (.open ) {
187
+ & .active {
188
+ svg polygon {
189
+ fill : $devui-icon-fill-active ;
190
+ }
191
+ }
192
+
193
+ & > .devui-accordion-open-icon {
194
+ transform : rotate (-180deg );
195
+ transform-origin : center ;
196
+ }
197
+ }
198
+
199
+ & .disabled > .devui-accordion-open-icon {
200
+ color : $devui-disabled-text ;
201
+
202
+ svg polygon {
203
+ fill : $devui-disabled-text ;
204
+ }
205
+ }
206
+ }
207
+
208
+ /* 可展开的菜单 */
209
+ .devui-accordion-menu-item > .devui-accordion-item-title {
210
+ padding-right : 30px ;
211
+
212
+ & .active :not (.open ) {
213
+ color : $devui-brand-active ;
214
+ background : transparent ;
215
+ }
216
+ }
217
+
218
+ d-accordion-list .devui-accordion-menu-hidden {
219
+ display : none ;
220
+ }
221
+
222
+ /* 视觉融合灰线 */
223
+ .devui-accordion-item-title {
224
+ position : relative ;
225
+
226
+ .devui-accordion-splitter {
227
+ position : absolute ;
228
+ display : inline-block ;
229
+ left : 10px ;
230
+ width : 2px ;
231
+ height : 40px ;
232
+ background : $devui-dividing-line ;
233
+ vertical-align : middle ;
234
+
235
+ & .devui-parent-list {
236
+ background-color : transparent ;
237
+ }
238
+ }
239
+
240
+ & .devui-router-active ,
241
+ & .active {
242
+ & :not (.open ) .devui-accordion-splitter ::before {
243
+ content : ' ' ;
244
+ display : block ;
245
+ width : 2px ;
246
+ height : 18px ;
247
+ background : $devui-form-control-line-active ;
248
+ position : absolute ;
249
+ top : 11px ;
250
+ left : 0 ;
251
+ }
252
+ }
253
+ }
254
+
255
+ .devui-accordion-list > .devui-accordion-item :first-child {
256
+ & > .devui-accordion-item-title ,
257
+ & > .devui-accordion-menu-item > .devui-accordion-item-title {
258
+ & > a > .devui-accordion-splitter ,
259
+ & > .devui-accordion-splitter {
260
+ height : 28px ;
261
+ top : 12px ;
262
+
263
+ & ::before {
264
+ top : 0 ;
265
+ }
266
+ }
267
+ }
268
+ }
269
+
270
+ .devui-accordion-list > .devui-accordion-item :last-child {
271
+ & > .devui-accordion-item-title ,
272
+ & > .devui-accordion-menu-item > .devui-accordion-item-title {
273
+ & > a > .devui-accordion-splitter ,
274
+ & > .devui-accordion-splitter {
275
+ height : 28px ;
276
+ top : 0 ;
277
+
278
+ & ::before {
279
+ top : initial ;
280
+ bottom : 0 ;
281
+ }
282
+ }
283
+ }
284
+ }
285
+
286
+ .devui-accordion-list > .devui-accordion-item :last-child:first-child {
287
+ & > .devui-accordion-item-title ,
288
+ & > .devui-accordion-menu-item > .devui-accordion-item-title {
289
+ & > a > .devui-accordion-splitter ,
290
+ & > .devui-accordion-splitter {
291
+ height : 18px ;
292
+ top : 11px ;
293
+ }
294
+ }
295
+ }
296
+
297
+ .devui-accordion-item > a {
298
+ padding : 0 10px 0 20px ;
299
+ color : var (--devui-text-weak ,#575d6c );
300
+ display : block ;
301
+ text-decoration : none ;
302
+ width : 100% ;
303
+ }
304
+
305
+ </style >
0 commit comments