You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在小屏幕设备上应用不同的transition过渡效果?

根据屏幕宽度切换不同过渡效果

核心思路

通过监听窗口宽度变化,动态为目标元素切换不同的过渡类(或在框架中绑定不同的过渡名称),从而实现不同断点下的完全不同过渡效果。


原生JavaScript实现

步骤1:定义两种过渡的CSS类

/* 默认fly过渡 */
.fly-transition {
  transition: transform 0.5s ease;
  transform: translateX(0);
}
.fly-transition.enter {
  transform: translateX(100%);
}
.fly-transition.enter-active {
  transform: translateX(0);
}
.fly-transition.leave {
  transform: translateX(0);
}
.fly-transition.leave-active {
  transform: translateX(-100%);
}

/* 小屏fade过渡 */
.fade-transition {
  transition: opacity 0.3s ease;
  opacity: 1;
}
.fade-transition.enter {
  opacity: 0;
}
.fade-transition.enter-active {
  opacity: 1;
}
.fade-transition.leave {
  opacity: 1;
}
.fade-transition.leave-active {
  opacity: 0;
}

步骤2:JS监听窗口大小并切换类

const targetElement = document.getElementById('transition-target');

// 切换过渡类的逻辑
function updateTransition() {
  if (window.innerWidth < 600) {
    targetElement.classList.replace('fly-transition', 'fade-transition');
  } else {
    targetElement.classList.replace('fade-transition', 'fly-transition');
  }
}

// 初始化执行
updateTransition();
// 监听窗口 resize 事件
window.addEventListener('resize', updateTransition);

Vue3 框架实现

利用Vue的Transition组件动态绑定name属性,结合窗口宽度监听实现切换:

<template>
  <Transition :name="transitionName">
    <div v-if="showContent" class="content">
      <!-- 自定义内容 -->
    </div>
  </Transition>
</template>

<script setup>
import { ref, onMounted, watch } from 'vue';

const showContent = ref(true);
const transitionName = ref('fly');
const windowWidth = ref(window.innerWidth);

// 更新过渡类型
function updateTransition() {
  transitionName.value = windowWidth.value < 600 ? 'fade' : 'fly';
}

onMounted(() => {
  // 监听窗口大小变化
  window.addEventListener('resize', () => {
    windowWidth.value = window.innerWidth;
  });
  updateTransition();
});

// 监听窗口宽度变化自动更新过渡
watch(windowWidth, updateTransition);
</script>

<style scoped>
/* fly过渡样式 */
.fly-enter-from { transform: translateX(100%); }
.fly-enter-active, .fly-leave-active { transition: transform 0.5s ease; }
.fly-leave-to { transform: translateX(-100%); }

/* fade过渡样式 */
.fade-enter-from, .fade-leave-to { opacity: 0; }
.fade-enter-active, .fade-leave-active { transition: opacity 0.3s ease; }
</style>

React 框架实现(结合react-transition-group)

通过useState管理过渡类型,useEffect监听窗口大小变化:

import { useState, useEffect } from 'react';
import { CSSTransition } from 'react-transition-group';

function ResponsiveTransition() {
  const [showContent, setShowContent] = useState(true);
  const [transitionType, setTransitionType] = useState('fly');

  useEffect(() => {
    const updateTransition = () => {
      setTransitionType(window.innerWidth < 600 ? 'fade' : 'fly');
    };

    // 初始化设置
    updateTransition();
    // 监听窗口resize
    window.addEventListener('resize', updateTransition);

    // 清理监听
    return () => window.removeEventListener('resize', updateTransition);
  }, []);

  return (
    <CSSTransition
      in={showContent}
      timeout={transitionType === 'fly' ? 500 : 300}
      classNames={transitionType}
      unmountOnExit
    >
      <div className="content">
        {/* 自定义内容 */}
      </div>
    </CSSTransition>
  );
}

export default ResponsiveTransition;

对应的全局CSS:

/* fly过渡 */
.fly-enter { transform: translateX(100%); }
.fly-enter-active {
  transform: translateX(0);
  transition: transform 500ms ease;
}
.fly-exit { transform: translateX(0); }
.fly-exit-active {
  transform: translateX(-100%);
  transition: transform 500ms ease;
}

/* fade过渡 */
.fade-enter { opacity: 0; }
.fade-enter-active {
  opacity: 1;
  transition: opacity 300ms ease;
}
.fade-exit { opacity: 1; }
.fade-exit-active {
  opacity: 0;
  transition: opacity 300ms ease;
}

内容的提问来源于stack exchange,提问作者Johnny _JTH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 06:35:31