diff --git a/src/components/MultiLevelSelector.tsx b/src/components/MultiLevelSelector.tsx index 01dbef0..b7f8bfc 100644 --- a/src/components/MultiLevelSelector.tsx +++ b/src/components/MultiLevelSelector.tsx @@ -263,19 +263,19 @@ const MultiLevelSelector: React.FC = ({ const categories: MultiLevelCategory[] = [ ...(contentType !== 'anime-tv' && contentType !== 'anime-movie' ? [ - { - key: 'type', - label: '类型', - options: getTypeOptions(contentType), - }, - ] + { + key: 'type', + label: '类型', + options: getTypeOptions(contentType), + }, + ] : [ - { - key: 'label', - label: '类型', - options: getLabelOptions(contentType), - }, - ]), + { + key: 'label', + label: '类型', + options: getLabelOptions(contentType), + }, + ]), { key: 'region', label: '地区', @@ -305,15 +305,15 @@ const MultiLevelSelector: React.FC = ({ }, // 只在电视剧和综艺时显示平台选项 ...(contentType === 'tv' || - contentType === 'show' || - contentType === 'anime-tv' + contentType === 'show' || + contentType === 'anime-tv' ? [ - { - key: 'platform', - label: '平台', - options: getPlatformOptions(contentType), - }, - ] + { + key: 'platform', + label: '平台', + options: getPlatformOptions(contentType), + }, + ] : []), { key: 'sort', @@ -460,11 +460,12 @@ const MultiLevelSelector: React.FC = ({ return value === optionValue; }; - // 监听滚动和窗口大小变化事件,重新计算位置 + // 监听滚动和窗口大小变化事件 useEffect(() => { const handleScroll = () => { + // 滚动时直接关闭面板,而不是重新计算位置 if (activeCategory) { - calculateDropdownPosition(activeCategory); + setActiveCategory(null); } }; @@ -474,10 +475,11 @@ const MultiLevelSelector: React.FC = ({ } }; - window.addEventListener('scroll', handleScroll); + // 监听 body 滚动事件,因为该项目的滚动容器是 document.body + document.body.addEventListener('scroll', handleScroll, { passive: true }); window.addEventListener('resize', handleResize); return () => { - window.removeEventListener('scroll', handleScroll); + document.body.removeEventListener('scroll', handleScroll); window.removeEventListener('resize', handleResize); }; }, [activeCategory]); @@ -514,21 +516,19 @@ const MultiLevelSelector: React.FC = ({ > diff --git a/src/components/SearchResultFilter.tsx b/src/components/SearchResultFilter.tsx index 4ecb400..93cfa2c 100644 --- a/src/components/SearchResultFilter.tsx +++ b/src/components/SearchResultFilter.tsx @@ -111,15 +111,19 @@ const SearchResultFilter: React.FC = ({ categories, val useEffect(() => { const handleScroll = () => { - if (activeCategory) calculateDropdownPosition(activeCategory); + // 滚动时直接关闭面板,而不是重新计算位置 + if (activeCategory) { + setActiveCategory(null); + } }; const handleResize = () => { if (activeCategory) calculateDropdownPosition(activeCategory); }; - window.addEventListener('scroll', handleScroll); + // 监听 body 滚动事件,因为该项目的滚动容器是 document.body + document.body.addEventListener('scroll', handleScroll, { passive: true }); window.addEventListener('resize', handleResize); return () => { - window.removeEventListener('scroll', handleScroll); + document.body.removeEventListener('scroll', handleScroll); window.removeEventListener('resize', handleResize); }; }, [activeCategory]);