mirror of
https://github.com/movie-web/movie-web.git
synced 2024-12-24 18:41:48 +01:00
Fix scrolling to center if the element is on the low end of the thingy
This commit is contained in:
parent
6d24e8aa81
commit
0193e8f0c8
@ -13,10 +13,17 @@ interface PopoutListEntryTypes {
|
|||||||
errored?: boolean;
|
errored?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function PopoutSection(props: {
|
interface ScrollToActiveProps {
|
||||||
|
children: React.ReactNode;
|
||||||
|
className?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface PopoutSectionProps {
|
||||||
children?: React.ReactNode;
|
children?: React.ReactNode;
|
||||||
className?: string;
|
className?: string;
|
||||||
}) {
|
}
|
||||||
|
|
||||||
|
export function ScrollToActive(props: ScrollToActiveProps) {
|
||||||
const ref = createRef<HTMLDivElement>();
|
const ref = createRef<HTMLDivElement>();
|
||||||
const inited = useRef<boolean>(false);
|
const inited = useRef<boolean>(false);
|
||||||
|
|
||||||
@ -43,10 +50,14 @@ export function PopoutSection(props: {
|
|||||||
inline: "nearest",
|
inline: "nearest",
|
||||||
});
|
});
|
||||||
|
|
||||||
const activeYPositionCentered =
|
let activeYPositionCentered = 0;
|
||||||
active.getBoundingClientRect().top -
|
const setActiveYPositionCentered = () => {
|
||||||
wrapper.getBoundingClientRect().top +
|
activeYPositionCentered =
|
||||||
active.offsetHeight / 2;
|
active.getBoundingClientRect().top -
|
||||||
|
wrapper.getBoundingClientRect().top +
|
||||||
|
active.offsetHeight / 2;
|
||||||
|
};
|
||||||
|
setActiveYPositionCentered();
|
||||||
|
|
||||||
if (activeYPositionCentered >= wrapper.offsetHeight / 2) {
|
if (activeYPositionCentered >= wrapper.offsetHeight / 2) {
|
||||||
// Check if the active element is below the vertical center line, then scroll it into center
|
// Check if the active element is below the vertical center line, then scroll it into center
|
||||||
@ -54,17 +65,33 @@ export function PopoutSection(props: {
|
|||||||
top: activeYPositionCentered - wrapper.offsetHeight / 2,
|
top: activeYPositionCentered - wrapper.offsetHeight / 2,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setActiveYPositionCentered();
|
||||||
|
if (activeYPositionCentered > wrapper.offsetHeight / 2) {
|
||||||
|
// If the element is over the vertical center line, scroll to the end
|
||||||
|
wrapper.scrollTo({
|
||||||
|
top: wrapper.scrollHeight,
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
inited.current = true;
|
inited.current = true;
|
||||||
}, [ref]);
|
}, [ref]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={["p-5", props.className || ""].join(" ")} ref={ref}>
|
<div className={props.className} ref={ref}>
|
||||||
{props.children}
|
{props.children}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function PopoutSection(props: PopoutSectionProps) {
|
||||||
|
return (
|
||||||
|
<ScrollToActive className={["p-5", props.className || ""].join(" ")}>
|
||||||
|
{props.children}
|
||||||
|
</ScrollToActive>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
export function PopoutListEntry(props: PopoutListEntryTypes) {
|
export function PopoutListEntry(props: PopoutListEntryTypes) {
|
||||||
const bg = props.isOnDarkBackground ? "bg-ash-200" : "bg-ash-400";
|
const bg = props.isOnDarkBackground ? "bg-ash-200" : "bg-ash-400";
|
||||||
const hover = props.isOnDarkBackground
|
const hover = props.isOnDarkBackground
|
||||||
|
Loading…
Reference in New Issue
Block a user