简易折叠面板

秒速五厘米 2023-01-19 11:52 84阅读 0赞

在这里插入图片描述
代码如下:

主文件:app.vue

  1. <template>
  2. <div id="app">
  3. <img alt="Vue logo" src="./assets/logo.png">
  4. <collpase>
  5. <collpase-item
  6. :title="item.name"
  7. :showAnimation="true"
  8. v-for="(item, i) in chapterList"
  9. :key="i"
  10. >
  11. <div class="list" v-for="(it, index) in item.list" :key="index">
  12. { { it.name}}
  13. </div>
  14. </collpase-item>
  15. </collpase>
  16. </div>
  17. </template>
  18. <script>
  19. import Collpase from './components/Collpase.vue';
  20. import CollpaseItem from './components/CollpaseItem.vue'
  21. export default {
  22. name: 'App',
  23. data() {
  24. return {
  25. chapterList: [
  26. {
  27. name: '标题一',
  28. list: [
  29. {
  30. name: '是是是是是是所'
  31. },
  32. {
  33. name: '啊啊啊啊'
  34. }
  35. ]
  36. },
  37. {
  38. name: '标题二',
  39. list: [
  40. {
  41. name: '是是是是是是所'
  42. },
  43. {
  44. name: '啊啊啊啊'
  45. },
  46. {
  47. name: '啊啊啊啊'
  48. }
  49. ]
  50. }
  51. ]
  52. }
  53. },
  54. components: {
  55. Collpase,
  56. CollpaseItem,
  57. }
  58. }
  59. </script>
  60. <style>
  61. #app {
  62. font-family: Avenir, Helvetica, Arial, sans-serif;
  63. -webkit-font-smoothing: antialiased;
  64. -moz-osx-font-smoothing: grayscale;
  65. text-align: center;
  66. color: #2c3e50;
  67. margin-top: 60px;
  68. }
  69. </style>

子组件:

  1. <template>
  2. <div class="collapse">
  3. <slot />
  4. </div>
  5. </template>
  6. <script>
  7. export default {
  8. name: 'Collapse',
  9. props: {
  10. accordion: {
  11. type: [Boolean, String],
  12. default: false
  13. }
  14. },
  15. provide() {
  16. return {
  17. collapse: this
  18. }
  19. },
  20. created() {
  21. this.childrens = []
  22. },
  23. methods: {
  24. onChange() {
  25. let activeItem = []
  26. this.childrens.forEach((vm) => {
  27. if (vm.isOpen) {
  28. activeItem.push(vm.nameSync)
  29. }
  30. })
  31. this.$emit('change', activeItem)
  32. }
  33. }
  34. }
  35. </script>
  36. <style lang="css" scoped>
  37. .collapse {
  38. width: 100%;
  39. display: flex;
  40. flex: 1;
  41. flex-direction: column;
  42. }
  43. </style>

子组件:

  1. <template>
  2. <div>
  3. <div :class="{ 'collapse-disabled': disabled,'collapse-cell--notdisabled': !disabled, 'collapse-cell--open': isOpen,'collapse-cell--hide':!isOpen }" class="collapse-cell">
  4. <div :class="{ 'collapse-disabled': disabled}" class="collapse-cell__title" @click="onClick">
  5. <span class="collapse-cell__title-text">{ { title }}</span>
  6. <img :class="{ 'active': isOpen, 'active-animation': showAnimation === true }" class="title-arrow" src="https://static-mumway.oss-cn-zhangjiakou.aliyuncs.com/NetworkFrontEnd/wsj/yslbq/btn_dropdown.png"/>
  7. </div>
  8. <div :class="{'collapse-cell__content--hide':!isOpen}" class="collapse-cell__content">
  9. <div :class="{ 'active-animation': showAnimation === true }" class="collapse-cell__wrapper" :style="{'transform':isOpen?'translateY(0)':'translateY(-50%)','-webkit-transform':isOpen?'translateY(0)':'translateY(-50%)'}">
  10. <slot />
  11. </div>
  12. </div>
  13. </div>
  14. </div>
  15. </template>
  16. <script>
  17. export default {
  18. name: 'UniCollapseItem',
  19. props: {
  20. title: {
  21. // 列表标题
  22. type: String,
  23. default: ''
  24. },
  25. name: {
  26. // 唯一标识符
  27. type: [Number, String],
  28. default: 0
  29. },
  30. disabled: {
  31. // 是否禁用
  32. type: Boolean,
  33. default: false
  34. },
  35. showAnimation: {
  36. // 是否显示动画
  37. type: Boolean,
  38. default: false
  39. },
  40. open: {
  41. // 是否展开
  42. type: Boolean,
  43. default: false
  44. },
  45. thumb: {
  46. // 缩略图
  47. type: String,
  48. default: ''
  49. }
  50. },
  51. data() {
  52. return {
  53. isOpen: false
  54. }
  55. },
  56. watch: {
  57. open(val) {
  58. this.isOpen = val
  59. }
  60. },
  61. inject: ['collapse'],
  62. created() {
  63. this.isOpen = this.open
  64. this.nameSync = this.name ? this.name : this.collapse.childrens.length
  65. this.collapse.childrens.push(this)
  66. if (String(this.collapse.accordion) === 'true') {
  67. if (this.isOpen) {
  68. let lastEl = this.collapse.childrens[this.collapse.childrens.length - 2]
  69. if (lastEl) {
  70. this.collapse.childrens[this.collapse.childrens.length - 2].isOpen = false
  71. }
  72. }
  73. }
  74. },
  75. methods: {
  76. onClick() {
  77. if (this.disabled) {
  78. return
  79. }
  80. if (String(this.collapse.accordion) === 'true') {
  81. this.collapse.childrens.forEach(vm => {
  82. if (vm === this) {
  83. return
  84. }
  85. vm.isOpen = false
  86. })
  87. }
  88. this.isOpen = !this.isOpen
  89. this.collapse.onChange && this.collapse.onChange()
  90. this.$forceUpdate()
  91. }
  92. }
  93. }
  94. </script>
  95. <style lang="css" scoped>
  96. .collapse-cell {
  97. flex-direction: column;
  98. border-color: #f0f0f0;
  99. border-bottom-width: 1px;
  100. }
  101. .collapse-cell--open {
  102. background-color: #fff;
  103. }
  104. .collapse-disabled {
  105. cursor: not-allowed !important;
  106. }
  107. .collapse-cell--hide {
  108. height: 48px;
  109. }
  110. .active-animation {
  111. transition-property: transform;
  112. transition-duration: 0.3s;
  113. transition-timing-function: ease;
  114. }
  115. .collapse-cell__title {
  116. border-bottom: 1px solid #f0f0f0;
  117. padding: 12px 20px;
  118. position: relative;
  119. display: flex;
  120. width: 100%;
  121. box-sizing: border-box;
  122. height: 44px;
  123. line-height: 44px;
  124. flex-direction: row;
  125. justify-content: space-between;
  126. align-items: center;
  127. cursor: pointer;
  128. }
  129. .collapse-cell__title-img {
  130. margin-right: 10px;
  131. }
  132. .title-arrow {
  133. width: 22px;
  134. height: 14px;
  135. }
  136. .active {
  137. transform: rotate(180deg);
  138. }
  139. .collapse-cell__title-text {
  140. flex: 1;
  141. font-size: 16px;
  142. margin-right: 16px;
  143. white-space: nowrap;
  144. color: #333333;
  145. font-weight: bold;
  146. lines: 1;
  147. overflow: hidden;
  148. text-overflow: ellipsis;
  149. }
  150. .collapse-cell__content {
  151. overflow-x: hidden;
  152. }
  153. .collapse-cell__wrapper {
  154. display: flex;
  155. flex-direction: column;
  156. }
  157. .collapse-cell__content--hide {
  158. height: 0px;
  159. line-height: 0px;
  160. }
  161. </style>

发表评论

表情:
评论列表 (有 0 条评论,84人围观)

还没有评论,来说两句吧...

相关阅读

    相关 jQuery 折叠面板

    手风琴是非常常见而实用的效果,本篇文章示例一个简单的手风琴效果。 上效果图: ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_