2015-07-21 2 views
5

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

position:fixed 

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

Смотреть это fiddle demo

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

.container{ 

    /*-webkit-transform: translateZ(0); 
    -moz-transform: translateZ(0); 
    -ms-transform: translateZ(0); 
    transform: translateZ(0);*/ 

    -webkit-transform: none; 
    -moz-transform: none; 
    -ms-transform: none; 
    transform: none; 
} 

Если вы замените текущий блок CSS (с преобразованием установлено ни) с одной с translateZ, заголовок получит позиционированный в его родительском контейнере, но больше не фиксируется.

Кто-нибудь знает, как это решить? Предпочтительным решением будет только CSS/HTML и избежать JS, но если ничего другого, то JS, конечно же, мне нужно сходить!

+6

Чтобы исправить что-то относительно родителя ists, вам понадобится 'position: relative' на родительском и' position: absolute' на дочернем – atmd

ответ

2

CSS не может это сделать сам по себе.

Position: fixed работает в отношении видового экрана, а не содержит элемент.

Я видел an attempt to solve this problem, используя свойство CSS3 transform, но (как вы отметили в своем комментарии к моему первому ответу), похоже, что это не работает.

Насколько я понимаю, вы не можете использовать какую-либо клиентскую библиотеку, но это единственное решение, доступное, насколько мне известно. Для вас и других, которые могут когда-нибудь понадобиться, вот решение, которое работает. В нем используется немного jQuery:

Позиционирование элемента внутри другого элемента с позиционированным элементом, закрепленным вдоль осей x и y (то есть положение фиксировано горизонтально и вертикально).

http://jsfiddle.net/8086p69z/8/

HTML

<div class="moving-article"> 

    <div class="container"> 

    <header class="fixed-header">FIXED HEADER</header> 

     <ul> 
     <li>SCROLL</li> 
     <li>SCROLL</li> 
     <li>SCROLL</li> 
     </ul>  

    </div> 

</div> 

CSS (соответствующий раздел)

.moving-article { 
    height: 150px; 
    width: 75%; 
    overflow-x: scroll;  
} 

.fixed-header { 
    background: rgba(0,0,0,0.5); 
    width: 50%; 
    text-align: center; 
    line-height: 40px; 
    position: absolute; 
    top: 0; 
    left: 0; 
} 

.container{ 
    width: 1000px; 
} 

JQuery

+0

Еще раз спасибо @mbnyc, мне, возможно, придется пересмотреть мои варианты. Однако, похоже, это работает в некоторых случаях, оно не работает, если есть горизонтальное переполнение как для заголовка, так и для содержимого. Мне нужно переполнение заголовка, чтобы он был скрыт в контейнере так же, как и его содержимое. –

+0

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

+0

Предположим, что класс контейнера имеет ширину 1000 пикселей, и вы имеете переполнение переполнения по горизонтали. Тогда заголовок должен быть таким же широким и использовать ту же горизонтальную прокрутку, что и для содержимого в контейнере. Если вы установите ширину заголовка, скажем, на 100%, тогда заголовок будет перекрывать контейнер и заполнять весь экран. Вот сценарий этого примера: http://jsfiddle.net/8086p69z/12/. Теперь все дело в том, что заголовок должен быть «внутри» контейнера вместе с остальной частью содержимого. Поэтому, когда вы просматриваете горизонтали для просмотра содержимого, заголовок следует. –

0

установите положение заголовка в «абсолютное», и это родительский контейнер (который вы хотите, чтобы он был относительным) к «относительному», и установил его, чтобы он придерживался вершины родителя с помощью «top: 0»

CSS:

.container { 
    position: relative; 
} 

.child { 
    position: absolute; 
    top: 0; 
} 
+1

Это дает тот же результат, что и при использовании преобразования? Заголовок не отображается в списке прокрутки. http://jsfiddle.net/8086p69z/3/ –

+0

Возможно, я неправильно понял, вы можете объяснить, что именно вы пытаетесь достичь? –

+0

Мне нужен заголовок, чтобы следить за содержащим родителем при прокрутке вниз по окну. Когда содержимое моего заголовка шире, чем контейнер, оно должно дать мне горизонтальную прокрутку (как в демо), но она все равно должна следовать прокрутке вниз –

1

Чтобы сохранить элемент в неподвижном родителе не может быть сделан с position: fixed, потому что position: fixed принимает элемент out of the flow и, следовательно, не имеет родителя. Он позиционирует себя относительно окна просмотра.

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

Надеюсь, это поможет. Удачи.

+0

Спасибо @mbnyc, но я не могу использовать клиентскую библиотеку. Нет других предложений? –

+0

Возможно, вы можете сделать это с помощью CSS3 'transform'. http://stackoverflow.com/questions/6794000/fixed-position-but-relative-to-container –

+0

Не могу заставить это работать. Несмотря на то, что он правильно прикреплен к контейнеру, он не фиксируется в верхней части его при прокрутке. http://jsfiddle.net/8086p69z/5/ –

Смежные вопросы