J'ai un div qui ne fait que 300 pixels de large et je le souhaite lorsque la page se charge, faites défiler vers le bas du contenu. Ce div a du contenu ajouté dynamiquement et doit rester défilé jusqu'en bas. Maintenant, si l'utilisateur décide de faire défiler vers le haut, je ne veux pas qu'il revienne en bas jusqu'à ce que l'utilisateur défile à nouveau vers le bas
Est-il possible d'avoir un div qui restera défilé vers le bas à moins que l'utilisateur ne fasse défiler vers le haut et lorsque l'utilisateur défile vers le bas, il doit se maintenir en bas même lorsqu'un nouveau contenu dynamique est ajouté. Comment pourrais-je aller créer ceci.
{position : relative; bottom:0;}
. Supprimez la propriété css une fois que l'utilisateur a fait défiler.Réponses:
Cela pourrait vous aider:
[EDIT], pour correspondre au commentaire ...
chaque fois que du contenu est ajouté, appelez la fonction updateScroll () ou réglez une minuterie:
si vous souhaitez mettre à jour UNIQUEMENT si l'utilisateur n'a pas bougé:
la source
setInterval
pour ce léger problème.J'ai pu faire fonctionner cela avec CSS uniquement.
L'astuce consiste à utiliser
display: flex;
etflex-direction: column-reverse;
Le navigateur traite le bas comme le haut. En supposant que les navigateurs que vous ciblez prennent en charge
flex-box
, la seule mise en garde est que le balisage doit être dans l'ordre inverse.Voici un exemple de travail. https://codepen.io/jimbol/pen/YVJzBg
la source
overflow:auto; display:flex; flex-direction:column-reverse;
au wrapper externe au lieu du wrapper interne.Je viens de l'implémenter et vous pouvez peut-être utiliser mon approche.
Disons que nous avons le code HTML suivant:
Ensuite, nous pouvons vérifier s'il a défilé vers le bas avec:
scrollHeight vous donne la hauteur de l'élément, y compris toute zone non visible en raison d'un débordement. clientHeight vous donne la hauteur CSS ou dit d'une autre manière, la hauteur réelle de l'élément. Les deux méthodes renvoient la hauteur sans
margin
, vous n'avez donc pas à vous en soucier. scrollTop vous donne la position du défilement vertical. 0 est le haut et max est le scrollHeight de l'élément moins la hauteur de l'élément lui-même. Lorsque vous utilisez la barre de défilement, il peut être difficile (c'était dans Chrome pour moi) de descendre la barre de défilement jusqu'en bas. j'ai donc ajouté une inexactitude de 1px. Il enisScrolledToBottom
sera de même même si la barre de défilement est à 1 px du bas. Vous pouvez définir ce paramètre comme bon vous semble.Il suffit ensuite de régler le scrollTop de l'élément au bas.
J'ai fait un violon pour vous montrer le concept: http://jsfiddle.net/dotnetCarpenter/KpM5j/
EDIT: extrait de code ajouté pour préciser quand
isScrolledToBottom
esttrue
.Collez la barre de défilement vers le bas
la source
if(!isScrolledToBottom)
: le test me semble faux (et n'a pas fonctionné dans mon code jusqu'à ce que je le corrige).out.scrollHeight - out.clientHeight <= out.scrollTop + 1
. Utilisez-vous un remplissage dans votre CSS?document.getScrollingElement
comme suggéré ici: stackoverflow.com/questions/36227559/scrolltop-always-returns-0/…Démo en direct: http://jsfiddle.net/KGfG2/
la source
la source
En 2020, vous pouvez utiliser l' accrochage css , mais avant Chrome 81, le changement de disposition ne déclenchera pas de réaccrochage , une interface utilisateur de chat css pure fonctionne sur Chrome 81, vous pouvez également vérifier Puis-je utiliser l'accrochage CSS .
Cette démo va casser le dernier élément s'il est visible, faites défiler vers le bas pour voir l'effet.
la source
Run code snippet
pour voir l'effet. (PS: si celaRun code snippet
ne fonctionne pas, essayez ceci: https://jsfiddle.net/Yeshen/xm2yLksu/3/ )Comment ça marche:
Le débordement par défaut est le défilement de haut en bas.
transform: rotate(180deg)
peut le faire défiler ou charger un bloc dynamique de bas en haut.https://blog.csdn.net/yeshennet/article/details/88880252
la source
Run code snippet
voir directement l'effet.Cela calculera la position ScrollTop à partir de la hauteur d'
#yourDivID
utilisation de la$(document).height()
propriété, de sorte que même si du contenu dynamique est ajouté à la division, le défilement sera toujours en position basse. J'espère que cela t'aides. Mais il a aussi un petit bug même si on fait défiler vers le haut et laisse le pointeur de la souris du scroller il arrivera automatiquement en position basse. Si quelqu'un pouvait aussi corriger cela, ce serait bien.la source
Voici ma version basée sur la réponse de dotnetCarpenter. Mon approche est une pure jQuery et j'ai nommé les variables pour rendre les choses un peu plus claires.
Fonctionne dans IE et chrome ..
la source
La réponse de Jim Hall est préférable car bien qu'elle ne défile pas vers le bas lorsque vous faites défiler vers le haut, elle est également pure CSS.
Malheureusement, ce n'est pas une solution stable: dans Chrome (peut-être en raison du problème de 1 px décrit par dotnetCarpenter ci-dessus),
scrollTop
se comporte de manière inexacte de 1 pixel, même sans interaction de l'utilisateur (lors de l'ajout d'élément). Vous pouvez définirscrollTop = scrollHeight - clientHeight
, mais cela gardera la div en position lorsqu'un autre élément est ajouté, alias la fonction "se garder en bas" ne fonctionne plus.Donc, en bref, l'ajout d'une petite quantité de Javascript (soupir) résoudra cela et remplira toutes les conditions:
Quelque chose comme https://codepen.io/anon/pen/pdrLEZ this (exemple par Coo), et après avoir ajouté un élément à la liste, également ce qui suit:
où 29 est la hauteur d'une ligne.
Ainsi, lorsque l'utilisateur fait défiler une demi-ligne (si c'est possible?), Le Javascript l'ignore et défile vers le bas. Mais je suppose que c'est négligeable. Et, il corrige le truc Chrome 1 px.
la source
Voici une solution basée sur un article de blog de Ryan Hunt . Cela dépend de la
overflow-anchor
propriété CSS, qui épingle la position de défilement à un élément au bas du contenu défilé.Notez que
overflow-anchor
cela ne fonctionne pas actuellement dans Safari ou Edge, donc cette solution ne fonctionne pas actuellement dans tous les navigateurs.la source
Vous pouvez utiliser quelque chose comme ça,
la source
Voici comment je l'ai abordé. Ma hauteur de div est de 650 pixels. J'ai décidé que si la hauteur de défilement est à moins de 150 px du bas, faites-la défiler automatiquement. Sinon, laissez-le à l'utilisateur.
la source