Як використовувати новий плагін-афікс у завантажувальній системі twitter 2.1.0?


110

Документація завантажувача на цю тему мене трохи бентежить. Я хочу досягти подібної поведінки, як у документах із афіксом navbar: Навбар знаходиться під заголовком абзацу / сторінки, а після прокручування вниз спочатку слід прокручувати вгору, поки не досягне верхньої частини сторінки, а потім дотримуватися там, зафіксованого для подальшого прокручування .

Оскільки jsFiddle не працює з концепцією navbar, я створив окрему сторінку для використання як мінімальний приклад: http://i08fs1.ira.uka.de/~s_drr/navbar.html

Я використовую це як свій навібар:

<div class="navbar affix-top" data-spy="affix" data-offset-top="50">
    <div class="navbar-inner">
        <div class="container">
            <div class="span12">
                <a class="brand" href="#">My Brand</a> 
                This is my navbar.
             </div>
        </div> <!-- container -->
    </div> <!-- navbar-inner -->
</div> <!-- navbar -->

Я думаю, що я хотів би data-offset-topмати значення 0 (оскільки планка повинна "прилипати" до самої вершини ", але з 50 є принаймні деякий ефект, який можна спостерігати.

Якщо також помістіть код javascript:

     <script>
        $(document).ready (function (){
            $(".navbar").affix ();
        });
     </script>

Будь-яка допомога вдячна.


чи намагаєтесь ви використати affix () на головній панелі навігації на своїй сторінці?
Нітін Еммануель

@NithinEmmanuel так, дивіться javascript у публікації або за зразком: i08fs1.ira.uka.de/~s_drr/navbar.html
Диналон

чому ви не використовуєте використання .navbar-fixed-topзамість affix ()?
Нітін Еммануель

6
@NithinEmmanuel тому, що це не те, що я хочу. весь час.navbar-fixed-top буде розміщувати навігаційну панель вгорі . Я хочу, щоб заголовок сторінки ВІД НАВБАРУ, і при прокручуванні вниз (і, таким чином, навбар буде ставити прокрутку), він повинен триматися вгорі - тоді і тільки тоді. Документи Bootstrap використовували ті самі механізми, що і субнав у своїх попередніх документах, на жаль, вони видалили його для 2.1.0.
Диналон

1
Для одного вкладення Javascript невірно. )};має бути});
Оуен

Відповіді:


160

У мене була подібна проблема, і я вважаю, що знайшов вдосконалене рішення.

Не турбуйтеся, вказуючи data-offset-topсвій HTML. Замість цього вкажіть це під час дзвінка .affix():

$('#nav').affix({
    offset: { top: $('#nav').offset().top }
});​

Перевага тут полягає в тому, що ви можете змінити макет свого сайту, не потребуючи оновлення data-offset-topатрибута. Оскільки для цього використовується фактична обчислена позиція елемента, це також запобігає невідповідності веб-переглядачів, які переводять елемент у дещо інше положення.


Вам все одно потрібно буде затиснути елемент до верху за допомогою CSS. Крім того, мені довелося встановити width: 100%елемент nav, оскільки .navелементи з position: fixedнеправильної поведінки чомусь:

#nav.affix {
    position: fixed;
    top: 0px;
    width: 100%;
}

І останнє: Коли прикріплений елемент стає фіксованим, його елемент більше не займає місця на сторінці, в результаті чого елементи під ним "перестрибують". Щоб запобігти цій потворності, я загортаю навбар у divвисоту, яку я встановив рівним рівню навігації під час виконання:

<div id="nav-wrapper">
    <div id="nav" class="navbar">
        <!-- ... -->
    </div>
</div>

.

$('#nav-wrapper').height($("#nav").height());

Ось обов'язковий jsFiddle, щоб побачити його в дії .


6
Прекрасна порада для видалення "стрибка" - повністю проігнорував той факт, що цей елемент видаляється, і я подумав, що моя проблема міститься в частині "affix / js" мого коду.
Томас

1
Ця відповідь найкраща! Все працює як слід. Частина "стрибка" була такою, яка відсутня у більшості підручників, які я знайшов. Дякую!
Рікардо Отеро

1
Одне важливе виправлення: використовуйте offset () замість позиції () у коді jquery у своєму першому фрагменті коду. Пояснення: Функція position () дає вам зміщення всередині батьківського елемента, але offset () - це його положення в документі, яке саме ви хочете (так, імена контр-інтуїтивно зрозумілі). Таким чином, ваш код не працює, якщо ваш елемент афіксу знаходиться в іншому елементі. Ви також повинні передавати лише значення "top" на зразок цього: $ ("# nav"). Affix ({offset: {top: $ ('# nav'). Offset (). Top. І воно повинно бути всередині готового () блок , так що ви знаєте , макет сторінки завершена.
orrd

Спасибо @orrd - оновлення моєї відповіді та загадки!
namuol

Приємно! Працює чудово і дуже гладко. До речі, я шукаю той самий приклад з липким підніжком. Якщо ви знаєте, як це зробити, чи можете ви оновити jsFiddle? Дякую!
Джоселін

76

Просто вперше реалізував це, і ось що я знайшов.

data-offset-topЗначення кількість пікселів , яке необхідно прокручувати для того , щоб проставлення ефекту мати місце. У вашому випадку, як тільки 50pxпрокручується, клас вашого елемента змінюється з .affix-topна .affix. Напевно, ви хочете встановити data-offset-topприблизно 130pxу своєму випадку використання.

Як тільки відбудеться зміна цього класу, ви повинні розмістити свій елемент у css, стилюючи позиціонування для класу .affix. Bootstrap 2.1 вже визначає .affix, position: fixed;тому все, що вам потрібно зробити, це додати власні значення позиції.

Приклад:

.affix {
    position: fixed; 
    top: 20px; 
    left: 0px;
}

1
Thx, що дещо працює. Я оновив свою сторінку прикладу до цього. Проблема полягає в тому, що як тільки навібар отримує "прикріплення" як клас css, клас css navbar відміняється. але я думаю, що це лише помилка / недолік від завантажувальної програми. Змінити це буде непросто, не вводячи його в Менше і не будуючи завантажувальний інструмент.
Диналон

Мені здається, що .navbarклас збережений - ви впевнені?
Поцілунок Дейва

Дякую за цю відповідь, я витратив віки, намагаючись розібратися в цьому
Рувен

Дивіться мою відповідь щодо дещо вдосконаленого, більш загального рішення.
namuol

5

Щоб виправити цю саму проблему, я змінив плагін-афікс, щоб випромінювати подію jQuery, коли об’єкт встановлюється або нефіксується.

Ось запит на витяг: https://github.com/twitter/bootstrap/pull/4712

І код: https://github.com/corbinu/bootstrap/blob/master/js/bootstrap-affix.js

А потім зробіть це, щоб прикріпити навігаційний елемент:

<script type="text/javascript">
$(function(){
    $('#navbar').on('affixed', function () {
        $('#navbar').addClass('navbar-fixed-top')
    });

    $('#navbar').on('unaffixed', function () {
        $('#navbar').removeClass('navbar-fixed-top')
    });
});
</script>

3

Вам потрібно видалити .affix()зі свого сценарію.

Bootstrap дає можливість виконувати речі як через data-attributesJavaScript, так і прямо через JavaScript.


2

Я отримав це з вихідного коду twitterbootstrap, і він працює досить добре:

HTML:

<div class="row">
    <div class="span3 bs-docs-sidebar">
        <ul id="navbar" class="nav nav-list bs-docs-sidenav">
            ...
        </ul>
    </div>
</div>

CSS:

.bs-docs-sidenav {
    max-height: 340px;
    overflow-y: scroll;
}

.affix {
    position: fixed;
    top: 50px;
    width: 240px;
}

JS:

$(document).ready(function(){
    var $window = $(window);
    setTimeout(function () {
        $('.bs-docs-sidenav').affix({
            offset: {
                top: function (){
                    return $window.width() <= 980 ? 290 : 210
                }
            }
        })
    }, 100);
});

1

Вам просто потрібно видалити сценарій. Ось мій приклад:

<!DOCTYPE html>
<html>

<head>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.8.0.min.js"></script>
<script type="text/javascript" src="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.1.0/js/bootstrap.min.js"></script>

  <style>
  #content {
    width: 800px;
    height: 2000px;
    background: #f5f5f5;
    margin: 0 auto;
  }
  .menu {
    background: #ccc;
    width: 200px;
    height: 400px;
    float: left;
  }
  .affix {
    position: fixed;
    top: 20px;
    left: auto;
    right: auto;
  }
  </style>

</head>
<body>
    <div id="content">
        <div style="height: 200px"></div>

        <div class="affix-top" data-spy="affix" data-offset-top="180">
            <div class="menu">AFFIX BAR</div>
        </div>
    </div>
</body>
</html>

1

Завдяки намуолу та Дейву Кіссу за рішення. У моєму випадку у мене була крихітна проблема з висотою та шириною навбар, коли я разом використовував плагіни aflix та згортання. Проблему з шириною можна легко вирішити, успадкувавши її від батьківського елемента (контейнер у моєму випадку). Також мені вдалося зробити так, щоб вона плавно руйнувалася з трохи javascript (насправді coffeescript). Трюк полягає в тому, щоб встановити висоту обгортки до того, autoяк відбудеться перемикання згортання, і виправити її назад.

Розмітка (мл):

#wrapper
  #navbar.navbar
    .navbar-inner
      %a.btn.btn-navbar.btn-collapse
        %span.icon-bar
        %span.icon-bar
        %span.icon-bar

      #menu.nav-collapse
        -# Menu goes here

CSS:

#wrapper {
  width: inherit;
}

#navbar {
  &.affix {
    top: 0;
    width: inherit;
  }
}

Кофескрипт:

class Navigation
  @initialize: ->
    @navbar = $('#navbar')
    @menu = $('#menu')
    @wrapper = $('#wrapper')

    @navbar.affix({offset: @navbar.position()})
    @adjustWrapperHeight(@navbar.height())

    @navbar.find('a.btn-collapse').on 'click', () => @collapse()

    @menu.on 'shown', () => @adjustWrapperHeight(@navbar.height())
    @menu.on 'hidden', () => @adjustWrapperHeight(@navbar.height())

  @collapse: ->
    @adjustWrapperHeight("auto")
    @menu.collapse('toggle')

  @adjustWrapperHeight: (height) ->
    @wrapper.css("height", height)

$ ->
  Navigation.initialize()

0

Моє рішення для прикріплення навібара:

function affixnolag(){

    $navbar = $('#navbar');
    if($navbar.length < 1)
        return false;

    h_obj = $navbar.height();

    $navbar
        .on('affixed', function(){      
            $navbar.after('<div id="nvfix_tmp" style="height:'+h_obj+'px">');
        })
        .on('unaffixed', function(){
            if($('#nvfix_tmp').length > 0)
                $('#nvfix_tmp').remove();
        });
 }

0

Подібно до прийнятої відповіді, ви також можете зробити щось на зразок наступного, щоб зробити все за один раз:

$('#nav').affix({
  offset: { top: $('#nav').offset().top }
}).wrap(function() {
  return $('<div></div>', {
    height: $(this).outerHeight()
  });
});​

Це не тільки викликає affixплагін, але й оберне закріплений елемент у розділ, який підтримуватиме початкову висоту набіру.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.