Показать сообщение отдельно
  #1 (permalink)  
Старый 16.04.2013, 17:25
Аватар для Vdomah
Интересующийся
Отправить личное сообщение для Vdomah Посмотреть профиль Найти все сообщения от Vdomah
 
Регистрация: 30.12.2012
Сообщений: 29

Прокрутка всплывающего окна с правильным закрытием
Хочу продолжить эту тему:
Прокрутка всплывающего окна
У автора вышло попап окно как в вк (http://vk.com/yeremyan?z=video135551...deos1355510 0), но с закрытием при клике на любом месте. А мне крайне нужно реализовать полноценный вариант - с закрытием только по клику на оверлее, но не на самом окне.

Ход мыслей:
Попытка 1.
Структура HTML такая:
<div class="preload_overlay"></div>
<div class="popup_preload">
        content
</div>
<a href="#" class="popup_preload_ref">Open popup</a>

Код:
.popup_preload {
    width: 960px;
    margin: 0 auto;
    display: none;[
}
.preload_overlay {
    height: 100%;
    width: 100%;
    position: fixed;
    left: 0;
    top: 0;
    background-color: #808080;
    opacity: 0.75;
    display: none;
}
$('.popup_preload_ref').click(function(){
        $('.popup_preload, .preload_overlay').css('display', 'block');
        $("#outer").css("position","fixed");
        setTimeout(function(){
            $(".popup_preload").css('display', 'block');
        }, 300);
    });
    $('.preload_overlay').click(function(){
        $('.popup_preload').fadeOut(300);
        setTimeout(function(){
            $(".preload_overlay").css('display', 'none');
            $("#outer").css("position","static");
        }, 300);
    });

Результат: Попап появляется, при нажатии на оверлей - закрывается, при клике на само окно событя не происходят.
Проблема: Но нет прокрутки попапа!

Попытка 2.
Упрощенная структура контакта:
<div class="popup_preload_outer">
<div class="preload_overlay"></div>
    <div class="popup_preload_inner">
        <div class="popup_preload">
content
        </div>
    </div>
</div>

Код:
.popup_preload_inner {
    position: relative;
    top: 10%;
    padding-bottom: 40px;
}
.popup_preload {
    width: 960px;
    background: #FFFFFF;
    border: 2px solid #0066FF;
    border-radius: 10px;
    padding: 10px;
    margin: 0 auto;
    display: none;
}
.popup_preload_outer {
    display: none;
    overflow: auto;
    height: 100%;
    width: 100%;
    position: fixed;
    top: 0;
    left: 0;
    z-index: 100;
}
.preload_overlay {
    height: 100%;
    left: 0;
    position: fixed;
    top: 0;
    width: 100%;
    background-color: #808080;
    opacity: 0.75;
    display: none;
}
$('.popup_preload_ref').click(function(){
        $('.popup_preload_outer, .preload_overlay').css('display', 'block');
        $("#outer").css("position","fixed");
        setTimeout(function(){
            $(".popup_preload").css('display', 'block');
        }, 300);
    });
    $('.preload_overlay').click(function(){
        $('.popup_preload').fadeOut(300);
        setTimeout(function(){
            $(".preload_overlay, .popup_preload_outer").css('display', 'none');
            $("#outer").css("position","static");
        }, 300);
    });

Результат: Попап прокручивается точно как в ВК.
Проблема: Попап не закрывается по клику на оверлее, кроме клика по области над попапом - там оверлей выглядывает из-под div.popup_preload_inner.

И в этой точке я застрял. Нащупывал пока два возможных варианта, но оба кривоватые:

Вариант 1.
Задать div.popup_preload float: left - тогда клик на оверлее срабатывает, а на самом окне нет, т.е. все ок.
Проблема: Попап улетел влево и не знаю как его отцентрировать.

Вариант 2.
Справа и слева от div.popup_preload добавить по невидимому блоку, задать им и окну попап float: left и повесить на них закрывающий ивент:
<div class="popup_closer"></div>
       <div class="popup_preload">
content
        </div>
<div class="popup_closer"></div>

Проблема: усложнение HTML-структуры, при масштабировании ширина невидимок не подгоняется и не покрывают всего оверлея. Вроде можно решить при помощи https://github.com/yonran/detect-zoom/ но как-то громоздко.

Пардон за кучу текста, если надо постараюсь уточнить!

Последний раз редактировалось Vdomah, 16.04.2013 в 17:29.
Ответить с цитированием