Fixe-tête de page les chevauchements dans les pages des ancres
Si j'ai un non-défilement d'en-tête dans une page HTML, fixés sur la partie supérieure, ayant une hauteur définie:
Est-il possible d'utiliser l'URL d'ancrage (la #fragment
partie) navigateur pour faire défiler jusqu'à un certain point dans la page, mais toujours respecter la hauteur de l'élément fixe sans l'aide de JavaScript?
http://foo.com/#bar
MAL (mais le comportement commun): CORRECT: +---------------------------------+ +---------------------------------+ | BAR/////////////////////l'en-tête| | ////////////////////////en-tête | +---------------------------------+ +---------------------------------+ | Voici le reste du Texte | | BAR | | ... | | | | ... | | Ici, c'est le reste du Texte | | ... | | ... | +---------------------------------+ +---------------------------------+
- Connexes: stackoverflow.com/questions/10732690/...
- css-tricks.com/hash-tag-links-padding
- OUI, c'est la meilleure réponse. Vérifiez également nicolasgallagher.com/jump-links-and-viewport-positioning/demo à l'intérieur. Ce qui a le mieux fonctionné pour moi:
.dislocate50px, #bar { padding: 50px 0 0; margin: -50px 0 0; -webkit-background-clip: content-box; background-clip: content-box; }
- je suis à la recherche d'une solution qui fonctionne pour les ancres à venir à partir de la même page ou sur une autre page, * et qui s'adapte de la page vers le bas sur une touche afin que le contenu ne pas être coupés en-tête, * et qui permet sib-div pied de page pour faire défiler jusqu'à un contenu de la div. N'ai pas trouvé de solution pour le moment! Mais je dois dire, je pense que la bonne façon serait de cibler l'ensemble de la div du contenu, et non pas de chaque individu d'ancrage. stackoverflow.com/questions/51070758/...
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même problème.
Je l'ai résolu en ajoutant une classe à l'élément d'ancrage avec la topbar hauteur que le padding-top valeur.
Et puis tout simplement la css:
<span>
au lieu de<a>
pour éviter la couleur de l'actualité.margin-top: -90px;
pour contrer le vide créé par le rembourrage..anchor:target {padding-top: 90px;}
de sorte qu'il ne fait qu'ajouter du rembourrage quand ils ont utilisé la balise d'ancrage. De cette façon, il n'y a pas toujours un tas de rembourrage si le chargement de la page en haut. Seulement quand il charge un certain moment les plus bas sur la page.$(function(){ $('#jump').click(function() { $('#id').addClass("anchor"); }); $('.top').click(function() { $('#id').removeClass("anchor"); }); });
Si vous ne pouvez pas ou ne souhaitez pas définir une nouvelle classe, ajoutez une hauteur fixe
::avant
pseudo-élément de la:target
pseudo-classe CSS:Ou faites défiler la page par rapport à
:target
avec jQuery::target
était tout simplement Génial!$(document).ready()
display: table;
alors il ne fonctionnera pas.- Je utiliser cette approche:
Il ajoute un élément invisible avant chaque cible. Il fonctionne IE8+.
Voici plusieurs solutions:
http://nicolasgallagher.com/jump-links-and-viewport-positioning/
Officiel De Bootstrap Adopté Réponse:
Crédits
Fusion
*
est implicite,[id]:before
fonctionne aussi bienLa meilleure façon que j'ai trouvé de traiter ce problème est (remplacer 65px avec votre élément fixe hauteur):
Si vous n'aimez pas utiliser le cible sélecteur vous pouvez aussi le faire de cette façon:
Remarque: cet exemple ne fonctionnera pas si l'élément cible ont un backgound couleur que differant de son parent.
par exemple:
dans ce cas, le vert la couleur de mes-élément cible va écraser son parent rouge élément 65px.
Je n'ai pas trouvé pur CSS solution pour faire face à ce problème, mais si vous n'avez pas d'autre couleur d'arrière-plan de cette solution est la meilleure.
Alors que certaines propositions de solutions de travail pour fragment de liens (= hash liens) dans la même page (comme un lien de menu qui défile vers le bas), j'ai trouvé qu'aucun d'entre eux travaillaient dans le courant de Chrome lorsque vous voulez utiliser le fragment de liens à venir dans à partir d'autres pages.
Afin de l'appelant http://www.mydomain.com/page.html#foo à partir de zéro sera PAS compenser votre cible actuelle de Chrome avec tout le CSS solutions ou JS solutions.
Il y a aussi un jQuery rapport de bug décrivant certains détails du problème.
SOLUTION
La seule option que j'ai trouvé jusqu'à présent qui fonctionne vraiment en Chrome est le JavaScript qui n'est pas appelé onDomReady mais avec un retard.
RÉSUMÉ
Sans JS retard solutions fonctionnera probablement dans Firefox, IE, Safari, mais pas dans google Chrome.
Pour google Chrome/Safari/Firefox, vous pouvez ajouter un
display: block
et l'utilisation d'une marge négative pour compenser le décalage, comme:Voir l'exemple http://codepen.io/swed/pen/RrZBJo
Vous pouvez le faire avec jQuery:
Vous pouvez essayer ceci:
Le jeu en haut de rembourrage de la valeur à la hauteur de votre en-tête. Cela va introduire un léger supplément d'avance au sommet de votre tête, mais il ne sera visible que lorsque l'utilisateur passe à l'ancre, puis défiler vers le haut. J'ai composé cette solution pour mon site dès maintenant, mais il n'affiche une petite barre fixe en haut de la page, rien de trop haut.
Ça fonctionne pour moi:
HTML LIEN vers l'Ancre:
Ancre HTML:
CSS :
J'ai eu de travailler plus facilement avec le CSS et le HTML, à l'aide de la "ancre:avant de" méthode mentionnée ci-dessus. Je pense qu'il fonctionne le mieux, car il n'est pas de créer des rembourrage entre votre divs.
Il ne semble pas fonctionner pour la première div sur la page, mais vous pouvez contrer que par l'ajout d'un rembourrage pour cette première div.
Voici un travail de violon: http://jsfiddle.net/FRpHE/24/
Il se sent un peu hacky à mon puriste de l'esprit, mais comme une css, la seule solution, vous pouvez ajouter un rembourrage à l'actif ancré élément à l'aide de la
:target
sélecteur:CSS:
HTML:
J'ai trouvé, j'ai dû utiliser les deux MutttenXd's et Badabams'CSS ensemble des solutions, que le premier n'a pas de travail dans le Chrome et le deuxième ne fonctionne pas dans Firefox:
Je suis en utilisant @Jpsy réponse, mais pour des raisons de performances, je ne suis réglage de la minuterie si le hachage est présent dans l'URL.
La manière que je trouve être le plus propre est la suivante :
J'ai eu beaucoup de mal avec beaucoup de réponses ici et d'ailleurs mon signet d'ancrage ont été en-têtes de section dans une page de FAQ, de sorte que la compensation de l'en-tête n'aide pas, comme le reste du contenu, serait simplement de rester où il était. Donc je pensais que je poste.
Ce que j'ai fait était un composite de quelques solutions:
Le CSS:
Où "120px" est votre en-tête fixe la hauteur (peut-être plus une certaine marge).
Le lien de signet HTML:
Référencé le contenu HTML:
La bonne chose à propos de cette solution est que le
span
élément n'est pas seulement caché, il s'est effondrée et n'encombrez pas votre contenu.Je ne peux pas prendre beaucoup de crédit pour cette solution, car il s'agit d'un swag de différentes ressources, mais il a le mieux fonctionné pour moi dans ma situation.
Vous pouvez voir le résultat réel ici.
<span>
avec l'ancrage dans la durée, avec l'ajout dans la marge et la marge a fonctionné pour moi. Merci beaucoup pour avoir pris le temps de soumettre cette réponse en dépit de l'âge du fil!à partir de: https://css-tricks.com/fixed-headers-on-page-links-and-overlapping-content-oh-my/
Un peu intrusif approche à l'aide de jQuery:
Lien:
Contenu:
Script:
Par l'affectation de l'ancre-lien de la classe pour les liens, le comportement des autres liens (comme l'accordéon ou à l'onglet de contrôles) ne sont pas affectés.
La question ne veut pas du javascript mais l'autre plus populaire de la question est fermée à cause de cela, et je ne pouvais pas répondre là.
J'ai besoin de quelque chose qui fonctionne pour les liens entrants, liens sur la page, ET qui peuvent être ciblés par JS pour que la page peut répondre aux changements dans l'en-tête hauteur
HTML
CSS
La
z-index: -1
permet des liens dans le "rembourrage zone" au-dessus d'un fragment-cible pour toujours être cliquable, comme indiqué par @MuttenXd sur sa réponseJe n'ai pas trouvé encore un problème dans IE 11, Edge 15+, Chrome 38+, FF 52+ ou Safari 9.1+
Je n'avait pas de chance avec la réponse ci-dessus énumérés et fini à l'aide de cette solution qui a fonctionné parfaitement...
Créer un vide durée de l'endroit où vous souhaitez placer votre point d'ancrage.
Et d'appliquer la classe suivante:
Cette solution fonctionne même si les sections ont différents fonds de couleur! J'ai trouvé la solution à de ce lien.
Ce code devrait faire l'affaire. Échanger 45px pour la hauteur de votre barre d'en-tête.
EDIT: Si vous utilisez jQuery est une option, j'ai également eu beaucoup de succès à l'aide de jQuery.localScroll avec un décalage de valeur de consigne. L'option offset est une partie de jQuery.scrollTo, qui jQuery.localScroll est construite. Une démo est disponible ici: http://demos.flesler.com/jquery/scrollTo/ (deuxième fenêtre, en vertu de 'décalage')
Ici est un jquery solution qui fonctionne dans IE:
Supposons que la barre de navigation éléments sont quelque chose comme ceci:
Vous pouvez utiliser les éléments suivants jquery extrait de compenser le défilement:
Mis en œuvre à l'aide de
:before
fonctionnait très bien jusqu'à ce que nous avons réalisé que le pseudo-élément était en fait de couverture et de blocage des événements de pointeur sat dans le pseudo de l'élément de zone. En utilisant quelque chose commepointer-events: none
sur le:before
ou même directement sur l'ancre avait aucun effet.Ce que nous avons fait était de faire le point d'ancrage du positionnement absolu, puis en ajustant la position de l'compensé/hauteur de la zone fixe.
Décalage d'Ancrage sans bloquer les Événements de Pointeur
La valeur, c'est que nous ne sommes pas le blocage de tous les éléments qui pourraient tomber à l'intérieur de ces 300px. L'inconvénient est que l'accaparement de cet élément de la position à partir de Javascript doit tenir compte du décalage, de sorte que toute logique, il a dû être adapté.
C'est comment je l'ai eu pour enfin aller au bon endroit lorsque vous cliquez sur la barre de navigation. J'ai ajouté un gestionnaire d'événement pour la navigation clics. Ensuite, vous pouvez simplement utiliser "scrollBy" pour monter sur le décalage.
J'ai créé un div avec quelques sauts de ligne et qui a donné l'id, j'ai ensuite mis le code que j'ai voulu montrer en dessous. Le lien serait alors jetez vous à l'espace au-dessus de l'image et de l'en-tête ne serait pas dans la voie:
Bien sûr, vous pouvez modifier le nombre de sauts de ligne pour répondre à vos besoins.
Cela a fonctionné parfaitement pour moi, vous ne savez pas si il y a des problèmes, je suis encore à apprendre le HTML.
<br>
balises avant chaque rubrique.Utilisé ce script
Comme CSS ancrage de Défilement spec entre en jeu, il est facilement possible avec
scroll-margin-top
de la propriété. Actuellement fonctionne sur Chrome et Opera (avril 2019). Aussi Safari 11+ doit soutenir, mais j'ai été incapable de l'exécuter sur Safari 11. Probablement que nous avons à attendre pour les gars de fix il y emmènerons pas.Codepen exemple
CSS:
HTML:
- Je utiliser cette méthode parce que, pour une raison quelconque, aucune des autres solutions proposées effectivement travaillé pour moi. Je vous promets que j'ai essayé.
Remplacer section par une classe, si vous préférez.
source: Liens de sauts et de positionnement de la fenêtre d'affichage
Pour ceux qui ne me crois pas j'ai gentiment préparé un jsfiddle avec la solution: SOLUTION
CSS astuce sera une solution de contournement. Une bonne solution qui fonctionne dans tous les scénario peut être mis en œuvre à l'aide de jQuery.
Reportez-vous à https://codepen.io/pikeshmn/pen/mMxEdZ
Approche: Nous obtenir la hauteur de fixe de la valeur liquidative à l'aide de document.getElementById('header').offsetHeight
Et de compenser le faites défiler jusqu'à cette valeur.
P. S:
Très simple CSS seule réponse est de mettre le présent en haut de votre feuille de style:
Le premier style réglemente toutes les balises d'ancrage où la seconde styles d'ancrage des balises avec un lien hypertexte.
Remarque: actuellement, Cela fonctionne dans Firefox et Edge, mais ni dans Chrome.
Ajouter une classe avec un "paddingtop" de sorte qu'il fonctionne 😉
Et pour le css vous avez: