У меня есть фиксированный контейнер в одностраничном приложении, и я хочу, чтобы один div внутри этого контейнера перекрывал границы фиксированного контейнера , а также вертикально прокручивал содержимое фиксированного контейнера.Тем не менее, я получаю один или другой на работу, но не оба из них.Мне интересно, есть ли решение только для CSS?
Существует jsfiddle , который демонстрирует проблему.
Цель
[Пример в изображенииудален из-за отсутствия репутации.Его можно найти здесь .]
Функциональная цель - создать кликабельный маркер рядом с элементом управления вводом на боковой панели с фиксированным расположением, где клиент может редактировать несколько свойств бизнес-элемента.,Маркер должен перекрывать границы контейнера, чтобы выделяться больше.Исходя из этого, я хочу выполнить как минимум пять требований:
- Самый верхний контейнер должен иметь положение: фиксированное, поскольку SPA в фоновом режиме можно прокручивать в обоих направлениях
- Содержимое самого верхнего фиксированного контейнера должно прокручиваться вертикально, если это необходимо, но не должно прокручиваться горизонтально
- Поле должно находиться рядом с целью в содержимом
- Это поле должно перекрывать верхний контейнерграницы
- Это поле должно прокручиваться по вертикали при прокрутке содержимого самого верхнего контейнера (и, следовательно, цели блока)
Базовая структура - это фиксированный контейнер> содержимое (я)> перекрывающийся элемент div.Я осознаю тот факт, что комбинация переполнения и относительного позиционирования остановит перекрытие дочернего элемента с абсолютным позиционированием.Поэтому я попробовал несколько вариантов правил CSS и HTML-разметки - но в итоге окно либо перекрывалось, либо прокручивалось с его целью.Мы очень ценим ваши идеи о том, как решить эту проблему без кода.
Код
Это (упрощенная) разметка HTML:
<div class="sidebar-container">
<div class="sidebar-content-wrapper">
<div class="sidebar-content">
<div class="sidebar-content-main">
<!-- more content -->
<div class="overlap-container">
<div class="overlap-wrapper">
<div class="overlap-relative-container">
<div class="overlap-box"></div>
</div>
<div class="overlap-caption">Some text, the box should appear left to this element.</div>
</div>
</div>
<!-- more content -->
</div>
</div>
</div>
</div>
Самый верхний контейнерисправлено:
.sidebar-container {
position: fixed;
// [ ... ]
}
Это дочерний элемент, у оболочки содержимого есть правила, разрешающие вертикальную прокрутку содержимого, а горизонтальная полоса прокрутки скрыта:
.sidebar-content-wrapper {
height: 100%;
// content should be scrollable vertically, while horizontal scroll is not allowed
overflow-y: scroll;
overflow-x: hidden;
}
Поле, которое должно перекрывать контейнерпозиционируется абсолютно:
.overlap-box {
position: absolute;
left: -2em;
width: 3em;
height: 3em;
z-index: 99;
// [ ... ]
}
Остановка здесь позволит коробке перекрывать фиксированный контейнер.Однако, если содержимое прокручивается по вертикали, поле также не будет прокручиваться, поскольку оно расположено на следующем позиционированном элементе, который является .sidebar-container
.Итак, давайте добавим position: relative
к родительскому элементу поля:
.overlap-relative-container {
position: relative;
}
Быстро и просто, это позволяет блоку прокручивать содержимое моего фиксированного контейнера.Но он больше не будет перекрывать фиксированный контейнер.
Полный код можно найти в этом jsfiddle .
Уроки, полученные на данный момент
Отказ от ответственности: я знаю, что есть работающее решение, использующее событие onscroll и JavaScript.И я готов реализовать это решение, чтобы окончательно решить мою проблему.Тем не менее, решение только для CSS было бы намного лучше ИМХО, и я хочу разрубить этот маленький узел Гордиана: -)