当前位置:首页 > 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判断当前应固定的楼层。

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或自定义节流函数。

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>

react实现楼层效果

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

相关文章

css3制作立体效果

css3制作立体效果

使用 transform 属性实现立体旋转 通过 transform-style: preserve-3d 和 rotateX/Y/Z 实现 3D 空间变换: .container { tr…

jquery 效果

jquery 效果

jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。jQuery 提供了丰富的效果(Effects)功能,可以轻松实现元素的动态显…

react如何添加效果

react如何添加效果

React 添加动画效果的方法 使用 CSS 过渡动画 在 React 组件中直接通过 className 或 style 属性应用 CSS 过渡效果。定义 CSS 类包含 transition 属性…

js实现点击效果

js实现点击效果

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

vue实现过渡效果

vue实现过渡效果

Vue 过渡效果实现方法 Vue 提供了内置的 <transition> 和 <transition-group> 组件,用于在元素或组件进入/离开 DOM 时应用过渡效果。以…

vue实现过度效果

vue实现过度效果

Vue 过渡效果实现方法 Vue 提供了内置的 <transition> 和 <transition-group> 组件,用于在元素或组件进入/离开 DOM 时应用过渡效果。…