use stick to bottom
1.0.0
useStickToBottom
Conçu en pensant aux chatbots IA, alimentant
bolt.new
par StackBlitz
Un hook + composant React léger et sans dépendance qui colle automatiquement au bas du conteneur et anime en douceur le contenu pour conserver sa position visuelle à l'écran pendant que du nouveau contenu est ajouté.
overflow-anchor
ce que Safari ne prend pas en charge.isAtBottom
et faire défiler par programme vers le bas.ResizeObserver
moderne mais bien prise en charge, pour détecter le redimensionnement du contenu.scrollToBottom
renvoie une Promise<boolean>
qui sera résolue à true
dès que le défilement a réussi, ou false
si le défilement a été annulé.<StickToBottom>
import { StickToBottom , useStickToBottomContext } from 'use-stick-to-bottom' ;
function Chat ( ) {
return (
< StickToBottom className = "h-[50vh] relative" resize = "smooth" initial = "smooth" >
< StickToBottom . Content className = "flex flex-col gap-4" >
{ messages . map ( ( message ) => (
< Message key = { message . id } message = { message } / >
) ) }
< / StickToBottom . Content >
< ScrollToBottom / >
{ /* This component uses `useStickToBottomContext` to scroll to bottom when the user enters a message */ }
< ChatBox / >
< / StickToBottom >
) ;
}
function ScrollToBottom ( ) {
const { isAtBottom , scrollToBottom } = useStickToBottomContext ( ) ;
return (
! isAtBottom && (
< button
className = "absolute i-ph-arrow-circle-down-fill text-4xl rounded-lg left-[50%] translate-x-[-50%] bottom-0"
onClick = { ( ) => scrollToBottom ( ) }
/ >
)
) ;
}
useStickToBottom
le crochet StickToBottom import { useStickToBottom } from 'use-stick-to-bottom' ;
function Component ( ) {
const { scrollRef , contentRef } = useStickToBottom ( ) ;
return (
< div style = { { overflow : 'auto' } } ref = { scrollRef } >
< div ref = { contentRef } >
{ messages . map ( ( message ) => (
< Message key = { message . id } message = { message } / >
) ) }
< / div >
< / div >
) ;
}