положение: исправлено, когда левый / верхний / правый / нижний не заданы - желаемые результаты в FF / IE, но не в Safari - PullRequest
25 голосов
/ 03 января 2012

Извините, что пришлось задать еще один связанный с position:fixed вопрос, но чтение других вопросов и веток форума не помогло мне с этим.

Следующий код является упрощенной демонстрацией того, как я использовал position:fixed в проекте до настоящего времени.Мое первоначальное (ошибочное) понимание position:fixed заключается в том, что он изначально фиксируется относительно первого позиционированного родительского контейнера, а после этого остается в этой позиции независимо от положения прокрутки окна просмотра.Теперь я понимаю, что это неправильно: на самом деле, позиции position:fixed относительно самого внешнего контейнера (т. Е. Тега html) и позиции position:absolute относительно первого родительского контейнера, который имеет позицию, отличную от static.

Читая различные другие вопросы по SO, я понимаю, что эффект, которого я пытался достичь с помощью position:fixed, - это тот, который пытались достичь многие другие люди, но потом понял, что это невозможно с помощью только CSS:, чтобы позиционировать элемент относительно контейнера, но затем оставить его там, где он находится относительно области просмотра, при прокрутке страницы.

Что меня смущает, так это то, что вышеизложенное именно то, чего я, казалось, достиг - по крайней мере, в FF и IE8.В приведенном ниже примере кода «фиксированное содержимое правой панели» изначально располагается справа от красного поля «центральное прокручиваемое содержимое» и вертикально на уровне вершины центрального содержимого.Центральное содержимое можно прокручивать, но правое содержимое остается там, где оно есть, как если бы оно изначально статически располагалось в нормальном потоке документов, но после этого остается фиксированным в области просмотра.

Теперь я понимаю, что это выглядит какработать 'в IE8 и FF просто потому, что я не указал top / bottom / left / right атрибутов для элемента fixed.Если я это сделаю, то пойму, что элемент fixed сразу станет позиционироваться относительно области просмотра.

Я предполагал - возможно, опасно - до сих пор, что если относительные позиции не указаны, то position:fixed по умолчанию разместит этот элемент там, где он обычно размещается статически.По крайней мере, FF и IE8, кажется, делают именно это.

Однако тестирование в Safari показывает, что Safari, похоже, размещает этот элемент fixed слева от своего контейнера.Другими словами, без позиционирования, мой элемент position:fixed находится не там, где он был бы, когда статически размещен, и при этом он не расположен в 0,0 относительно области просмотра.

Я полагался на очень плохо определенное поведение на сегодняшний день, и лучше ли мне все-таки прибегнуть к решению JavaScript для достижения этого фиксированного позиционирования?Или это поведение хорошо определено для IE / FF;а кто-нибудь может объяснить логику размещения Safari, пожалуйста?

<style type="text/css">
  #content-centre {
    margin: 0 auto;
    width: 900px;
  }
  
  #header {
    height: 55px;
    position: fixed;
    top: 0;
    width: 990px;
  }
  
  #left-pane {
    position: fixed;
    top: 12px;
    border: 1px green solid;
  }
  
  #main-pane {
    left: 200px;
    position: relative;
    top: 66px;
    width: 760px;
    border: 1px yellow solid;
  }
  
  #container-1 {
    border-top: 1px solid #FFFFFF;
    float: right;
    min-width: 130px;
    padding-left: 20px;
    border: 1px blue solid;
  }
  
  #container-0 {
    margin-right: 20px;
    min-height: 470px;
    overflow: auto;
    padding: 10px 0;
    position: relative;
    border: 1px red solid;
  }
  
  .side-info-list-fixer {
    position: fixed;
  }
</style>

<div id="content-centre">

  <div id="header">
  </div>

  <div id="left-pane">
    Fixed left pane content
  </div>


  <div id="main-pane">
    <div id="page-module-containers">

      <div id="container-1">
        <div class="side-info-list-fixer"> Fixed right pane content </div>
      </div>

      <div id="container-0">
        <p>Centre scrollable content</p>
        <p>Centre scrollable content</p>
        <p>Centre scrollable content</p>
        <p>Centre scrollable content</p>
        <p>Centre scrollable content</p>
        <p>Centre scrollable content</p>
        <p>Centre scrollable content</p>
        <p>Centre scrollable content</p>
        <p>Centre scrollable content</p>
        <p>Centre scrollable content</p>
        <p>Centre scrollable content</p>
        <p>Centre scrollable content</p>
        <p>Centre scrollable content</p>
        <p>Centre scrollable content</p>
        <p>Centre scrollable content</p>
        <p>Centre scrollable content</p>
        <p>Centre scrollable content</p>
        <p>Centre scrollable content</p>
        <p>Centre scrollable content</p>
        <p>Centre scrollable content</p>
        <p>Centre scrollable content</p>
        <p>Centre scrollable content</p>
        <p>Centre scrollable content</p>
        <p>Centre scrollable content</p>
        <p>Centre scrollable content</p>
        <p>Centre scrollable content</p>
        <p>Centre scrollable content</p>
        <p>Centre scrollable content</p>
        <p>Centre scrollable content</p>
        <p>Centre scrollable content</p>
        <p>Centre scrollable content</p>
        <p>Centre scrollable content</p>
      </div>

    </div>
  </div>

</div>

Ответы [ 3 ]

17 голосов
/ 05 сентября 2012

Я полагаю, что вы ищете следующий ответ:

Положение элемента по умолчанию не равно 0,0.Его позиция по умолчанию установлена ​​относительно содержащего элемента, поэтому в вашем примере «# container-1» имеет padding-left: 20px, тогда как остальная часть отступа установлена ​​в 0, делая позицию «default» элемента 20pxслева от стены # container-1 и вершины 0px от вершины # container-1.

Положение по умолчанию для этого элемента по умолчанию, а моя область просмотра не прокручивается, будет 63px от вершины ислева, очевидно, зависит от ширины вашего браузера.Однако, если вы не переопределите верхнюю и левую части, они уже определены механизмом рендеринга как верхняя: 63px, left: 893px.

Затем при изменении размера окна эта позиция корректируется с учетом позиции на основев окне просмотра, так что при прокрутке вниз позиция изменяется, чтобы сохранить ее фиксированной.

Итак, просто добавив «position: fixed;»Ваши свойства (в отношении браузера) будут следующими:

position:fixed;
top:63px; // defined by default during browser rendering in some browsers (based on scroll position on load)
left:893px; // defined by default during browser rendering in some browsers (based on scroll position / width of browser at time of load)

Кроме того, IE6 и подобные элементы не поддерживают позицию: исправлено вообще.http://fiddle.jshell.net/uaE4g/4/show/

Надеюсь, это поможет!

0 голосов
/ 03 августа 2016

У меня было такое же требование, чтобы поместить элемент fixed в его естественное (по умолчанию) static положение относительно области просмотра. В итоге я воспользовался этой простой jQuery функцией.

function SetFixedPositioning(element) {
    var currentOffset = $(element).offset();
    $(element).css("position", "fixed");
    $(element).offset(currentOffset);           
}

Используйте это так:

SetFixedPosition($("#element-to-position"));

В моем случае использовалось навигационное меню второго уровня, которое передавалось в документ, а затем фиксировалось в этом положении.

0 голосов
/ 15 марта 2014

Я вижу похожие результаты в сафари 5, а не в сафари 6.

во всех браузерах, похоже, работает так:

если одно из свойств позиции не определено для фиксированного элемента, начальное значение этого свойства такое же, как если бы объект был статическим. кажется.

после загрузки страницы она продолжает вести себя так, как если бы она была статичной. поэтому, если я фиксирую элемент вертикально, но не горизонтально, я могу прокручивать вверх и вниз, и элемент остается фиксированным, но если я прокручиваю вбок, элементы прокручиваются вместе со страницей.

но в сафари 5, если элемент находится внутри контейнера, который имеет позиционирование, он, кажется, ведет себя так, как вы описали: начальное значение такое же, как если бы оно было статичным, но впоследствии оно остается фиксированным в этой позиции.

ваш 'side-info-list-fixer' находится внутри 'основной панели', которая имеет позицию: относительная. снимите это, и вы можете увидеть то же поведение, что и в Safari 6 и большинстве других браузеров.

Я не знаю, что правильно и нужно ли вам зависеть от этих возможностей ...

$ 2с, * -Pike

...