tui-collapse.vue 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. <template>
  2. <view class="tui-collapse" :style="{backgroundColor:bgColor}">
  3. <view class="tui-collapse-head" :style="{backgroundColor:hdBgColor}" @tap.stop="handleClick">
  4. <view class="tui-header" :class="{'tui-opacity':disabled}">
  5. <slot name="title"></slot>
  6. <view class="tui-collapse-icon tui-icon-arrow" :class="{'tui-icon-active':isOpen}" :style="{color:arrowColor}" v-if="arrow"></view>
  7. </view>
  8. </view>
  9. <view class="tui-collapse-body" :style="{backgroundColor:bdBgColor,transform: isOpen ? 'translateY(0)' : `translateY(${translateY})`,height:isOpen?height:'0'}">
  10. <slot name="content"></slot>
  11. </view>
  12. </view>
  13. </template>
  14. <script>
  15. export default {
  16. name: "tuiCollapse",
  17. props: {
  18. //collapse背景颜色
  19. bgColor: {
  20. type: String,
  21. default: 'none'
  22. },
  23. //collapse-head 背景颜色
  24. hdBgColor: {
  25. type: String,
  26. default: '#fff'
  27. },
  28. //collapse-body 背景颜色
  29. bdBgColor: {
  30. type: String,
  31. default: 'none'
  32. },
  33. //collapse-body实际高度 open时使用
  34. height: {
  35. type: String,
  36. default: 'auto'
  37. },
  38. //close时translateY ,当bd高度固定时,建议值为0
  39. translateY: {
  40. type: String,
  41. default: '-50%'
  42. },
  43. //索引
  44. index: {
  45. type: Number,
  46. default: 0
  47. },
  48. //当前索引,index==current时展开
  49. current: {
  50. type: Number,
  51. default: -1
  52. },
  53. // 是否禁用
  54. disabled: {
  55. type: [Boolean, String],
  56. default: false
  57. },
  58. //是否带箭头
  59. arrow:{
  60. type: [Boolean, String],
  61. default: true
  62. },
  63. //箭头颜色
  64. arrowColor:{
  65. type: String,
  66. default: "#333"
  67. }
  68. },
  69. watch: {
  70. current() {
  71. this.updateCurrentChange()
  72. }
  73. },
  74. created() {
  75. this.updateCurrentChange()
  76. },
  77. data() {
  78. return {
  79. isOpen: false
  80. };
  81. },
  82. methods: {
  83. updateCurrentChange() {
  84. this.isOpen = this.index == this.current
  85. },
  86. handleClick() {
  87. if (this.disabled) return;
  88. this.$emit("click", {
  89. index: Number(this.index)
  90. })
  91. }
  92. }
  93. }
  94. </script>
  95. <style>
  96. @font-face {
  97. font-family: 'tuiCollapse';
  98. src: url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAQ4AA0AAAAABlgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAEHAAAABoAAAAciRx3B0dERUYAAAP8AAAAHgAAAB4AKQAKT1MvMgAAAaAAAABCAAAAVjxuR/JjbWFwAAAB9AAAAD4AAAFCAA/pq2dhc3AAAAP0AAAACAAAAAj//wADZ2x5ZgAAAkAAAABEAAAARCs1U/toZWFkAAABMAAAADAAAAA2FpaT+mhoZWEAAAFgAAAAHQAAACQHngOFaG10eAAAAeQAAAAPAAAAEAwAAEBsb2NhAAACNAAAAAoAAAAKACIAAG1heHAAAAGAAAAAHwAAACABDwAdbmFtZQAAAoQAAAFJAAACiCnmEVVwb3N0AAAD0AAAACMAAAA1DunpUnjaY2BkYGAAYja/oO54fpuvDNwsDCBwc4/6fzjtwNDNfICpBMjlYGACiQIAGVAKZnjaY2BkYGBu+N/AEMPCAALMBxgYGVABCwBVNgMsAAAAeNpjYGRgYGBhEGQA0QwMTEDMBYQMDP/BfAYACnYBLQB42mNgZGFgnMDAysDA1Ml0hoGBoR9CM75mMGLkAIoysDIzYAUBaa4pDA7PGJ4xMDf8b2CIYW5gaAAKM4LkANq9C9sAAHjaY2GAABYIdgAAAMAATQB42mNgYGBmgGAZBkYGELAB8hjBfBYGBSDNAoRA/jOG//8hpBQzVCUDIxsDjMnAyAQkmBhQASPDsAcAMCAGoQAAAAAAAAAAAAAAIgAAAAEAQACLA8ACdAAQAAAlASYiBhQXARYyNwE2NCYiBwIA/oYNIBkMAZcNIA0BlwwZIA3uAXoMGSAN/mkMDAGXDSAZDAB42n2QPU4DMRCFn/MHJBJCIKhdUQDa/JQpEyn0CKWjSDbekGjXXnmdSDkBLRUHoOUYHIAbINFyCl6WSZMia+3o85uZ57EBnOMbCv/fJe6EFY7xKFzBETLhKvUX4Rr5XbiOFj6FG9R/hJu4VQPhFi7UGx1U7YS7m9JtywpnGAhXcIon4Sr1lXCN/CpcxxU+hBvUv4SbGONXuIVrZakM4WEwQWCcQWOKDeMCMRwskjIG1qE59GYSzExPN3oRO5s4GyjvV2KXAx5oOeeAKe09t2a+Sif+YMuB1JhuHgVLtimNLiJ0KBtfLJzV3ahzsP2e7ba02L9rgTXH7FENbNT8Pdsz0khsDK+QkjXyMrekElOPaGus8btnKdbzXgiJTrzL9IjHmjR1OvduaeLA4ufyjBx9tLmSPfeoHD5jWQh5v91OxCCKXYY/k9hxGQAAAHjaY2BigAAuMMnIgA5YwKJMjExciUVF+eW6KfnleQAZ0wQyAAAAAAH//wACAAEAAAAMAAAAFgAAAAIAAQADAAMAAQAEAAAAAgAAAAB42mNgYGBkAIKrS9Q5QPTNPer/YTQAQ+0HIAAA) format('woff');
  99. font-weight: normal;
  100. font-style: normal;
  101. }
  102. .tui-collapse-icon {
  103. font-family: "tuiCollapse" !important;
  104. font-style: normal;
  105. -webkit-font-smoothing: antialiased;
  106. -moz-osx-font-smoothing: grayscale;
  107. }
  108. .tui-icon-arrow:before {
  109. content: "\e600";
  110. }
  111. .tui-icon-arrow {
  112. font-size: 32rpx;
  113. transform: rotate(0);
  114. transform-origin: center center;
  115. transition: all 0.3s;
  116. position: absolute;
  117. top: 50%;
  118. margin-top: -8px;
  119. right: 30rpx;
  120. }
  121. .tui-arrow-padding{
  122. padding-right: 62rpx;
  123. box-sizing: border-box;
  124. }
  125. .tui-icon-active {
  126. transform: rotate(180deg);
  127. transform-origin: center center;
  128. }
  129. .tui-header {
  130. position: relative;
  131. }
  132. .tui-collapse-body {
  133. overflow: hidden;
  134. transition: all 0.3s;
  135. }
  136. .tui-opacity{
  137. opacity: 0.6;
  138. }
  139. </style>