index.vue 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <template>
  2. <div class="edit-layout">
  3. <div class="edit-bar">
  4. <span>{{name}}</span>
  5. <span :class="{active:!isActive}" @click="clickhandle">{{oper}}</span>
  6. </div>
  7. <div class="slot" :style="{maxHeight:isActive?'800px':'0'}">
  8. <slot name="show" ></slot>
  9. </div>
  10. <div class="slot" :style="{maxHeight:!isActive?'800px':'0'}">
  11. <slot name="edit"></slot>
  12. </div>
  13. </div>
  14. </template>
  15. <script>
  16. export default {
  17. props: ['name', 'oper', 'isActive'],
  18. methods: {
  19. clickhandle () {
  20. this.$emit('clickOper')
  21. }
  22. }
  23. }
  24. </script>
  25. <style lang="scss" scoped>
  26. .edit-layout{
  27. padding: 30px 0 30px 40px;
  28. width: 850px;
  29. border-bottom: 1px solid #e7e7e7;
  30. .edit-bar{
  31. font-size: 16px;
  32. display: flex;
  33. justify-content: space-between;
  34. span{
  35. &:last-of-type{
  36. position: relative;
  37. padding-right: 20px;
  38. cursor: pointer;
  39. &::after{
  40. content: '';
  41. border: 9px solid transparent;
  42. border-top-color: #000;
  43. border-left-width: 5px;
  44. border-right-width: 5px;
  45. position: absolute;
  46. margin-top: 5px;
  47. right: 0;
  48. top: 50%;
  49. transition: all 0.5s cubic-bezier(0.77, 0, 0.175, 1);
  50. z-index: 1;
  51. transform-origin: center 25%;
  52. transform: translateY(-50%);
  53. }
  54. }
  55. }
  56. .active{
  57. &:last-of-type{
  58. &::after{
  59. transform: translateY(-50%) rotate(180deg);
  60. }
  61. }
  62. }
  63. }
  64. .slot{
  65. overflow: hidden;
  66. transition: max-height 0.5s ease;
  67. }
  68. }
  69. </style>