当前位置:首页 > React

react实现楼层效果

2026-01-27 20:07:16React

实现楼层效果的基本思路

楼层效果通常指页面滚动时,不同区块(楼层)依次固定在视口中的交互效果。React中可通过监听滚动事件、计算元素位置并结合CSS实现。

核心步骤

监听滚动事件 使用useEffect监听window的滚动事件,注意在组件卸载时移除监听以避免内存泄漏。

useEffect(() => {
  const handleScroll = () => {
    // 计算当前滚动位置对应的楼层
  };
  window.addEventListener('scroll', handleScroll);
  return () => window.removeEventListener('scroll', handleScroll);
}, []);

计算元素位置 通过getBoundingClientRect()获取每个楼层元素相对于视口的位置,结合window.scrollY判断当前应固定的楼层。

react实现楼层效果

const floorElements = document.querySelectorAll('.floor');
floorElements.forEach((el) => {
  const rect = el.getBoundingClientRect();
  if (rect.top <= 0 && rect.bottom >= 0) {
    // 当前可视区域匹配该楼层
  }
});

动态切换CSS类 为当前活跃楼层添加固定定位类(如.active-floor),其他楼层恢复默认样式。

.floor {
  height: 100vh;
  transition: transform 0.3s;
}
.active-floor {
  position: sticky;
  top: 0;
}

完整组件示例

import React, { useState, useEffect } from 'react';

const FloorNavigation = () => {
  const [activeFloor, setActiveFloor] = useState(0);

  useEffect(() => {
    const floors = document.querySelectorAll('.floor');
    const handleScroll = () => {
      floors.forEach((floor, index) => {
        const rect = floor.getBoundingClientRect();
        if (rect.top <= 100 && rect.bottom >= 100) {
          setActiveFloor(index);
        }
      });
    };
    window.addEventListener('scroll', handleScroll);
    return () => window.removeEventListener('scroll', handleScroll);
  }, []);

  return (
    <div>
      {[1, 2, 3, 4].map((floor, index) => (
        <div 
          key={index}
          className={`floor ${index === activeFloor ? 'active-floor' : ''}`}
          style={{ background: `hsl(${index * 90}, 50%, 80%)` }}
        >
          <h2>Floor {floor}</h2>
        </div>
      ))}
    </div>
  );
};

优化方案

节流滚动事件 高频滚动事件可能导致性能问题,建议使用lodash.throttle或自定义节流函数。

react实现楼层效果

import throttle from 'lodash.throttle';
const throttledScroll = throttle(handleScroll, 200);
window.addEventListener('scroll', throttledScroll);

Intersection Observer API 现代浏览器支持的更高效元素观察方案,替代手动计算位置。

const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      setActiveFloor(entry.target.dataset.floor);
    }
  });
}, { threshold: 0.5 });

useEffect(() => {
  const floors = document.querySelectorAll('.floor');
  floors.forEach(floor => observer.observe(floor));
  return () => observer.disconnect();
}, []);

导航指示器 添加侧边导航栏实时指示当前楼层位置,增强用户体验。

<div className="floor-indicator">
  {[1, 2, 3, 4].map((_, index) => (
    <button 
      key={index}
      className={index === activeFloor ? 'active' : ''}
      onClick={() => {
        document.querySelectorAll('.floor')[index].scrollIntoView();
      }}
    />
  ))}
</div>

标签: 楼层效果
分享给朋友:

相关文章

vue实现翻页效果

vue实现翻页效果

使用Vue实现翻页效果 在Vue中实现翻页效果通常需要结合分页组件和数据处理逻辑。以下是几种常见方法: 基础分页组件实现 <template> <div>…

js实现点击效果

js实现点击效果

实现点击效果的JavaScript方法 使用addEventListener绑定点击事件 通过document.getElementById或document.querySelector获取DOM元素…

vue 实现toogle效果

vue 实现toogle效果

使用 v-if 和 v-else 实现切换 通过 Vue 的指令 v-if 和 v-else 可以轻松实现元素的显示与隐藏切换。 <template> <button @c…

vue 实现动画效果

vue 实现动画效果

Vue 实现动画效果的方法 Vue 提供了多种方式实现动画效果,包括内置的过渡系统、第三方动画库以及 CSS 动画。以下是几种常见的方法: 使用 Vue 内置过渡系统 Vue 的 <trans…

vue实现弹窗效果

vue实现弹窗效果

使用 Vue 实现弹窗效果 组件化弹窗实现 创建独立的弹窗组件 Modal.vue,通过 v-if 或 v-show 控制显示状态: <template> <div class…

vue实现钟表效果

vue实现钟表效果

Vue 实现钟表效果 创建基础结构 在 Vue 项目中创建一个组件,用于显示钟表。组件的模板部分包含钟表的外观,如时针、分针、秒针和钟面。 <template> <div cl…