воскресенье, 5 февраля 2017 г.
Модальное окно с прокруткой
Модальное окно с прокруткой
Для большого объёма контента, когда требуется прокрутка, скроллинг body, а не содержимого всплывающей записи вызывает неудобство.
<!-- CSS прописать один раз -->
.lightbox1 {
display: none;
}
.lightbox1 + label { /* надпись "образец" */
border-bottom: 1px dashed;
cursor: zoom-in;
}
.lightbox1 + label + * { /* коробка */
visibility: hidden;
position: fixed;
z-index: 11;
top: 0;
left: 0;
right: 0;
bottom: 0;
overflow: auto;
background: rgba(0,0,0,.5);
text-align: center;
line-height: 100vh;
}
.lightbox1:checked + label + * {
visibility: visible;
}
.lightbox1 + label + * > * { /* position: absolute; как-то странно себя ведёт в родителе с position: fixed;, поэтому была задействована ещё одна обёртка */
position: relative;
}
.lightbox1 + label + * > * > :first-child { /* кликабельный фон */
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
cursor: zoom-out;
}
.lightbox1 + label + * > * > :last-child { /* блок с окном */
position: relative;
display: inline-block;
max-width: calc(100% - (8px + 2px)*2);
margin: 8px;
border: 2px solid rgb(51, 103, 153);
box-shadow: 0 0 0 8px rgba(255,255,255,.2);
background: #fff;
text-align: left;
line-height: normal;
vertical-align: middle;
}
.lightbox1 + label + * > * > :last-child > :first-child { /* заголовок */
position: relative;
padding: .5em 4em .5em .5em;
overflow: hidden;
white-space: nowrap;
word-wrap: normal;
text-overflow: ellipsis;
color: #fff;
background: linear-gradient(#669acc 50%, #5589bb 50%);
}
.lightbox1 + label + * > * > :last-child > :first-child label { /* крестик "закрыть" */
position: absolute;
top: calc(.5em - 2px);
right: calc(.5em - 2px);
font-weight: 600;
cursor: pointer;
}
.lightbox1 + label + * > * > :last-child > :last-child { /* поле после заголовка */
padding: .5em;
}
.lightbox1 + label + * > * > :last-child > :last-child label {
position: relative;
z-index: 1;
cursor: pointer;
}
.lightbox1 + label + * label > button {
position: relative;
z-index: -1;
}
<!-- input, label и div идут друг за другом, между ними не должно быть других тегов. for тот же, что и id. id должен использоваться на странице только единожды. То есть, чтобы создать несколько всплывающих элементов, нужно всем input задать один класс lightbox, но разные id. --> <input type="checkbox" id="dva" class="lightbox1"/> <label for="dva">образец</label> <div><div> <label for="dva"></label> <div> <div>Название<label for="dva">✖</label></div> <div>Модальное окно для большого содержания</div> </div> </div></div> <!-- пока красивого решения убрать скролл body я не вижу. Могу предложить в input добавить обработчик событий JavaScript --> <script> var inp = document.getElementsByClassName('lightbox1'); for (var i = 0; i < inp.length; i++) { inp[i].onclick = function() { document.documentElement.style.overflow=(this.checked ? 'hidden' : 'auto'); document.documentElement.style.marginRight=(this.checked ? '17px' : ''); } } </script>
0 коммент.:
Отправить комментарий