tabs.scss 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739
  1. @use '../helpers/baseMixin.scss';
  2. $scrollbarOffsetSize: 20px;
  3. .vxe-tabs {
  4. display: flex;
  5. color: var(--vxe-ui-font-color);
  6. font-family: var(--vxe-ui-font-family);
  7. &.pos--top,
  8. &.pos--bottom {
  9. flex-direction: column;
  10. }
  11. &.pos--left,
  12. &.pos--right {
  13. flex-direction: row;
  14. }
  15. &.trigger--default {
  16. .vxe-tabs-header--item {
  17. cursor: pointer;
  18. &:hover {
  19. .vxe-tabs-header--item-name {
  20. color: var(--vxe-ui-font-primary-color);
  21. }
  22. }
  23. }
  24. }
  25. }
  26. .vxe-tabs-header--bar {
  27. position: relative;
  28. display: flex;
  29. flex-direction: row;
  30. align-items: center;
  31. justify-content: center;
  32. flex-shrink: 0;
  33. cursor: pointer;
  34. &::after {
  35. content: "";
  36. position: absolute;
  37. background-color: var(--vxe-ui-input-border-color);
  38. z-index: 3;
  39. }
  40. &:focus {
  41. color: var(--vxe-ui-font-darken-color);
  42. }
  43. &:hover {
  44. color: var(--vxe-ui-font-primary-lighten-color);
  45. }
  46. &:active {
  47. color: var(--vxe-ui-font-primary-darken-color);
  48. }
  49. &.type--default,
  50. &.type--card,
  51. &.type--border-card,
  52. &.type--round-card {
  53. border: 1px solid var(--vxe-ui-input-border-color);
  54. }
  55. &.type--round-card {
  56. background-color: rgba(0, 0, 0, 0.02);
  57. }
  58. &.pos--top,
  59. &.pos--bottom {
  60. width: 1.6em;
  61. &::after {
  62. top: 0;
  63. width: 1px;
  64. height: 100%;
  65. }
  66. }
  67. &.pos--left,
  68. &.pos--right {
  69. width: 100%;
  70. height: 1.6em;
  71. &::after {
  72. left: 0;
  73. width: 100%;
  74. height: 1px;
  75. }
  76. }
  77. }
  78. .vxe-tabs-header--prev-bar {
  79. &.type--default {
  80. &.pos--top,
  81. &.pos--bottom {
  82. border-right: 0;
  83. }
  84. &.pos--left,
  85. &.pos--right {
  86. border-bottom: 0;
  87. }
  88. }
  89. &.type--card {
  90. &.pos--top {
  91. border-bottom: 0;
  92. border-right: 0;
  93. }
  94. &.pos--bottom {
  95. border-top: 0;
  96. border-right: 0;
  97. }
  98. &.pos--left {
  99. border-left: 0;
  100. border-bottom: 0;
  101. }
  102. &.pos--right {
  103. border-right: 0;
  104. border-bottom: 0;
  105. }
  106. }
  107. &.type--border-card {
  108. &.pos--top {
  109. border-top: 0;
  110. border-right: 0;
  111. }
  112. &.pos--bottom {
  113. border-right: 0;
  114. border-bottom: 0;
  115. }
  116. &.pos--left {
  117. border-left: 0;
  118. border-bottom: 0;
  119. }
  120. &.pos--right {
  121. border-right: 0;
  122. border-bottom: 0;
  123. }
  124. }
  125. &.type--round-card {
  126. &.pos--top {
  127. border-right: 0;
  128. }
  129. &.pos--bottom {
  130. border-right: 0;
  131. }
  132. &.pos--left {
  133. border-bottom: 0;
  134. }
  135. &.pos--right {
  136. border-bottom: 0;
  137. }
  138. }
  139. &.pos--top,
  140. &.pos--bottom {
  141. &::after {
  142. right: 0;
  143. }
  144. }
  145. &.pos--left,
  146. &.pos--right {
  147. &::after {
  148. bottom: 0;
  149. }
  150. }
  151. &.scrolling--middle {
  152. &.pos--top,
  153. &.pos--bottom {
  154. box-shadow: 4px 0px 6px 0 var(--vxe-ui-tabs-bar-scrolling-box-shadow-color);
  155. }
  156. &.pos--left,
  157. &.pos--right {
  158. box-shadow: 0 4px 6px 0 var(--vxe-ui-tabs-bar-scrolling-box-shadow-color);
  159. }
  160. }
  161. }
  162. .vxe-tabs-header--next-bar {
  163. &.type--default {
  164. &.pos--top,
  165. &.pos--bottom {
  166. border-left: 0;
  167. }
  168. &.pos--left,
  169. &.pos--right {
  170. border-top: 0;
  171. }
  172. }
  173. &.type--card {
  174. &.pos--top {
  175. border-top: 0;
  176. border-left: 0;
  177. }
  178. &.pos--bottom {
  179. border-bottom: 0;
  180. border-left: 0;
  181. }
  182. &.pos--left {
  183. border-top: 0;
  184. border-right: 0;
  185. }
  186. &.pos--right {
  187. border-top: 0;
  188. border-left: 0;
  189. }
  190. }
  191. &.type--border-card {
  192. &.pos--top {
  193. border-left: 0;
  194. border-top: 0;
  195. }
  196. &.pos--bottom {
  197. border-left: 0;
  198. border-bottom: 0;
  199. }
  200. &.pos--left {
  201. border-left: 0;
  202. border-top: 0;
  203. }
  204. &.pos--right {
  205. border-right: 0;
  206. border-top: 0;
  207. }
  208. }
  209. &.type--round-card {
  210. &.pos--top {
  211. border-left: 0;
  212. }
  213. &.pos--bottom {
  214. border-left: 0;
  215. border-bottom: 0;
  216. }
  217. &.pos--left {
  218. border-top: 0;
  219. }
  220. &.pos--right {
  221. border-top: 0;
  222. }
  223. }
  224. &.pos--top,
  225. &.pos--bottom {
  226. &::after {
  227. left: 0;
  228. }
  229. }
  230. &.pos--left,
  231. &.pos--right {
  232. &::after {
  233. top: 0;
  234. }
  235. }
  236. &.scrolling--middle {
  237. &.pos--top,
  238. &.pos--bottom {
  239. box-shadow: -4px 0px 6px 0 var(--vxe-ui-tabs-bar-scrolling-box-shadow-color);
  240. }
  241. &.pos--left,
  242. &.pos--right {
  243. box-shadow: 0 -4px 6px 0 var(--vxe-ui-tabs-bar-scrolling-box-shadow-color);
  244. }
  245. }
  246. }
  247. .vxe-tabs-header--prefix,
  248. .vxe-tabs-header--suffix {
  249. display: flex;
  250. flex-direction: row;
  251. align-items: center;
  252. justify-content: center;
  253. flex-shrink: 0;
  254. }
  255. .vxe-tabs-header--prefix,
  256. .vxe-tabs-header--suffix {
  257. &.type--default,
  258. &.type--border-card,
  259. &.type--round-card {
  260. &.pos--top {
  261. border-bottom: 1px solid var(--vxe-ui-input-border-color);
  262. }
  263. &.pos--bottom {
  264. border-top: 1px solid var(--vxe-ui-input-border-color);
  265. }
  266. &.pos--left {
  267. border-right: 1px solid var(--vxe-ui-input-border-color);
  268. }
  269. &.pos--right {
  270. border-left: 1px solid var(--vxe-ui-input-border-color);
  271. }
  272. }
  273. }
  274. .vxe-tabs-header--item-wrapper {
  275. position: relative;
  276. display: flex;
  277. outline: 0;
  278. }
  279. .vxe-tabs-header--item {
  280. position: relative;
  281. flex-shrink: 0;
  282. padding: 0 0.5em;
  283. &.is--active {
  284. .vxe-tabs-header--item-content {
  285. color: var(--vxe-ui-font-primary-color);
  286. }
  287. }
  288. &.align--left {
  289. text-align: left;
  290. }
  291. &.align--center {
  292. text-align: center;
  293. }
  294. &.align--right {
  295. text-align: right;
  296. }
  297. &.type--card {
  298. &.pos--top {
  299. border-top: 1px solid var(--vxe-ui-input-border-color);
  300. }
  301. &.pos--bottom {
  302. border-bottom: 1px solid var(--vxe-ui-input-border-color);
  303. }
  304. &.pos--top,
  305. &.pos--bottom {
  306. border-right: 1px solid var(--vxe-ui-input-border-color);
  307. &:first-child {
  308. border-left: 1px solid var(--vxe-ui-input-border-color);
  309. }
  310. }
  311. &.pos--left {
  312. border-left: 1px solid var(--vxe-ui-input-border-color);
  313. }
  314. &.pos--right {
  315. border-right: 1px solid var(--vxe-ui-input-border-color);
  316. }
  317. &.pos--left,
  318. &.pos--right {
  319. border-bottom: 1px solid var(--vxe-ui-input-border-color);
  320. &:first-child {
  321. border-top: 1px solid var(--vxe-ui-input-border-color);
  322. }
  323. }
  324. }
  325. &.type--border-card {
  326. &.is--active {
  327. background-color: var(--vxe-ui-layout-background-color);
  328. }
  329. }
  330. &.type--round-card {
  331. z-index: 2;
  332. border: 1px solid var(--vxe-ui-input-border-color);
  333. background-color: rgba(0, 0, 0, 0.02);
  334. @include baseMixin.createAnimationTransition(color, .3s);
  335. &.is--active {
  336. background-color: var(--vxe-ui-layout-background-color);
  337. }
  338. &.pos--top {
  339. border-bottom: 0;
  340. border-radius: var(--vxe-ui-base-border-radius) var(--vxe-ui-base-border-radius) 0 0;
  341. }
  342. &.pos--bottom {
  343. border-top: 0;
  344. border-radius: 0 0 var(--vxe-ui-base-border-radius) var(--vxe-ui-base-border-radius);
  345. }
  346. &.pos--top,
  347. &.pos--bottom {
  348. margin: 0 2px;
  349. &:first-child {
  350. margin-left: 0;
  351. }
  352. &:last-child {
  353. margin-right: 0;
  354. }
  355. }
  356. &.pos--left {
  357. border-right: 0;
  358. border-radius: var(--vxe-ui-base-border-radius) 0 0 var(--vxe-ui-base-border-radius);
  359. }
  360. &.pos--right {
  361. border-left: 0;
  362. border-radius: 0 var(--vxe-ui-base-border-radius) var(--vxe-ui-base-border-radius) 0;
  363. }
  364. &.pos--left,
  365. &.pos--right {
  366. margin: 2px 0;
  367. &:first-child {
  368. margin-top: 0;
  369. }
  370. &:last-child {
  371. margin-bottom: 0;
  372. }
  373. }
  374. }
  375. }
  376. .vxe-tabs-header--item-inner {
  377. display: flex;
  378. flex-direction: row;
  379. align-items: center;
  380. }
  381. .vxe-tabs-header--item-content {
  382. flex-grow: 1;
  383. max-width: 30em;
  384. padding: 0 0.3em;
  385. overflow: hidden;
  386. text-overflow: ellipsis;
  387. white-space: nowrap;
  388. & > span {
  389. padding: 0 0.3em;
  390. }
  391. }
  392. .vxe-tabs-header--refresh-btn,
  393. .vxe-tabs-header--close-btn {
  394. font-size: 0.8em;
  395. border-radius: 50%;
  396. width: 1.5em;
  397. height: 1.5em;
  398. line-height: 1.5em;
  399. text-align: center;
  400. &:hover {
  401. color: var(--vxe-ui-font-color);
  402. background: var(--vxe-ui-tabs-close-hover-background-color);
  403. }
  404. &:active {
  405. color: var(--vxe-ui-font-primary-color);
  406. }
  407. & > i {
  408. font-size: 1em;
  409. vertical-align: middle;
  410. }
  411. }
  412. .vxe-tabs-header--refresh-btn {
  413. visibility: hidden;
  414. &.is--active,
  415. &.is--loading {
  416. visibility: visible;
  417. }
  418. &.is--disabled {
  419. cursor: no-drop;
  420. color: var(--vxe-ui-font-disabled-color);
  421. }
  422. }
  423. .vxe-tabs-header--item-inner {
  424. @include baseMixin.createAnimationTransition(color, .1s);
  425. }
  426. .vxe-tabs-pane--wrapper {
  427. display: none;
  428. position: relative;
  429. flex-direction: column;
  430. flex-grow: 1;
  431. overflow: hidden;
  432. &.is--content {
  433. display: flex;
  434. }
  435. &.type--border-card,
  436. &.type--round-card {
  437. border: 1px solid var(--vxe-ui-input-border-color);
  438. &.pos--top {
  439. border-top: 0;
  440. }
  441. &.pos--bottom {
  442. border-bottom: 0;
  443. }
  444. &.pos--left {
  445. border-left: 0;
  446. }
  447. &.pos--right {
  448. border-right: 0;
  449. }
  450. }
  451. }
  452. .vxe-tabs-pane--body {
  453. flex-grow: 1;
  454. overflow: hidden;
  455. &.is--padding {
  456. padding: var(--vxe-ui-layout-padding-default);
  457. }
  458. }
  459. .vxe-tabs-pane--header,
  460. .vxe-tabs-pane--footer {
  461. flex-shrink: 0;
  462. overflow: auto;
  463. }
  464. .vxe-tabs-pane--item {
  465. display: none;
  466. height: 100%;
  467. overflow: auto;
  468. outline: 0;
  469. &.is--visible {
  470. display: block;
  471. }
  472. }
  473. .vxe-tabs-header {
  474. display: flex;
  475. &.pos--top,
  476. &.pos--bottom {
  477. flex-direction: row;
  478. }
  479. &.pos--left,
  480. &.pos--right {
  481. flex-direction: column;
  482. }
  483. &.type--card {
  484. &.pos--top {
  485. border-bottom: 1px solid var(--vxe-ui-input-border-color);
  486. }
  487. &.pos--bottom {
  488. border-top: 1px solid var(--vxe-ui-input-border-color);
  489. }
  490. &.pos--left {
  491. border-right: 1px solid var(--vxe-ui-input-border-color);
  492. }
  493. &.pos--right {
  494. border-left: 1px solid var(--vxe-ui-input-border-color);
  495. }
  496. }
  497. &.type--border-card {
  498. background-color: var(--vxe-ui-tabs-card-header-background-color);
  499. border: 1px solid var(--vxe-ui-input-border-color);
  500. &.pos--top {
  501. border-bottom: 0;
  502. }
  503. &.pos--bottom {
  504. border-top: 0;
  505. }
  506. &.pos--left {
  507. border-right: 0;
  508. }
  509. &.pos--right {
  510. border-left: 0;
  511. }
  512. }
  513. }
  514. .vxe-tabs-header--wrapper {
  515. position: relative;
  516. flex-grow: 1;
  517. overflow: hidden;
  518. &.type--default,
  519. &.type--border-card ,
  520. &.type--round-card {
  521. position: relative;
  522. &::after {
  523. content: "";
  524. position: absolute;
  525. background-color: var(--vxe-ui-input-border-color);
  526. z-index: 0;
  527. }
  528. &.pos--top {
  529. &::after {
  530. bottom: 0;
  531. }
  532. }
  533. &.pos--bottom {
  534. &::after {
  535. top: 0;
  536. }
  537. }
  538. &.pos--top,
  539. &.pos--bottom {
  540. &::after {
  541. left: 0;
  542. width: 100%;
  543. height: 1px;
  544. }
  545. }
  546. &.pos--left {
  547. &::after {
  548. right: 0;
  549. }
  550. }
  551. &.pos--right {
  552. &::after {
  553. left: 0;
  554. }
  555. }
  556. &.pos--left,
  557. &.pos--right {
  558. &::after {
  559. top: 0;
  560. width: 1px;
  561. height: 100%;
  562. }
  563. }
  564. }
  565. &.type--border-card {
  566. &.pos--top {
  567. border-radius: var(--vxe-ui-base-border-radius) var(--vxe-ui-base-border-radius) 0 0;
  568. }
  569. &.pos--bottom {
  570. border-radius: 0 0 var(--vxe-ui-base-border-radius) var(--vxe-ui-base-border-radius);
  571. }
  572. }
  573. &.type--border-card,
  574. &.type--round-card {
  575. & > .vxe-tabs-header--item-wrapper {
  576. z-index: 2;
  577. }
  578. }
  579. &.pos--top,
  580. &.pos--bottom {
  581. .vxe-tabs-header--item-wrapper {
  582. flex-direction: row;
  583. width: 100%;
  584. overflow-y: hidden;
  585. overflow-x: auto;
  586. }
  587. }
  588. &.pos--left,
  589. &.pos--right {
  590. .vxe-tabs-header--item-wrapper {
  591. flex-direction: column;
  592. height: 100%;
  593. overflow-y: auto;
  594. overflow-x: hidden;
  595. }
  596. }
  597. }
  598. .vxe-tabs-header--active-line {
  599. display: none;
  600. &.type--default {
  601. display: block;
  602. position: absolute;
  603. background-color: var(--vxe-ui-font-primary-color);
  604. z-index: 2;
  605. @include baseMixin.createAnimationTransition(all, .3s);
  606. &.pos--top {
  607. bottom: $scrollbarOffsetSize;
  608. }
  609. &.pos--bottom {
  610. top: 0;
  611. }
  612. &.pos--top,
  613. &.pos--bottom {
  614. left: 0;
  615. height: 2px;
  616. width: 4px;
  617. }
  618. &.pos--left {
  619. right: $scrollbarOffsetSize;
  620. }
  621. &.pos--right {
  622. left: 0;
  623. }
  624. &.pos--left,
  625. &.pos--right {
  626. top: 0;
  627. height: 4px;
  628. width: 2px;
  629. }
  630. }
  631. &.type--card {
  632. display: block;
  633. position: absolute;
  634. top: 0;
  635. left: 0;
  636. border: 1px solid var(--vxe-ui-font-primary-color);
  637. pointer-events: none;
  638. z-index: 1;
  639. box-shadow: 0 0 8px rgba(0, 0, 0, 0.1);
  640. &.pos--top,
  641. &.pos--bottom {
  642. width: 4px;
  643. transition: color,left 0.3s ease-in-out;
  644. }
  645. &.pos--left,
  646. &.pos--right {
  647. width: calc(100% - 20px);
  648. transition: color,top 0.3s ease-in-out;
  649. }
  650. }
  651. &.type--border-card {
  652. display: block;
  653. position: absolute;
  654. top: 0;
  655. left: 0;
  656. pointer-events: none;
  657. z-index: 1;
  658. &.pos--top,
  659. &.pos--bottom {
  660. width: 4px;
  661. border-left: 1px solid var(--vxe-ui-input-border-color);
  662. border-right: 1px solid var(--vxe-ui-input-border-color);
  663. }
  664. &.pos--left,
  665. &.pos--right {
  666. width: 100%;
  667. border-top: 1px solid var(--vxe-ui-input-border-color);
  668. border-bottom: 1px solid var(--vxe-ui-input-border-color);
  669. }
  670. }
  671. }
  672. .vxe-tabs--default,
  673. .vxe-tabs--card,
  674. .vxe-tabs--border-card,
  675. .vxe-tabs--round-card {
  676. border-radius: var(--vxe-ui-base-border-radius) var(--vxe-ui-base-border-radius) 0 0;
  677. background-color: var(--vxe-ui-layout-background-color);
  678. }
  679. .vxe-tabs--default {
  680. .vxe-tabs-header--item-inner {
  681. border-bottom: 2px solid transparent;
  682. }
  683. }
  684. @mixin getTabsSizeStyle ($fontSize, $headHeight) {
  685. font-size: $fontSize;
  686. .vxe-tabs-header--item-inner {
  687. height: $headHeight;
  688. }
  689. .vxe-tabs-header--active-line {
  690. &.type--card {
  691. height: $headHeight;
  692. }
  693. &.type--border-card {
  694. height: calc($headHeight + 1px);
  695. line-height: calc($headHeight + 1px);
  696. }
  697. }
  698. .vxe-tabs-header--wrapper {
  699. &.pos--top,
  700. &.pos--bottom {
  701. height: $headHeight;
  702. }
  703. }
  704. .vxe-tabs--card,
  705. .vxe-tabs--round-card {
  706. .vxe-tabs-header--item-inner {
  707. height: calc($headHeight - 1px);
  708. }
  709. }
  710. }
  711. .vxe-tabs {
  712. @include getTabsSizeStyle(var(--vxe-ui-font-size-default), var(--vxe-ui-tabs-header-height-default));
  713. &.size--medium {
  714. @include getTabsSizeStyle(var(--vxe-ui-font-size-medium), var(--vxe-ui-tabs-header-height-medium));
  715. }
  716. &.size--small {
  717. @include getTabsSizeStyle(var(--vxe-ui-font-size-small), var(--vxe-ui-tabs-header-height-small));
  718. }
  719. &.size--mini {
  720. @include getTabsSizeStyle(var(--vxe-ui-font-size-mini), var(--vxe-ui-tabs-header-height-mini));
  721. }
  722. }