https://cn.vuejs.org/v2/guide/transitions.html https://godbasin.github.io/vue-ebook/vue-ebook/6.html#_6-1-transition-%E7%BB%84%E4%BB%B6

    Vue 提供了 transition 的封装组件,在下列情形中,可以给任何元素和组件添加进入/离开过渡

    • 条件渲染 (使用 v-if)
    • 条件展示 (使用 v-show)
    • 动态组件
    • 组件根节点

    对于这些在过渡中切换的类名来说,如果你使用一个没有名字的 ,则 v- 是这些类名的默认前缀。如果你使用了 ,那么 v-enter 会替换为 my-transition-enter。
    image.png

    1. <template>
    2. <!-- transition的使用 -->
    3. <div id="demo">
    4. <button v-on:click="show = !show">
    5. Toggle
    6. </button>
    7. <transition name="fade">
    8. <p v-if="show">hello</p>
    9. </transition>
    10. </div>
    11. </template>
    12. <script>
    13. new Vue({
    14. el: "#demo",
    15. data: {
    16. show: true
    17. }
    18. });
    19. </script>
    20. <style>
    21. /* 简单的css transition实现动画 */
    22. .fade-enter-active,
    23. .fade-leave-active {
    24. transition: opacity 0.5s;
    25. }
    26. .fade-enter, .fade-leave-to /* .fade-leave-active below version 2.1.8 */ {
    27. opacity: 0;
    28. }
    29. </style>

    轮播图实现:
    https://code.h5jun.com/wife/48/edit?html,css,js,console

    1. <!DOCTYPE html>
    2. <!--
    3. Created using JS Bin
    4. http://code.h5jun.com
    5. Copyright (c) 2021 by mewcoder (//code.h5jun.com/wife/48/edit)
    6. Released under the MIT license: http://jsbin.mit-license.org
    7. -->
    8. <meta name="robots" content="noindex">
    9. <html>
    10. <head>
    11. <meta charset="utf-8">
    12. <meta name="viewport" content="width=device-width">
    13. <title>JS Bin</title>
    14. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
    15. <style id="jsbin-css">
    16. .slide-enter-active,
    17. .slide-leave-active {
    18. transition: transform .3s;
    19. }
    20. .slide-enter {
    21. transform: translateX(100%);
    22. }
    23. .slide-enter-to {
    24. transform: translateX(0);
    25. }
    26. .slide-leave {
    27. transform: translateX(0);
    28. }
    29. .slide-leave-to {
    30. transform: translateX(-100%);
    31. }
    32. .list {
    33. position: relative;
    34. width: 300px;
    35. height: 200px;
    36. border: 1px solid red;
    37. overflow: hidden;
    38. }
    39. .item {
    40. position: absolute;
    41. top: 0;
    42. left: 0;
    43. }
    44. img {
    45. width: 100%;
    46. height: 100%
    47. }
    48. </style>
    49. </head>
    50. <body>
    51. <div id="app">
    52. <div class="list">
    53. <div v-for="(item,index) in list" :key="index">
    54. <transition name="slide">
    55. <div v-if="index === currentIndex" :key="item" class="item">
    56. <img :src="item" />
    57. </div>
    58. </transition>
    59. </div>
    60. </div>
    61. <button @click="slide(-1)">-</button>
    62. </div>
    63. <script id="jsbin-javascript">
    64. // 重点好像在绝对定位
    65. new Vue({
    66. el: '#app',
    67. data: {
    68. currentIndex: 0,
    69. list: ["https://p5.ssl.qhimg.com/t0119c74624763dd070.png",
    70. "https://p4.ssl.qhimg.com/t01adbe3351db853eb3.jpg",
    71. "https://p2.ssl.qhimg.com/t01645cd5ba0c3b60cb.jpg",
    72. "https://p4.ssl.qhimg.com/t01331ac159b58f5478.jpg"
    73. ],
    74. },
    75. methods: {
    76. slide(step) {
    77. this.currentIndex = (this.currentIndex + step + 4) % 4;
    78. }
    79. }
    80. })
    81. </script>
    82. </body>
    83. </html>

    为什么用绝对定位? https://www.bilibili.com/video/BV1ht4y1D7C1?p=2 7:10左右