带有 Tailwind css 的 Vue 过渡在淡出时不可见

Posted

技术标签:

【中文标题】带有 Tailwind css 的 Vue 过渡在淡出时不可见【英文标题】:Vue transitions with Tailwind css not visible on fade out 【发布时间】:2021-07-27 20:57:23 【问题描述】:

我使用 Tailwind css 和 Vue.js 来创建模态。 由于 Tailwind 不支持 Vue 2,因此我必须添加过渡。 你可以在这里看到想要的效果: https://tailwindui.com/components/application-ui/overlays/modals

代码如下:

<template>
  <div>
    <button @click="show = true">Click</button>

    <!-- This example requires Tailwind CSS v2.0+ -->
    <div v-show="show" class="fixed z-10 inset-0 overflow-y-auto" aria-labelledby="modal-title" role="dialog" aria-modal="true">
      <div class="flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0">
        <!--
          Background overlay, show/hide based on modal state.

          Entering: "ease-out duration-300"
            From: "opacity-0"
            To: "opacity-100"
          Leaving: "ease-in duration-200"
            From: "opacity-100"
            To: "opacity-0"
        -->
        <transition name="ease-out-overlay">
          <div v-show="show" class="fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity"></div>
        </transition>

        <!-- This element is to trick the browser into centering the modal contents. -->
        <span class="hidden sm:inline-block sm:align-middle sm:h-screen" aria-hidden="true">&#8203;</span>

        <!--
          Modal panel, show/hide based on modal state.

          Entering: "ease-out duration-300"
            From: "opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"
            To: "opacity-100 translate-y-0 sm:scale-100"
          Leaving: "ease-in duration-200"
            From: "opacity-100 translate-y-0 sm:scale-100"
            To: "opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"
        -->
        <transition name="ease-out-modal">
          <div v-show="show" class="inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full">
            <div class="bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4">
              <div class="sm:flex sm:items-start">
                <div class="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-12 rounded-full bg-red-100 sm:mx-0 sm:h-10 sm:w-10">
                  <!-- Heroicon name: outline/exclamation -->
                  <svg class="h-6 w-6 text-red-600" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor">
                    <path stroke-linecap="round" stroke-linejoin="round" stroke- d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" />
                  </svg>
                </div>
                <div class="mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left">
                  <h3 class="text-lg leading-6 font-medium text-gray-900" id="modal-title">
                    Deactivate account
                  </h3>
                  <div class="mt-2">
                    <p class="text-sm text-gray-500">
                      Are you sure you want to deactivate your account? All of your data will be permanently removed. This action cannot be undone.
                    </p>
                  </div>
                </div>
              </div>
            </div>
            <div class="bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse">
              <button @click="show = false" type="button" class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-red-600 text-base font-medium text-white hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500 sm:ml-3 sm:w-auto sm:text-sm">
                Deactivate
              </button>
              <button type="button" class="mt-3 w-full inline-flex justify-center rounded-md border border-gray-300 shadow-sm px-4 py-2 bg-white text-base font-medium text-gray-700 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 sm:mt-0 sm:ml-3 sm:w-auto sm:text-sm">
                Cancel
              </button>
            </div>
          </div>
        </transition>
      </div>
    </div>

  </div>
</template>

<script lang="ts">
import  Component, Vue, Prop  from 'nuxt-property-decorator';

@Component
export default class TestModal extends Vue 
  @Prop( type: Boolean, required: false )
  show: boolean = false;

  layout () 
    return 'none';
  

</script>

<style scoped>

.ease-out-overlay-enter-active, .ease-out-overlay-leave-active 
  @apply opacity-100 duration-300;


.ease-out-overlay-enter, .ease-out-overlay-leave-to /* .fade-leave-active below version 2.1.8 */ 
  @apply ease-in opacity-0 duration-200;


.ease-out-modal-enter-active, .ease-out-modal-leave-active 
  @apply opacity-100 translate-y-0 sm:scale-100 duration-300;


.ease-out-modal-enter, .ease-out-modal-leave-to /* .fade-leave-active below version 2.1.8 */ 
  @apply ease-in opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95 duration-200;


</style>

当模态出现时过渡可见,但在消失时不可见。我不确定我做错了什么。

关于在关闭模式时如何进行转换有什么想法吗?

【问题讨论】:

【参考方案1】:

这是由于第 6 行包含 v-show="show" 的标签没有围绕它的转换造成的。

如果您使用leave-active-class="duration-300" 将该标签包装在另一个转换中,它将延迟该标签的消失,直到您的内部转换完成。

这是一个例子:https://codesandbox.io/s/nice-sky-o3be8?file=/pages/index.vue

【讨论】:

以上是关于带有 Tailwind css 的 Vue 过渡在淡出时不可见的主要内容,如果未能解决你的问题,请参考以下文章

带有 Vue js 道具的反应式 Tailwind 类

Vue深度学习-过渡效果

在哪里可以找到带有 js 代码的 Tailwind css 组件?

Vue CLI + Tailwind:使用 CSS 变量进行主题化

Tailwind 不适用于带有 Sass 的 vue 4.3.1

将 Tailwind.css 添加到 Vue.js 项目后,某些类没有效果