Ostatnio natrafiłem na problem z linkowaniem do treści na jednej stronie WWW, na której wykorzystywałem element z fixowany na górze strony.

Z fixowany – mam na myśli ten element jak na przykład w bootstrap:

fixed

Jest on ustawiony na sztywno na pozycji określonej i niezależnie jak będziemy stronę przewijać on zawsze tam będzie.

Problem polega na tym, że ten element zajmuje przestrzeń, w bootstrap jest ona mała, ma coś około 40px, u nas zaś w zależności od subnav dochodziliśmy do 60-70px (nie dyskutujmy dlaczego… proszę). To powodowało, że jak linkowaliśmy do elementu o ID #sekcja, header sekcji był wyświetlany pod naszym z fixowanym elementem.

Jednym rozwiązaniem (jaki stosuje bootstrap) jest ustawienie odpowiednich paddingów i margins na elementach header. To się sprawdza dla 40px, ale dla 70 już nie – przerwa pomiędzy jednym nagłówkiem a drugim jest po prostu za duża.

Drugim rozwiązaniem jest niestety hack JavaScriptowy.

Kod wygląda tak:

(function (window, $, undefined) {

    'use strict';
    $(function () {

        var $window = $(window),
            elementHeight = $('.topbar').height();

        function fixHashLinking() {
            var $hash = $(window.location.hash),
                fixedTop;
            if (window.location.hash && $hash.length) {
                fixedTop = $hash.offset().top - elementHeight;
                $window.scrollTop(fixedTop);
            }
        }

        $window.bind('hashchange', function () {
            fixHashLinking();
        });

        fixHashLinking();
    });

})(window, jQuery);

Wystarczy, że dla elementHeight odejmiemy odpowiednie elementy które stanowią tą część fixed.

Przykładowy JS Fiddle:

Link do JS Fiddle.

Jeżeli poszukujecie przykładu problemu z fixed, nie trzeba szukać daleko, na przykład ten o to link wyświetli wam tytuł Smoother code formatting pod top menu.