Fixed page header overlaps in-page anchors

前端 未结 30 2831
逝去的感伤
逝去的感伤 2020-11-22 00:25

If I have a non-scrolling header in an HTML page, fixed to the top, having a defined height:

Is there a way to use the URL anchor (the #fragment part) t

相关标签:
30条回答
  • 2020-11-22 00:45

    I had a lot of trouble with many of the answers here and elsewhere as my bookmarked anchors were section headers in an FAQ page, so offsetting the header didn't help as the rest of the content would just stay where it was. So I thought I'd post.

    What I ended up doing was a composite of a few solutions:

    1. The CSS:

      .bookmark {
          margin-top:-120px;
          padding-bottom:120px; 
          display:block;
      }
      

    Where "120px" is your fixed header height (maybe plus some margin).

    1. The bookmark link HTML:

      <a href="#01">What is your FAQ question again?</a>
      
    2. The bookmarked content HTML:

      <span class="bookmark" id="01"></span>
      <h3>What is your FAQ question again?</h3>
      <p>Some FAQ text, followed by ...</p>
      <p>... some more FAQ text, etc ...</p>
      

    The good thing about this solution is that the span element is not only hidden, it is essentially collapsed and doesn't pad out your content.

    I can't take much credit for this solution as it comes from a swag of different resources, but it worked best for me in my situation.

    You can see the actual result here.

    0 讨论(0)
  • 2020-11-22 00:45

    Used this script

    $(document).on('click', 'a[href^="#"]', function (event) {
        event.preventDefault();
    
        $('html, body').animate({
            scrollTop: $($.attr(this, 'href')).offset().top -140
        }, 1000);
    });
    
    0 讨论(0)
  • 2020-11-22 00:47

    As CSS Scroll Snap spec comes into game, it is easily possible with scroll-margin-top property. Currently runs on Chrome and Opera (April 2019). Also Safari 11+ should support this, but I was unable to run it on Safari 11. Probably we have to wait for guys to fix it overthere.

    Codepen example

    body {
      padding: 0;
      margin: 0;
    }
    
    h1,
    p {
      max-width: 40rem;
      margin-left: auto;
      margin-right: auto;
    }
    h1 {
      scroll-margin-top: 6rem; /* One line solution. :-) */
    }
    .header {
      position: sticky;
      top: 0;
      background-color: red;
      text-align: center;
      padding: 1rem;
    }
    .header .scroll {
      display: block;
      color: white;
      margin-bottom: 0.5rem;
    }
    .header .browsers {
      color: black;
      font-size: 0.8em;
    }
    <header class="header">
      <a class="scroll" href="#heading">Scroll to heading</a>
      <span class="browsers" >Chrome 69+, Opera 56+ and Safari 11+ only</span>
    </header>
    <p>
      Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
    </p>
    <h1 id="heading">What is Lorem Ipsum?</h1>
    <p>
      Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
    </p>
    <p>
      
    
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent pulvinar eleifend dolor, in cursus augue interdum quis. Morbi volutpat pulvinar nisl et condimentum. Quisque elit lacus, egestas non ante sit amet, hendrerit commodo dui. Nunc ac sagittis dolor. Proin iaculis ante non est pharetra, et ullamcorper nisl accumsan. Aenean quis leo vel sapien eleifend aliquam. Pellentesque finibus dui ex, blandit tristique risus vestibulum vitae. Nam a quam ac turpis porta eleifend. Sed at hendrerit risus, ac efficitur ante. Aenean pretium justo feugiat condimentum consectetur. Etiam mattis urna id porta hendrerit.
    </p>
    <p>
    Mauris venenatis quam sed egestas auctor. Fusce lacus eros, condimentum nec quam vel, malesuada gravida libero. Praesent vel sollicitudin justo. Donec mattis nisl id mauris scelerisque, quis placerat lectus scelerisque. Ut id justo a magna mattis luctus. Suspendisse massa est, pretium vel suscipit sit amet, iaculis at mi. Aenean vulputate ipsum non consectetur sodales. Proin aliquet erat nec mi eleifend, eu dapibus enim ultrices. Sed fringilla tortor ac rhoncus consectetur. Aliquam aliquam orci ultrices tortor bibendum facilisis.
    </p>
    <p>
    Donec ultrices diam quam, non tincidunt purus scelerisque aliquam. Nam pretium interdum lacinia. Donec sit amet diam odio. Donec eleifend nibh ut arcu dictum, in vulputate magna malesuada. Nam id dignissim tortor. Suspendisse commodo, nunc sit amet blandit laoreet, turpis nibh rhoncus mi, et finibus nisi diam sed erat. Vivamus diam arcu, placerat in ultrices eu, porta ut tellus. Aliquam vel nisi nisi.
    </p>
    <p>
    Integer ornare finibus sem, eget vulputate lacus ultrices ac. Vivamus aliquam arcu sit amet urna facilisis consectetur. Sed molestie dolor et tortor elementum, nec bibendum tortor cursus. Nulla ipsum nulla, luctus nec fringilla id, sagittis et sem. Etiam at dolor in libero pharetra consequat. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Suspendisse quis turpis non diam mattis varius. Praesent at gravida mi. Etiam suscipit blandit dolor, nec convallis lectus mattis vitae. Mauris placerat erat ipsum, vitae interdum mauris consequat quis. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
    </p>
    <p>
    Nunc efficitur scelerisque elit. Integer ac massa ipsum. Cras volutpat nulla purus, quis molestie dolor iaculis eget. Maecenas ut ex nulla. Pellentesque sem augue, ornare ut arcu eu, porttitor consectetur orci. Aenean iaculis blandit quam, in efficitur justo sodales auctor. Vivamus dignissim pellentesque risus eget consequat. Pellentesque sit amet nisi in urna convallis egestas vitae nec mauris. 
    </p>

    0 讨论(0)
  • 2020-11-22 00:49

    A minimally intrusive approach using jQuery:

    Link:

    <a href="#my-anchor-1" class="anchor-link">Go To Anchor 1</a>
    

    Content:

    <h3 id="my-anchor-1">Here is Anchor 1</a>
    

    Script:

    $(".anchor-link").click(function() {
        var headerHeight = 120;
        $('html, body').stop(true, true).animate({
            scrollTop: $(this.hash).offset().top - headerHeight
        }, 750);
        return false;
    });
    

    By assigning the anchor-link class to the links, the behaviour of other links (like accordion or tab controls) are not affected.

    The question doesn't want javascript but the other more popular question is closed because of this one and I couldn't answer there.

    0 讨论(0)
  • 2020-11-22 00:50

    I found I had to use both MutttenXd's and Badabam's CSS solutions together, as the first did not work in Chrome and the second did not work in Firefox:

    a.anchor { 
      padding-top: 90px;
    }
    
    a.anchor:before { 
      display: block;
      content: "";
      height: 90px;
      margin-top: -90px;
    }
    
    <a class="anchor" name="shipping"></a><h2>Shipping (United States)</h2>
    ...
    
    0 讨论(0)
  • 2020-11-22 00:53

    It feels somewhat hacky to my purist mind but as a css-only solution you can add padding to the active anchored element using the :target selector:

    html, body {height:100%; min-height:100%; margin:0;}
    body {min-height:200%;}
    header {display:inline-block; position:fixed; font-size:1.5em; height:100px; top:0; left:0; right:0; line-height:100px; background:black; text-align:center;}
    header a {color:#fff;}
    section {padding:30px; margin:20px;}
    section:first-of-type, section:target {padding-top:130px;}
    <header><a href="#one">#One</a> <a href="#two">#two</a> <a href="#three">#three</a></header>
    <section id="one"><h1>One</h1>Aenean lacinia bibendum nulla sed consectetur. Nullam id dolor id nibh ultricies vehicula ut id elit. Integer posuere erat a ante venenatis dapibus posuere velit aliquet.</section>
    <section id="two"><h1>Two</h1>Aenean lacinia bibendum nulla sed consectetur. Nullam id dolor id nibh ultricies vehicula ut id elit. Integer posuere erat a ante venenatis dapibus posuere velit aliquet.</section>
    <section id="three"><h1>Three</h1>Aenean lacinia bibendum nulla sed consectetur. Nullam id dolor id nibh ultricies vehicula ut id elit. Integer posuere erat a ante venenatis dapibus posuere velit aliquet.</section>

    0 讨论(0)
提交回复
热议问题