2013-05-07 9 views
1

У меня есть следующие HTML структурыCSS - позиция элемента над другим внутри области прокрутки

<div id="scrolling-container"> 
    <div id="cover"></div> 
    <div id="contents"> 
     A variable amount of iframes 
    </div> 
</div> 

Here is the base jsbin explaining the issue.

Я хотел бы быть в состоянии сторону прокрутки #contents, но я хочу, чтобы это было покрыто полностью прозрачным элементом (#cover), который я могу использовать для обнаружения кликов и обеспечения более простой боковой прокрутки на планшете.

Должно быть возможно сделать это только с помощью css. #cover { position:absolute,top:0,bottom:0,left:0,right:0} похоже, что это был бы способ пойти сюда, поскольку это техника, которую я использовал десятки раз раньше, но с прокруткой она не растягивается полностью вправо, а скорее на кончик первоначально видимой области прокрутки , По мере прокрутки он больше не охватывает элементы

Here is a demonstration of the issue. Попробуйте прокрутить контейнер, и вы увидите проблему.

+0

Почему вы против использования JavaScript для этого? – apaul

+0

@ apaul34208 Я в настоящее время, но его хакерство, как и все грехи. В iframes в '# contents' требуется некоторое время для перерисовки, и каждый из них перерисовывается асинхронно. В настоящее время у меня нет простого крючка (хотя я могу, конечно, создать его), когда заканчивается перерисовка.Кроме того, это путает код viewmodel с ui проблемами и просто чувствует себя нехорошо в целом. –

ответ

2

Попробуйте установить содержимое дел до position: relative, а затем с помощью псевдо элемента для создания обложки:

Демо: http://jsbin.com/arajag/1/edit

CSS:

div { 
    border: 1px solid grey; 
} 

#scrolling-container { 
    overflow-x: scroll; 
    position: relative; 
} 
#contents { 
    width: 400em; 
    height: 10em; 
    position: relative; 
} 

#contents:after { 
    content: " "; 
    position: absolute; 
    z-index: 100; 
    background-color: blue; 
    top: 0; 
    left: 0; 
    bottom: 0; 
    width: 100%; 
} 

HTML: Удалить #cover

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

+0

Мне нужно попробовать, но похоже, что это может сработать ... –

+0

Довольно круто! Я исправил поля, явно установив их на #contents и затем инвертируя их на #contents :: after. http://jsbin.com/arajag/5/edit –

+0

@OldPro, Спасибо, я не установил их для демонстрации, потому что поля OP, вероятно, отличаются от настроек по умолчанию в браузере. –

-1

Попробуйте это ..

#cover { 
    width: 400em; 
    height: 20em; 
    position: absolute; 
    z-index: 100; 
    background-color: blue; 
    top: 0; 
    left: 0; 
    bottom: 0; 
    right: 0; 
} 

Это то, что вы имели в виду ??

+0

Этот жесткий код кодирует ширину '# cover' - я строго кодировал ширину #contents в примере, но, как я уже сказал, #contents на самом деле имеет переменную ширину. –

0

Здесь вы идете http://jsbin.com/oquguh/1/edit, я сделал ваш #container div тем, кто обрабатывает прокрутку.

+0

Но это жестко кодирует ширину, не так ли? Если ширина определяется тем, что на самом деле происходит внутри #contents (как я уже сказал, в моем фактическом случае это список iframes), то я не вижу, как это будет работать. –

+0

ну, вы не можете сделать что-то 100% ширины в css, если ширина родителя не определена. Единственный способ сделать это - использовать javascript после загрузки содержимого. –

+0

Это не так, 'width: 100%' просто сообщает блочным элементам, чтобы заполнить все доступные пространства по горизонтали, довольно часто использовать его без ширины родительского элемента. Кроме того, я использую положение: абсолютное и закрепление углов, а не настройку ширины напрямую. Использование этого трюка прекрасно работает, когда вы «не» внутри элемента прокрутки, это только прокрутка, которая его испортила. –

1

Update

Вы могли

Вы должны

Вы все еще можете, totally drop that and use jQuery,

Example

J s

$(document).ready(function() { 
    var x = $('#contents').width(); 
    $('#cover').width(x); 
}); 

$(window).resize(function() { 
    var x = $('#contents').width(); 
    $('#cover').width(x); 
}); 

$('#scrolling-container').scroll(function() { 
    var x = $('#contents').width(); 
    $('#cover').width(x); 
}); 

CSS

div { 
    border: 1px solid grey; 
} 

#scrolling-container { 
    overflow-x: scroll; 
    position: relative; 
} 
#contents { 
    width: 4000em; 
    height: 10em; 
} 

#cover { 
    position: absolute; 
    z-index: 100; 
    top:0; 
    bottom:0; 
    background-color: blue; 

} 

К сожалению о том, что это должно работать, как рекламируется.

+0

Вы можете и я сейчас (хотя я не знал о событии изменения размера +1 для этого), но по целому ряду причин я бы хотел его избежать. Самое главное, однако, что это абсолютно выполнимо с css только тогда, когда вы не используете область прокрутки, кажется странным, что введение 'overflow-x: scroll' внезапно потребует javascript –

+0

Я знаю его разочарование. Я столкнулся с проблемой, работая над простыми макетами двух столбцов. – apaul

+0

Хм ... Просто попробовал это. Событие изменения размера - в то время как оно может быть установлено на конкретном элементе - будет срабатывать только при изменении размера окна –

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