Sticky/Fixed Header and Navigation for Debut Theme

SeanP
Shopify Staff
Shopify Staff
2 0 47

Caution

This is an advanced tutorial and is not supported by Shopify. It is specific to an unedited version of the Debut theme, released 7th of March. We cannot guarantee results for themes that have been modified with custom coding and/or apps.

We suggest hiring a Shopify Expert if you are not comfortable proceeding with the following tutorial, or wish to make any variations to this tutorial. We would also advise making a backup of your theme.

Having a sticky header means that the navigation, logo, and icons will follow the user while they scroll down the page. This is really useful if you want to ensure that your customers will have easy access to your navigation at all times! Let’s take a look at how to implement this for the Debut theme.

Note

We recommend having your header set as Logo Alignment: Left. This is the default setting for the Debut Theme but it can be changed. To do this, you would need to open the Theme Editor.
On the left-hand side, click on the Header section and, from here, you will be able to change the alignment.

12-00-q35ps-rsk5r

This is an important step, as the header will be shown on every portion of the page as you scroll. Setting the logo alignment to left will ensure the header takes up less space on the screen. We also can't ensure that the customization will work if this setting is not activated.

If you have an Announcement bar, and would like for it to not move with the rest of the header, please refer to option 2 of this guide.

 

OPTION 1 - STICKY HEADER

This will make the whole header sticky, including the announcement bar.


11-29-y1xka-8hyx2

  1. From your Shopify admin, go to Online Store > Themes.
  2. Locate your Debut theme and then click Actions > Edit code.
  3. In the Assets folder, open your theme.scss.liquid file.

    03-39-badae-sysyp
  4. Go to the very bottom of this file and paste the following code:

    #SearchDrawer {
      z-index:1001;
    }
    
    #shopify-section-header {
      position: fixed;
      z-index:1000;
      left:0;
      right:0;
      -webkit-box-shadow:0px 2px 4px 0px rgba(0,0,0,.1);
      -moz-box-shadow:0px 2px 4px 0px rgba(0,0,0,.1);
      -ms-box-shadow:0px 2px 4px 0px rgba(0,0,0,.1);
      -o-box-shadow:0px 2px 4px 0px rgba(0,0,0,.1);
      box-shadow:0px 2px 4px 0px rgba(0,0,0,.1);
      background-color: {{ settings.color_body_bg }};
    }
    
    #PageContainer {
      padding-top: 80px;
    }
    
    @media screen and (max-width: 749px) {
    #PageContainer {
      padding-top: 70px;
    }
    }
    
  5. In the same Assets folder, click to open your theme.js file.
  6. Go to the very bottom of this file and paste the following code:

    function headerSize() {
      var $headerHeight = $('div#shopify-section-header').outerHeight();
      $('#PageContainer').css('padding-top', $headerHeight);
    }
    
    $(window).on("load", headerSize);
    $(window).on("resize", $.debounce(500, headerSize));
    
  7. Ensure that the code was copied exactly from this guide and pasted correctly, making sure no characters or symbols are missing.
  8. Save the file by using the button on the top right-hand side.
  9. Refresh your online store page and verify that the sticky header is working correctly!

And that's it! If you would prefer for the announcement bar to not scroll with the user, then you would need to follow the steps below.

 

OPTION 2 - STICKY HEADER WITHOUT THE ANNOUNCEMENT BAR

Note

In this section of the guide, we are assuming that you did not use the code above. If you have used it previously to make the whole header sticky, then you would need to revert your changes to make sure that you are working on an untouched theme.

  1. From your Shopify admin, go to Online Store > Themes.
  2. Locate your Debut theme and then click Actions > Edit code.
  3. In the folder, open your theme.scss.liquid file.

    03-39-badae-sysyp
  4. Go to the very bottom of this file and paste the following code:

    #SearchDrawer {
      z-index:1001;
    }
    
    .site-header {
      position: fixed;
      z-index:1000;
      left:0;
      right:0;
      -webkit-box-shadow:0px 2px 4px 0px rgba(0,0,0,.1);
      -moz-box-shadow:0px 2px 4px 0px rgba(0,0,0,.1);
      -ms-box-shadow:0px 2px 4px 0px rgba(0,0,0,.1);
      -o-box-shadow:0px 2px 4px 0px rgba(0,0,0,.1);
      box-shadow:0px 2px 4px 0px rgba(0,0,0,.1);
    }
    
    #PageContainer {
      padding-top: 80px;
    }
    
    @media screen and (max-width: 749px) {
    #PageContainer {
      padding-top: 70px;
    }
    }
    
  5. In the same Assets folder, click to open your theme.js file.
  6. Go to the very bottom of this file and paste the following code:

    function headerSize() {
      var $headerHeight = $('div#shopify-section-header').outerHeight();
      $('#PageContainer').css('padding-top', $headerHeight);
    }
    
    $(window).on("load", headerSize);
    $(window).on("resize", $.debounce(500, headerSize));
    
    $(window).scroll(function() {
      scroll = $(window).scrollTop();
      if (scroll >= 1) {
        $('.site-header').css('top', '0');
      } else {
        $('.site-header').css('top', 'initial');
      }
    });
    
  7. Ensure that the code was copied exactly from this guide and pasted correctly, making sure no characters or symbols are missing.
  8. Save the file by using the button on the top right-hand side.
  9. Refresh your online store page and verify that the sticky header is working correctly!
Replies 153 (153)
mannyb12
Tourist
5 0 6

Is there a way to do this in the Narrative Theme?

Rabbie
Tourist
6 0 1

Awesome tutorial! 

 

I do have a little problem though.... after I scroll down the page and then back to the top, the top bar covers the content underneath it. 


if that makes sense.... 

aliceO
New Member
2 0 0

Hei! I have the same problem. Did you find the solution?

Rabbie
Tourist
6 0 1

No, not as yet... 

SeanP
Shopify Staff
Shopify Staff
2 0 47

Hi Rabbie and Alice,

 

My guess would be that the code that is being used is coming from Option II of the guide, and not Option I. The code in Option II will _only_ work correctly if the announcement bar is enabled.

If the announcement bar is not enabled, then it might create the behaviour that you are seeing. Could you please make sure that you are definitely using the CSS and Javascript from Option I of the guide, and not Option II?

 

Please keep in mind that this tutorial is strictly for the Debut theme and will not work for any other themes. 

 

Let us know!

Sean

Rabbie
Tourist
6 0 1

Ahh so I am using the Pt 2 code but with the bar dissabled in the theme.... 

aliceO
New Member
2 0 0

Same here!

It's working now. Thank you!

Rabbie
Tourist
6 0 1

So I have enabled the announcement bar but the announcement bar is still there... 

wmwm
Shopify Partner
23 2 10

Hi Sean,

Thank you for this tutorial. I am having the same problem as the users above except that I am using Option 1 -AND- I have the announcement bar enabled. The header and announcement bar stick to the top of the site and look great, but now the rest of the page content starts at the top of the page underneath the header. Any ideas how to move the page content down to begin underneath the header? Thanks!

wmwm
Shopify Partner
23 2 10

I should add that I am also seeing the following error in my browser's debugger:

 

$(window).on("resize", $.debounce(500, headerSize)); <<<<<<<<< [$.debounce is not a function.]

 

Is there some library I'm missing here? I've copied the code exactly.

 

Thank you!

Silverclouding
Shopify Expert
96 14 24

hi @SeanP 

We seen all the comments and code , but all the codes may be not full-fill your needs .

We provide you a very simple code for "Debut" theme .

Any way here the code 🙂

 

 <script>
      //announcement bar 
      $("[data-section-id = header]").css({"position":"fixed","z-index":"99999","width":"100%","top":0,"background-color":"#f8f8f8"});
      var header_height = $("[data-section-id = header]").height();
      $("#PageContainer").css("margin-top",header_height);
  </script>

Before you add the code please remove all the previous code what you use for it .

 

After remove Previous code, you add our code before the closing </body> tag.

Please see the ref: screenshot

sticky-header.png

This code is tested. Here the preview link https://vuj4ixbxw35vpnro-29765088.shopifypreview.com

 

Thank you 

Silverclouding
Shopify Expert
96 14 24

hi @SeanP 

We seen all the comments and code , but all the codes may be not full-fill your needs .

We provide you a very simple code for "Debut" theme .

Any way here the code 🙂

 

 <script>
      //announcement bar 
      $("[data-section-id = header]").css({"position":"fixed","z-index":"99999","width":"100%","top":0,"background-color":"#f8f8f8"});
      var header_height = $("[data-section-id = header]").height();
      $("#PageContainer").css("margin-top",header_height);
  </script>

Before you add the code please remove all the previous code what you use for it .

 

After remove Previous code, you add our code before the closing </body> tag.

Please see the ref: screenshot

sticky-header.png

This code is tested. Here the preview link https://vuj4ixbxw35vpnro-29765088.shopifypreview.com

 

Thank you 

wmwm
Shopify Partner
23 2 10

I am using Minimal theme and the code above did not seem to work properly for me, although I do see that it works well on the sample site provided. So take that as you will. I also prefer the slight drop shadow that Sean's original code gives to the header, so I wanted to find a way to make the original code work with my theme.

 

Here is a solution I came up for Sean's / Shopify's sticky header code that works on my site. I'm not a professional developer, so buyer beware. 

 

1. In the theme.js code, replace

$('#PageContainer').css('padding-top', $headerHeight);

with

$('.main-content').css('padding-top', $headerHeight);

2. In timber.scss.liquid, locate

.main-content {
  display: block;
  margin-top: $gutter * 2;
  padding-bottom: $gutter * 2;
}

and add a line for padding-top with some hard-coded placeholder pixels

.main-content {
  display: block;
  margin-top: $gutter * 2;
  padding-bottom: $gutter * 2;
padding-top: 180px; }

Mess around with the "180px" number to find a padding that works for your site/header. This is just a placeholder to make sure the content loads immediately some place below the header before the javascript has a chance to kick in and calculate the actual padding required by your specific header. Before I added this second step, the site would immediately load with content behind the header and then after a second or two the content would be pushed down to the correct position. By making both these changes, the content will load in a way that is not disruptive to the user. I'm assuming it's not good to have such a hard-coded pixel value for padding-top, so this is a hybrid solution that holds the page content in roughly the right place while javascript comes up behind and changes it into a more precise number in the spirit of adaptivity.

 

Again, I'm not a professional developer and maybe a professional developer can offer some advice or improvements. But so far this is working well for me on both desktop and mobile.

Silverclouding
Shopify Expert
96 14 24

hi


@wmwm wrote:

I am using Minimal theme and the code above did not seem to work properly for me, although I do see that it works well on the sample site provided. So take that as you will. I also prefer the slight drop shadow that Sean's original code gives to the header, so I wanted to find a way to make the original code work with my theme.

 

Here is a solution I came up for Sean's / Shopify's sticky header code that works on my site. I'm not a professional developer, so buyer beware. 

 

1. In the theme.js code, replace

$('#PageContainer').css('padding-top', $headerHeight);

with

$('.main-content').css('padding-top', $headerHeight);

2. In timber.scss.liquid, locate

.main-content {
  display: block;
  margin-top: $gutter * 2;
  padding-bottom: $gutter * 2;
}

and add a line for padding-top with some hard-coded placeholder pixels

.main-content {
  display: block;
  margin-top: $gutter * 2;
  padding-bottom: $gutter * 2;
padding-top: 180px; }

Mess around with the "180px" number to find a padding that works for your site/header. This is just a placeholder to make sure the content loads immediately some place below the header before the javascript has a chance to kick in and calculate the actual padding required by your specific header. Before I added this second step, the site would immediately load with content behind the header and then after a second or two the content would be pushed down to the correct position. By making both these changes, the content will load in a way that is not disruptive to the user. I'm assuming it's not good to have such a hard-coded pixel value for padding-top, so this is a hybrid solution that holds the page content in roughly the right place while javascript comes up behind and changes it into a more precise number in the spirit of adaptivity.

 

Again, I'm not a professional developer and maybe a professional developer can offer some advice or improvements. But so far this is working well for me on both desktop and mobile.


Above code absolute perfect . 

We provide that code for debut theme . If there you change the selector that code will also work perfect.

For that pushing effect you need to add initial padding-top in css.

SCMCF
New Member
1 0 0

Code works great, just would like to remove it from the cart page as it is blocking my upsell. 

 

Thanks in advance. 

 

MTBProducts
New Member
1 0 0

Thank you Sean! It works really well.

I´m a Shopify noob. I found out how I adjust the height but it is only the height of the "background"  how do I adjust the position of the Navigation, Logo, Search etc. in relation to the height of the "background? Hope this does make sense. Any help is appreciated

AkanshaSharma
Tourist
3 0 1

Hi,

 

I still didn't get how to solve the problem of content getting pushed/adjusted after a few seconds. 

Want everything to get loaded in one shot. Seems very unpleasant to the eye that the entire page moves down after a second. 

 

TanCloths
New Member
1 0 0

I am using Narrative theme. And it's pretty easy to this in that theme. Just follow the steps mentioned above.

LVOC
Tourist
12 0 1

I am having an issue with the color of the header on my homepage. It is the only page where the background of the header is transparant. All other pages the header has the same color as the background of my website, as it should be.

 

I now installed a 3rd party app to install a mega menu. Its not properly functioning with the code ive added (as written in the explanation, which im very thankful for).

 

I would like to get my home page header the same color as on the other product pages, else its not very well see able. Can I just make some adjustments in the added coding or do i have to add something new?

 

Thnx