Si tengo un encabezado sin desplazamiento en una página HTML, fijado en la parte superior, que tiene una altura definida:
¿Hay alguna manera de usar el anclaje de URL (la #fragment
parte) para que el navegador se desplace a un cierto punto de la página, pero aún respete la altura del elemento fijo sin la ayuda de JavaScript ?
http://foo.com/#bar
Incorrecto (pero el comportamiento común): CORRECTO: + --------------------------------- + + -------------- ------------------- + El | BAR ///////////////////// encabezado | El | //////////////////////// encabezado | + --------------------------------- + + -------------- ------------------- + El | Aquí está el resto del texto | El | BAR | El | ... | El | El | El | ... | El | Aquí está el resto del texto | El | ... | El | ... | + --------------------------------- + + -------------- ------------------- +
.dislocate50px, #bar { padding: 50px 0 0; margin: -50px 0 0; -webkit-background-clip: content-box; background-clip: content-box; }
scroll-padding-top
aquí: css-tricks.com/… Respuesta correspondiente: stackoverflow.com/a/56467997/247696Respuestas:
Yo tuve el mismo problema. Lo resolví agregando una clase al elemento de anclaje con la altura de la barra superior como el valor de relleno superior.
Y luego simplemente el CSS:
fuente
margin-top: -90px;
para contrarrestar la brecha creada por el relleno..anchor:target {padding-top: 90px;}
para que solo agregara el relleno cuando usaron la etiqueta de anclaje. De esta manera, no siempre hay un montón de relleno si la página se carga en la parte superior. Solo cuando carga un punto específico más abajo en la página.Si no puede o no quiere establecer una nueva clase, agregue un
::before
pseudo-elemento de altura fija a la:target
pseudo-clase en CSS:O desplazarse por la página en relación
:target
con jQuery:fuente
:target
fue genial!Yo uso este enfoque:
Agrega un elemento invisible antes de cada objetivo. Funciona IE8 +.
Aquí hay más soluciones: http://nicolasgallagher.com/jump-links-and-viewport-positioning/
fuente
Respuesta adoptada oficial de Bootstrap:
Créditos
Unir
fuente
display: flex;
opadding-top
. Utilice un elemento de anclaje dedicado (como<a name="my_link">{leave this empty}</a>
) en esos casos.de: https://css-tricks.com/fixed-headers-on-page-links-and-overlapping-content-oh-my/
fuente
La mejor manera que encontré para manejar este problema es (reemplace 65 px con la altura de su elemento fijo):
Si no le gusta usar el selector de objetivos , también puede hacerlo de esta manera:
Nota: este ejemplo no funcionará si el elemento de destino tiene un color de fondo que difiere de su padre. por ejemplo:
en este caso, el color verde del elemento my-target sobrescribirá su elemento rojo padre en 65px. No encontré ninguna solución CSS pura para manejar este problema, pero si no tiene otro color de fondo, esta solución es la mejor.
fuente
Si bien algunas de las soluciones propuestas funcionan para enlaces de fragmentos (= enlaces hash) dentro de la misma página (como un enlace de menú que se desplaza hacia abajo), descubrí que ninguno de ellos funcionaba en Chrome actual cuando desea usar enlaces de fragmentos provenientes de otros páginas .
Llamar a www.mydomain.com/page.html#foo desde cero NO compensará su objetivo en Chrome actual con ninguna de las soluciones CSS o JS dadas.
También hay un informe de error jQuery que describe algunos detalles del problema.
SOLUCIÓN
La única opción que encontré hasta ahora que realmente funciona en Chrome es JavaScript que no se llama onDomReady pero con retraso.
RESUMEN
Sin un retraso JS, las soluciones probablemente funcionarán en Firefox, IE, Safari, pero no en Chrome.
fuente
A medida que la especificación CSS Scroll Snap entra en juego, es fácilmente posible con la
scroll-margin-top
propiedad. Actualmente se ejecuta en Chrome y Opera (abril de 2019). También Safari 11+ debería admitir esto, pero no pude ejecutarlo en Safari 11. Probablemente tengamos que esperar a que los chicos lo arreglen allí.Ejemplo de codepen
fuente
scroll-padding-top
yscroll-margin-top
?scroll-margin-top
para este caso de uso, lamentablemente no se implementa en Safari 11-13: bugs.webkit.org/show_bug.cgi?id=189265scroll-snap-margin-top
: caniuse.com/#search=scroll-margin-topPara Chrome / Safari / Firefox, puede agregar ay
display: block
usar un margen negativo para compensar el desplazamiento, como:Ver ejemplo http://codepen.io/swed/pen/RrZBJo
fuente
Puedes hacer esto con jQuery:
fuente
¡Acabo de descubrir otra solución CSS pura que funcionó como un encanto para mí!
Encontrado en este sitio !
fuente
Podrías probar esto:
Establezca el valor de relleno superior a la altura real de su encabezado. Esto introducirá un pequeño espacio adicional en la parte superior de su encabezado, pero solo será visible cuando el usuario salte al ancla y luego se desplace hacia arriba. He creado esa solución para mi sitio en este momento, pero solo muestra una pequeña barra fija en la parte superior de la página, nada demasiado alto.
fuente
Lo tengo trabajando fácilmente con CSS y HTML, usando el método "ancla: antes" mencionado anteriormente. Creo que funciona mejor, porque no crea un relleno masivo entre tus divs.
No parece funcionar para el primer div de la página, pero puede contrarrestar eso agregando relleno a ese primer div.
Aquí hay un violín que funciona: http://jsfiddle.net/FRpHE/24/
fuente
Esto funciona para mi:
HTML LINK to Anchor:
Ancla HTML:
CSS:
fuente
Estoy usando la respuesta de @ Jpsy, pero por razones de rendimiento solo configuro el temporizador si el hash está presente en la URL.
fuente
Tuve muchos problemas con muchas de las respuestas aquí y en otros lugares, ya que mis anclas marcadas eran encabezados de sección en una página de preguntas frecuentes, por lo que compensar el encabezado no ayudó, ya que el resto del contenido simplemente se quedaría donde estaba. Así que pensé en publicar.
Lo que terminé haciendo fue una combinación de algunas soluciones:
El CSS:
Donde "120px" es la altura del encabezado fijo (quizás más un margen)
El enlace del marcador HTML:
El contenido marcado HTML:
Lo bueno de esta solución es que el
span
elemento no solo está oculto, sino que está esencialmente colapsado y no rellena su contenido.No puedo tomar mucho crédito por esta solución, ya que proviene de una gran cantidad de recursos diferentes, pero funcionó mejor para mí en mi situación.
Puedes ver el resultado real aquí .
fuente
<span>
con el ancla en el lapso, junto con agregar el relleno y el margen funcionó para mí. ¡Muchas gracias por tomarse el tiempo de enviar esta respuesta a pesar de la antigüedad del hilo!No tuve suerte con la respuesta mencionada anteriormente y terminé usando esta solución que funcionó perfectamente ...
Cree un espacio en blanco donde desee establecer su ancla.
Y aplique la siguiente clase:
¡Esta solución funcionará incluso si las secciones tienen fondos de diferentes colores! Encontré la solución en este enlace.
fuente
Para mi mente purista, se siente algo hacky, pero como solución de solo CSS puede agregar relleno al elemento anclado activo usando el
:target
selector:fuente
Me encontré con que tenía que usar tanto MutttenXd 's y Badabam soluciones CSS s' juntos, como la primera no funcionó en Chrome y el segundo no funcionaba en Firefox:
fuente
La forma en que me parece más limpia es la siguiente:
fuente
Un enfoque mínimamente intrusivo usando jQuery:
Enlace:
Contenido:
Guión:
Al asignar la clase de enlace de anclaje a los enlaces, el comportamiento de otros enlaces (como los acordeones o los controles de tabulación) no se ven afectados.
La pregunta no quiere JavaScript pero la otra pregunta más popular está cerrada debido a esta y no pude responder allí.
fuente
Necesitaba algo que funcione para enlaces entrantes, enlaces en la página, Y que JS pueda orientar para que la página pueda responder a los cambios en la altura del encabezado
HTML
CSS
El
z-index: -1
permite enlaces en el 'área de relleno' por encima de un fragmento de la diana de estar todavía puede hacer clic, como han comentado en @MuttenXd en su respuestaTodavía no he encontrado un problema en IE 11, Edge 15+, Chrome 38+, FF 52+ o Safari 9.1+
fuente
Este código debería hacer el truco. Cambia 45 px por la altura de tu barra de encabezado.
EDITAR: si usar jQuery es una opción, también he tenido éxito usando jQuery.localScroll con un conjunto de valores de desplazamiento. La opción de desplazamiento es parte de jQuery.scrollTo, sobre la cual se basa jQuery.localScroll. Una demostración está disponible aquí: http://demos.flesler.com/jquery/scrollTo/ (segunda ventana, debajo de 'desplazamiento')
fuente
Aquí hay una solución completa de jquery que funcionará en IE:
Supongamos que los elementos de la barra de navegación son algo como esto:
Puede usar el siguiente fragmento de jquery para compensar el desplazamiento:
fuente
Implementado usando
:before
funcionó muy bien hasta que nos dimos cuenta de que el pseudo elemento en realidad estaba cubriendo y bloqueando los eventos de puntero que se encontraban dentro del área del pseudo elemento. Usar algo comopointer-events: none
el:before
o incluso directamente en el ancla no tuvo ningún efecto.Lo que terminamos haciendo fue hacer que la posición del ancla sea absoluta y luego ajustar su posición para que sea el desplazamiento / altura del área fija.
Ancla de desplazamiento sin bloquear eventos de puntero
El valor con esto es que no estamos bloqueando ningún elemento que pueda caer dentro de esos 300px. La desventaja es que tomar la posición de ese elemento de Javascript debe tener en cuenta ese desplazamiento, por lo que cualquier lógica allí tuvo que ser ajustada.
fuente
Así es como lo hice para finalmente ir al lugar apropiado cuando haces clic en la navegación. Agregué un controlador de eventos para los clics de navegación. Luego puede usar "scrollBy" para moverse hacia arriba en el desplazamiento.
fuente
Creé un div con algunos saltos de línea y le di la identificación, luego puse el código que quería mostrar debajo. El enlace lo llevaría al espacio sobre la imagen y el encabezado ya no estaría en el camino:
Por supuesto, puede cambiar el número de saltos de línea para satisfacer sus necesidades. Esto funcionó perfectamente para mí, aunque no estoy seguro si hay algún problema, todavía estoy aprendiendo HTML.
fuente
<br>
etiquetas antes de cada encabezado.Usó este script
fuente
Creo que este enfoque es más útil:
<h2 id="bar" title="Bar">Bar</h2>
fuente
Ahora puede usar scroll-margin-top , que es ampliamente adoptado .
Simplemente agregue el siguiente CSS al elemento al que desea desplazarse:
fuente
scroll-margin-top
ha sido sugerido anteriormente en este hilo