sidebar.scss 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537
  1. @use './variables.module.scss' as *;
  2. #app {
  3. .main-container {
  4. height: 100%;
  5. transition: margin-left 0.28s;
  6. margin-left: $base-sidebar-width;
  7. position: relative;
  8. }
  9. .sidebarHide {
  10. margin-left: 0 !important;
  11. }
  12. .sidebar-container {
  13. -webkit-transition: width 0.28s;
  14. transition: width 0.28s;
  15. width: $base-sidebar-width !important;
  16. min-width: $base-sidebar-width !important;
  17. max-width: $base-sidebar-width !important;
  18. background-color: $base-menu-background;
  19. height: 100%;
  20. position: fixed;
  21. font-size: 0;
  22. top: 0;
  23. bottom: 0;
  24. left: 0;
  25. z-index: 1001;
  26. overflow: hidden;
  27. -webkit-box-shadow: 2px 0 6px rgba(0, 21, 41, 0.35);
  28. box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.1);
  29. // reset element-ui css
  30. .horizontal-collapse-transition {
  31. transition:
  32. 0s width ease-in-out,
  33. 0s padding-left ease-in-out,
  34. 0s padding-right ease-in-out;
  35. }
  36. .scrollbar-wrapper {
  37. overflow-x: hidden !important;
  38. overflow-y: auto !important;
  39. }
  40. .el-scrollbar__bar.is-vertical {
  41. right: 0;
  42. }
  43. .el-scrollbar {
  44. height: 100%;
  45. }
  46. &.has-logo {
  47. .el-scrollbar {
  48. height: calc(100% - 50px);
  49. }
  50. }
  51. .is-horizontal {
  52. display: none;
  53. }
  54. a {
  55. display: inline-block;
  56. width: 100%;
  57. overflow: hidden;
  58. }
  59. .svg-icon {
  60. margin-right: 16px;
  61. }
  62. // 确保所有菜单项都不会撑宽容器
  63. .el-menu-item,
  64. .el-sub-menu__title,
  65. .sub-menu-title-noDropdown {
  66. box-sizing: border-box !important;
  67. max-width: 100% !important;
  68. span {
  69. overflow: hidden !important;
  70. text-overflow: ellipsis !important;
  71. white-space: nowrap !important;
  72. display: inline-block !important;
  73. max-width: calc(100% - 50px) !important;
  74. }
  75. }
  76. .el-menu {
  77. border: none;
  78. height: 100%;
  79. width: 100% !important;
  80. max-width: 100% !important;
  81. overflow: hidden !important;
  82. // 浅色主题菜单样式
  83. &:not(.el-menu-dark) {
  84. .el-menu-item,
  85. .el-sub-menu__title {
  86. color: var(--art-text-gray-700) !important;
  87. transition: all 0.3s ease !important;
  88. &:hover {
  89. color: var(--art-text-gray-800) !important;
  90. background-color: rgba(var(--art-primary), 0.08) !important;
  91. }
  92. .svg-icon {
  93. color: var(--art-text-gray-600) !important;
  94. transition: color 0.3s ease !important;
  95. }
  96. &:hover .svg-icon {
  97. color: rgb(var(--art-primary)) !important;
  98. }
  99. }
  100. .el-menu-item.is-active {
  101. color: rgb(var(--art-primary)) !important;
  102. background-color: rgba(var(--art-primary), 0.1) !important;
  103. .svg-icon {
  104. color: rgb(var(--art-primary)) !important;
  105. }
  106. }
  107. .is-active > .el-sub-menu__title {
  108. color: rgb(var(--art-primary)) !important;
  109. .svg-icon {
  110. color: rgb(var(--art-primary)) !important;
  111. }
  112. }
  113. }
  114. // 暗色主题菜单样式
  115. &.el-menu-dark {
  116. .el-menu-item,
  117. .el-sub-menu__title {
  118. color: var(--art-text-gray-700) !important;
  119. transition: all 0.3s ease !important;
  120. &:hover {
  121. color: var(--art-text-gray-800) !important;
  122. background-color: rgba(var(--art-primary), 0.15) !important;
  123. }
  124. .svg-icon {
  125. color: var(--art-text-gray-600) !important;
  126. transition: color 0.3s ease !important;
  127. }
  128. &:hover .svg-icon {
  129. color: rgb(var(--art-primary)) !important;
  130. }
  131. }
  132. .el-menu-item.is-active {
  133. color: rgb(var(--art-primary)) !important;
  134. background-color: rgba(var(--art-primary), 0.2) !important;
  135. .svg-icon {
  136. color: rgb(var(--art-primary)) !important;
  137. }
  138. }
  139. .is-active > .el-sub-menu__title {
  140. color: rgb(var(--art-primary)) !important;
  141. .svg-icon {
  142. color: rgb(var(--art-primary)) !important;
  143. }
  144. }
  145. }
  146. }
  147. .el-menu-item,
  148. .menu-title {
  149. overflow: hidden !important;
  150. text-overflow: ellipsis !important;
  151. white-space: nowrap !important;
  152. max-width: 100% !important;
  153. }
  154. // 子菜单和嵌套菜单样式优化
  155. .sub-menu-title-noDropdown,
  156. .el-sub-menu__title {
  157. transition: all 0.3s ease !important;
  158. border-radius: var(--border-radius-xs) !important;
  159. margin: 2px 8px !important;
  160. &:hover {
  161. background-color: rgba(var(--art-primary), 0.08) !important;
  162. color: var(--art-text-gray-800) !important;
  163. }
  164. }
  165. // 展开状态下多级菜单下拉图标位置修复
  166. .el-sub-menu__title {
  167. position: relative !important;
  168. display: flex !important;
  169. align-items: center !important;
  170. .el-sub-menu__icon-arrow {
  171. position: absolute !important;
  172. right: 16px !important;
  173. left: auto !important;
  174. margin-left: 0 !important;
  175. transition: transform 0.3s ease !important;
  176. }
  177. // 修复图标和文字布局
  178. .svg-icon {
  179. margin-right: 16px !important;
  180. flex-shrink: 0 !important;
  181. }
  182. .menu-title {
  183. flex: 1 !important;
  184. overflow: hidden !important;
  185. text-overflow: ellipsis !important;
  186. white-space: nowrap !important;
  187. }
  188. }
  189. .theme-dark .sub-menu-title-noDropdown,
  190. .theme-dark .el-sub-menu__title {
  191. &:hover {
  192. background-color: rgba(var(--art-primary), 0.15) !important;
  193. color: var(--art-text-gray-800) !important;
  194. }
  195. }
  196. // 嵌套菜单项样式
  197. .nest-menu .el-sub-menu > .el-sub-menu__title,
  198. .el-sub-menu .el-menu-item {
  199. max-width: calc(100% - 16px) !important;
  200. width: auto !important;
  201. border-radius: var(--border-radius-xs) !important;
  202. margin: 1px 8px !important;
  203. transition: all 0.3s ease !important;
  204. overflow: hidden !important;
  205. &:hover {
  206. background-color: rgba(var(--art-primary), 0.06) !important;
  207. color: var(--art-text-gray-800) !important;
  208. .svg-icon {
  209. color: rgb(var(--art-primary)) !important;
  210. }
  211. }
  212. &.is-active {
  213. background-color: rgba(var(--art-primary), 0.1) !important;
  214. color: rgb(var(--art-primary)) !important;
  215. .svg-icon {
  216. color: rgb(var(--art-primary)) !important;
  217. }
  218. }
  219. }
  220. // 暗色主题嵌套菜单
  221. .theme-dark .nest-menu .el-sub-menu > .el-sub-menu__title,
  222. .theme-dark .el-sub-menu .el-menu-item {
  223. background-color: transparent !important;
  224. &:hover {
  225. background-color: rgba(var(--art-primary), 0.12) !important;
  226. color: var(--art-text-gray-800) !important;
  227. .svg-icon {
  228. color: rgb(var(--art-primary)) !important;
  229. }
  230. }
  231. &.is-active {
  232. background-color: rgba(var(--art-primary), 0.2) !important;
  233. color: rgb(var(--art-primary)) !important;
  234. .svg-icon {
  235. color: rgb(var(--art-primary)) !important;
  236. }
  237. }
  238. }
  239. }
  240. .hideSidebar {
  241. .sidebar-container {
  242. width: 54px !important;
  243. min-width: 54px !important;
  244. max-width: 54px !important;
  245. }
  246. .main-container {
  247. margin-left: 54px;
  248. }
  249. // 确保展开状态下一级菜单与多级菜单对齐一致
  250. .el-menu:not(.el-menu--collapse) > .el-menu-item {
  251. margin: 2px 8px !important;
  252. border-radius: var(--border-radius-xs) !important;
  253. transition: all 0.3s ease !important;
  254. &:hover {
  255. background-color: rgba(var(--art-primary), 0.08) !important;
  256. color: var(--art-text-gray-800) !important;
  257. }
  258. }
  259. // 收起状态下所有菜单项统一居中对齐样式
  260. .el-menu-item,
  261. .sub-menu-title-noDropdown {
  262. display: flex !important;
  263. justify-content: center !important;
  264. align-items: center !important;
  265. padding: 0 !important;
  266. margin: 2px 0 !important;
  267. height: 48px !important;
  268. min-height: 48px !important;
  269. width: 54px !important;
  270. .el-tooltip {
  271. display: flex !important;
  272. justify-content: center !important;
  273. align-items: center !important;
  274. width: 100% !important;
  275. height: 100% !important;
  276. padding: 0 !important;
  277. }
  278. .svg-icon {
  279. margin: 0 !important;
  280. font-size: 16px !important;
  281. width: 16px !important;
  282. height: 16px !important;
  283. display: flex !important;
  284. justify-content: center !important;
  285. align-items: center !important;
  286. }
  287. }
  288. // 多级菜单标题统一样式
  289. .el-sub-menu {
  290. overflow: hidden;
  291. & > .el-sub-menu__title {
  292. display: flex !important;
  293. justify-content: center !important;
  294. align-items: center !important;
  295. padding: 0 !important;
  296. margin: 2px 0 !important;
  297. height: 48px !important;
  298. min-height: 48px !important;
  299. width: 54px !important;
  300. .svg-icon {
  301. margin: 0 !important;
  302. font-size: 16px !important;
  303. width: 16px !important;
  304. height: 16px !important;
  305. display: flex !important;
  306. justify-content: center !important;
  307. align-items: center !important;
  308. }
  309. // 收起状态下隐藏下拉箭头
  310. .el-sub-menu__icon-arrow {
  311. display: none !important;
  312. }
  313. .menu-title {
  314. display: none !important;
  315. }
  316. }
  317. }
  318. .el-menu--collapse {
  319. // 一级菜单项特殊处理
  320. .el-menu > .el-menu-item {
  321. height: 48px !important;
  322. line-height: 48px !important;
  323. display: flex !important;
  324. justify-content: center !important;
  325. align-items: center !important;
  326. padding: 0 !important;
  327. margin: 2px 0 !important;
  328. width: 54px !important;
  329. .el-tooltip,
  330. .el-menu-tooltip__trigger {
  331. display: flex !important;
  332. justify-content: center !important;
  333. align-items: center !important;
  334. width: 100% !important;
  335. height: 100% !important;
  336. padding: 0 !important;
  337. }
  338. .svg-icon {
  339. display: flex !important;
  340. justify-content: center !important;
  341. align-items: center !important;
  342. width: 16px !important;
  343. height: 16px !important;
  344. font-size: 16px !important;
  345. margin: 0 !important;
  346. }
  347. }
  348. // 确保所有收起状态下的菜单项都有相同的样式
  349. .el-menu-item,
  350. .sub-menu-title-noDropdown,
  351. .el-sub-menu__title {
  352. height: 48px !important;
  353. line-height: 48px !important;
  354. display: flex !important;
  355. justify-content: center !important;
  356. align-items: center !important;
  357. padding: 0 !important;
  358. margin: 2px 0 !important;
  359. width: 54px !important;
  360. .svg-icon {
  361. display: flex !important;
  362. justify-content: center !important;
  363. align-items: center !important;
  364. width: 16px !important;
  365. height: 16px !important;
  366. font-size: 16px !important;
  367. margin: 0 !important;
  368. }
  369. }
  370. .el-sub-menu {
  371. & > .el-sub-menu__title {
  372. & > span {
  373. height: 0;
  374. width: 0;
  375. overflow: hidden;
  376. visibility: hidden;
  377. display: inline-block;
  378. }
  379. & > i {
  380. height: 0;
  381. width: 0;
  382. overflow: hidden;
  383. visibility: hidden;
  384. display: inline-block;
  385. }
  386. }
  387. }
  388. }
  389. }
  390. // 展开状态下多级菜单下拉图标位置修复(应用于所有展开状态的菜单)
  391. .sidebar-container:not(.hideSidebar) {
  392. .el-menu:not(.el-menu--collapse) {
  393. .el-sub-menu__title {
  394. padding-right: 40px !important; // 为右侧箭头预留空间
  395. .el-sub-menu__icon-arrow {
  396. display: block !important;
  397. position: absolute !important;
  398. right: 16px !important;
  399. left: auto !important;
  400. margin-left: 0 !important;
  401. transform: rotate(0deg) !important;
  402. transition: transform 0.3s ease !important;
  403. }
  404. &.is-opened .el-sub-menu__icon-arrow {
  405. transform: rotate(180deg) !important;
  406. }
  407. }
  408. }
  409. }
  410. .el-menu--collapse .el-menu .el-sub-menu {
  411. min-width: $base-sidebar-width !important;
  412. }
  413. // mobile responsive
  414. .mobile {
  415. .main-container {
  416. margin-left: 0px;
  417. }
  418. .sidebar-container {
  419. transition: transform 0.28s;
  420. width: $base-sidebar-width !important;
  421. }
  422. &.hideSidebar {
  423. .sidebar-container {
  424. pointer-events: none;
  425. transition-duration: 0.3s;
  426. transform: translate3d(-$base-sidebar-width, 0, 0);
  427. }
  428. }
  429. }
  430. .withoutAnimation {
  431. .main-container,
  432. .sidebar-container {
  433. transition: none;
  434. }
  435. }
  436. }
  437. // when menu collapsed
  438. .el-menu--vertical {
  439. & > .el-menu {
  440. .svg-icon {
  441. margin-right: 16px;
  442. }
  443. }
  444. }
  445. // 强制所有菜单弹出层保持在sidebar宽度内
  446. .el-menu--popup {
  447. max-width: 200px !important;
  448. .el-menu-item {
  449. overflow: hidden !important;
  450. text-overflow: ellipsis !important;
  451. white-space: nowrap !important;
  452. }
  453. }
  454. // 确保sidebar容器始终保持固定宽度
  455. .sidebar-container * {
  456. box-sizing: border-box;
  457. }