我一直无法使用Vue JS 3将淡入淡出应用到图像上.过渡对文本效果很好,但图像只是加载和渲染,就像正常情况下没有应用过渡一样.

我一直在try 创建一个图像加载器,它将显示一个加载微调,直到图像加载,然后淡出加载微调,一旦图像加载图像.当前加载微调按预期淡出,但图像不淡入.

下面是我在图像元素中拥有的内容:

<script setup>
  import FadeTransition from '../transitions/fade-transition.vue';
  import { reactive } from 'vue'

  const props = defineProps({
    imgUrl: String,
    route: String
  })

  let getURL = function () {
    return new URL(props.imgUrl, import.meta.url);
  }

  let show = reactive({showing: false});
  let showImg = function () {
    show.showing = true;
  }
</script>

<template>
  <div class="frame">
    <FadeTransition><div v-show="!show.showing" class="loader"></div></FadeTransition>
    <RouterLink :to="props.route"><FadeTransition><img v-show="show.showing" class="image" :src="getURL()" @load="showImg()"/></FadeTransition></RouterLink>
  </div>
</template>

<style scoped>
  .frame {
    width: 33.3333%;
    aspect-ratio: 1/1;
    margin: 0px;
    /*inline-block leaves space for descenders (e.g: letter y or g) so space between rows is wrong*/
    display: inline-flex;
    position: relative;
    padding: 6px;
  }

  .image {
    width: calc(100% - 12px);
    height: calc(100% - 12px);
    position: absolute;
  }

  .loader {
    border: 4px solid var(--grey);
    border-top: 4px solid var(--darkGrey);
    border-radius: 50%;
    width: 30px;
    height: 30px;
    animation: spin 5s linear infinite;
    position: absolute;
    left: calc(50% - 15px);
    top: calc(50% - 15px);
  }

  @keyframes spin {
    0% { transform: rotate(0deg); }
    100% { transform: rotate(360deg); }
  }
</style>

而FadeTransition组件是:

<script>
</script>

<template>
  <Transition name="fade">
    <slot></slot> 
  </Transition>
</template>

<style>
  .fade-enter-active, 
  .fade-leave-active {
    transition: opacity 0.5s ease;
  }

  .fade-enter-from, 
  .fade-leave-to {
    opacity: 0;
  }
</style>

我已经try 将图像交换为文本块,它工作正常,这使我得出结论,我遇到的问题是没有正确地将过渡应用于图像.

如何才能将过渡正确应用于图像?

推荐答案

嗯,我能告诉你的是,它似乎在playground米的速度下工作得很好

如果imgUrl是一个props ,我会添加一个观察器,在URL更改时重置组件:

watch(
  () => props.imgUrl,
  () => {
    show.showing = false
  },
  {immediate: true}
)

否则,当URL在初始加载后发生变化时,不会触发加载动画和淡出.

其余的看起来都很好.

如果我遗漏了什么,请告诉我.

Vue.js相关问答推荐

Visual Studio代码中的VUE/VLAR扩展不断崩溃:JS/TS语言服务立即崩溃5次…

Vue3:如何在功能组件中重用插槽vnode

在移动版本中使用标准的 v-data-table

vue 不重新渲染数据更改

如何 for each 动态创建的按钮/文本字段设置唯一变量?

如何通过 setup() 发出多个参数?

使用带有 v-date-picker 的 new Date() 不起作用

vuejs 中的单元测试

如何从我的 Vuetify 数据表中正确更新 Vuex 状态

如何将 Nuxt.js 更新到最新版本

VueJS 禁用特定属性的react性

从 Url 中删除查询字符串参数

如何在某些路由上隐藏全局组件(例如导航栏)?

Vuejs 3 从子组件向父组件发出事件

Vuetify Jest 未知自定义元素

VueJS错误避免直接改变props

单击时交换组件

更改事件上的 Select2 在 Vuejs 中不起作用

使用 Vee-validate 禁用按钮,直到正确填写表单

如何订阅store 模块