Si j'ai un en-tête sans défilement dans une page HTML, fixé en haut, ayant une hauteur définie:
Existe-t-il un moyen d'utiliser l'ancre URL (la #fragment
partie) pour que le navigateur défile jusqu'à un certain point de la page, tout en respectant la hauteur de l'élément fixe sans l'aide de JavaScript ?
http://foo.com/#bar
FAUX (mais le comportement commun): CORRECT: + --------------------------------- + + -------------- ------------------- + | BAR ///////////////////// en-tête | | //////////////////////// header | + --------------------------------- + + -------------- ------------------- + | Voici le reste du texte | | BAR | | ... | | | | ... | | Voici le reste du texte | | ... | | ... | + --------------------------------- + + -------------- ------------------- +
.dislocate50px, #bar { padding: 50px 0 0; margin: -50px 0 0; -webkit-background-clip: content-box; background-clip: content-box; }
scroll-padding-top
ici: css-tricks.com/… Réponse correspondante: stackoverflow.com/a/56467997/247696Réponses:
J'ai eu le même problème. Je l'ai résolu en ajoutant une classe à l'élément d'ancrage avec la hauteur de la barre supérieure comme valeur de remplissage supérieur.
Et puis simplement le CSS:
la source
margin-top: -90px;
pour contrer l'écart créé par le rembourrage..anchor:target {padding-top: 90px;}
sorte qu'il n'ait ajouté le rembourrage que lorsqu'ils ont utilisé la balise d'ancrage. De cette façon, il n'y a pas toujours un tas de rembourrage si la page se charge en haut. Seulement quand il charge un point spécifique plus bas sur la page.Si vous ne pouvez pas ou ne voulez pas définir une nouvelle classe, ajoutez un
::before
pseudo-élément à hauteur fixe au:target
pseudo-classe en CSS:Ou faites défiler la page par rapport à
:target
avec jQuery:la source
:target
était tout simplement génial!J'utilise cette approche:
Il ajoute un élément invisible devant chaque cible. Cela fonctionne IE8 +.
Voici d'autres solutions: http://nicolasgallagher.com/jump-links-and-viewport-positioning/
la source
Réponse officielle de Bootstrap:
Crédits
Fusionner
la source
display: flex;
oupadding-top
. Utilisez un élément d'ancrage dédié (comme<a name="my_link">{leave this empty}</a>
) dans ces cas.à partir de: https://css-tricks.com/fixed-headers-on-page-links-and-overlapping-content-oh-my/
la source
La meilleure façon que j'ai trouvée pour gérer ce problème est (remplacez 65 pixels par la hauteur de votre élément fixe):
Si vous n'aimez pas utiliser le sélecteur de cible , vous pouvez également le faire de cette façon:
Remarque: cet exemple ne fonctionnera pas si l'élément cible a une couleur d'arrière-plan différente de son parent. par exemple:
dans ce cas, la couleur verte de l'élément my-target écrasera son élément parent rouge en 65 pixels. Je n'ai trouvé aucune solution CSS pure pour gérer ce problème, mais si vous n'avez pas une autre couleur d'arrière-plan, cette solution est la meilleure.
la source
Bien que certaines des solutions proposées fonctionnent pour les liens de fragments (= liens de hachage) au sein de la même page (comme un lien de menu qui défile vers le bas), j'ai constaté qu'aucune d'entre elles ne fonctionnait dans Chrome actuel lorsque vous souhaitez utiliser des liens de fragments provenant d'autres pages .
Donc, appeler www.mydomain.com/page.html#foo à partir de zéro ne compensera PAS votre cible dans Chrome actuel avec l'une des solutions CSS ou JS données.
Il y a aussi un rapport de bogue jQuery décrivant certains détails du problème.
SOLUTION
La seule option que j'ai trouvée jusqu'à présent qui fonctionne vraiment dans Chrome est JavaScript qui n'est pas appelé onDomReady mais avec un retard.
SOMMAIRE
Sans délai JS, les solutions fonctionneront probablement dans Firefox, IE, Safari, mais pas dans Chrome.
la source
Comme la spécification CSS Scroll Snap entre en jeu, il est facilement possible avec la
scroll-margin-top
propriété. Fonctionne actuellement sur Chrome et Opera (avril 2019). De plus, Safari 11+ devrait prendre en charge cela, mais je n'ai pas pu l'exécuter sur Safari 11. Nous devons probablement attendre que les gars le résolvent là-bas.Exemple de Codepen
la source
scroll-padding-top
etscroll-margin-top
?scroll-margin-top
pour ce cas d'utilisation n'est malheureusement pas implémenté dans Safari 11-13: bugs.webkit.org/show_bug.cgi?id=189265scroll-snap-margin-top
: caniuse.com/#search=scroll-margin-topPour Chrome / Safari / Firefox, vous pouvez ajouter un
display: block
et utiliser une marge négative pour compenser le décalage, comme:Voir l'exemple http://codepen.io/swed/pen/RrZBJo
la source
Vous pouvez le faire avec jQuery:
la source
Je viens de découvrir une autre solution CSS pure qui a fonctionné comme un charme pour moi!
Trouvé sur ce site !
la source
Vous pouvez essayer ceci:
Définissez la valeur de remplissage supérieure à la hauteur réelle de votre en-tête. Cela introduira un léger espace supplémentaire en haut de votre en-tête, mais il ne sera visible que lorsque l'utilisateur sautera à l'ancre, puis défilera vers le haut. J'ai créé cette solution pour mon site en ce moment, mais elle ne montre qu'une petite barre fixe en haut de la page, rien de trop haut.
la source
Je l'ai fait fonctionner facilement avec CSS et HTML, en utilisant la méthode "anchor: before" mentionnée ci-dessus. Je pense que cela fonctionne le mieux, car il ne crée pas de rembourrage massif entre vos divs.
Cela ne semble pas fonctionner pour la première division de la page, mais vous pouvez y remédier en ajoutant un remplissage à cette première division.
Voici un violon fonctionnel: http://jsfiddle.net/FRpHE/24/
la source
Ça marche pour moi:
LIEN HTML vers l'ancre:
Ancre HTML:
CSS:
la source
Je n'ai pas eu de chance avec la réponse ci-dessus et j'ai fini par utiliser cette solution qui fonctionnait parfaitement ...
Créez un intervalle vierge à l'endroit où vous souhaitez définir votre ancre.
Et appliquez la classe suivante:
Cette solution fonctionnera même si les sections ont des arrière-plans colorés différents! J'ai trouvé la solution sur ce lien.
la source
J'utilise la réponse de @ Jpsy, mais pour des raisons de performances, je ne règle le minuteur que si le hachage est présent dans l'URL.
la source
J'ai eu beaucoup de problèmes avec la plupart des réponses ici et ailleurs car mes ancres mises en signet étaient des en-têtes de section dans une page FAQ, donc la compensation de l'en-tête n'a pas aidé car le reste du contenu resterait simplement où il était. J'ai donc pensé poster.
Ce que j'ai fini par faire était un composite de quelques solutions:
Le CSS:
Où "120px" est votre hauteur d'en-tête fixe (peut-être plus une marge).
Le lien du signet HTML:
Le contenu mis en signet HTML:
La bonne chose à propos de cette solution est que l'
span
élément n'est pas seulement caché, il est essentiellement réduit et ne remplit pas votre contenu.Je ne peux pas prendre beaucoup de crédit pour cette solution car elle provient d'un tas de ressources différentes, mais cela a fonctionné le mieux pour moi dans ma situation.
Vous pouvez voir le résultat réel ici .
la source
<span>
de l'ancre dans la travée, ainsi que l'ajout du rembourrage et de la marge ont fonctionné pour moi. Merci beaucoup d'avoir pris le temps de soumettre cette réponse malgré l'âge du fil!Cela semble un peu hacky à mon esprit puriste, mais en tant que solution CSS uniquement, vous pouvez ajouter un remplissage à l'élément ancré actif à l'aide du
:target
sélecteur:la source
Je trouve que je devais utiliser les deux MutttenXd « s et Badabam Les solutions CSS » ensemble, comme le premier n'a pas fonctionné dans Chrome et le second n'a pas fonctionné dans Firefox:
la source
La manière que je trouve la plus propre est la suivante:
la source
Une approche minimalement intrusive utilisant jQuery:
Lien:
Contenu:
Scénario:
En affectant la classe de lien d'ancrage aux liens, le comportement des autres liens (comme les contrôles d'accordéon ou de tabulation) n'est pas affecté.
La question ne veut pas de javascript mais l'autre question plus populaire est fermée à cause de celle-ci et je n'ai pas pu y répondre.
la source
J'avais besoin de quelque chose qui fonctionne pour les liens entrants, les liens sur la page ET qui peuvent être ciblés par JS afin que la page puisse répondre aux changements de hauteur de l'en-tête
HTML
CSS
Le
z-index: -1
permet aux liens dans la «zone de remplissage» au-dessus d'une cible-fragment d'être toujours cliquables, comme l'a commenté @MuttenXd sur sa réponseJe n'ai pas encore trouvé de problème dans IE 11, Edge 15+, Chrome 38+, FF 52+ ou Safari 9.1+
la source
Ce code devrait faire l'affaire. Échangez 45 pixels pour la hauteur de votre barre d'en-tête.
EDIT: Si l'utilisation de jQuery est une option, j'ai également réussi à utiliser jQuery.localScroll avec une valeur de décalage définie. L'option de décalage fait partie de jQuery.scrollTo, sur laquelle jQuery.localScroll est construit. Une démo est disponible ici: http://demos.flesler.com/jquery/scrollTo/ (deuxième fenêtre, sous 'offset')
la source
Voici une solution jquery complète qui fonctionnera dans IE:
Supposons que les éléments de la barre de navigation ressemblent à ceci:
Vous pouvez utiliser l'extrait de code jquery suivant pour compenser le défilement:
la source
L'implémentation a
:before
fonctionné très bien jusqu'à ce que nous réalisions que le pseudo-élément couvrait et bloquait réellement les événements de pointeur qui se trouvaient dans la zone du pseudo-élément. Utiliser quelque chose commepointer-events: none
sur le:before
ou même directement sur l'ancre n'a eu aucun effet.Ce que nous avons fini par faire était de rendre le positionnement de l'ancrage absolu, puis d'ajuster sa position pour qu'elle soit le décalage / la hauteur de la zone fixe.
Ancre décalée sans bloquer les événements de pointeur
La valeur de ceci est que nous ne bloquons aucun élément qui pourrait tomber dans ces 300 pixels. L'inconvénient est que la saisie de la position de cet élément dans Javascript doit prendre en compte ce décalage, de sorte que toute logique doit être ajustée.
la source
C'est ainsi que je l'ai fait pour enfin aller au bon endroit lorsque vous cliquez sur la navigation. J'ai ajouté un gestionnaire d'événements pour les clics de navigation. Ensuite, vous pouvez simplement utiliser "scrollBy" pour vous déplacer vers le haut sur le décalage.
la source
J'ai créé un div avec quelques sauts de ligne et j'ai donné l'id, j'ai ensuite mis le code que je voulais montrer en dessous. Le lien vous mènerait alors à l'espace au-dessus de l'image et l'en-tête ne serait plus gênant:
Bien sûr, vous pouvez modifier le nombre de sauts de ligne en fonction de vos besoins. Cela a parfaitement fonctionné pour moi, je ne sais pas s'il y a des problèmes, j'apprends encore le HTML.
la source
<br>
balises avant chaque titre.Utilisé ce script
la source
Je pense que cette approche est plus utile:
<h2 id="bar" title="Bar">Bar</h2>
la source
Vous pouvez maintenant utiliser scroll-margin-top , qui est assez largement adopté .
Ajoutez simplement le CSS suivant à l'élément vers lequel vous souhaitez faire défiler:
la source
scroll-margin-top
a été suggéré plus tôt dans ce fil