Как стать автором
Обновить

Комментарии 71

Демо покажите, будьте добры.
после хабраката сразу ссылка по тексту есть
Уже есть стандартный ui-виджет dialog, в котором в том числе есть и маска на бекграунд, так что ваш пример излишен.
полезная вещь, спасибо, не знал
Не соглашусь. Конкретная задача — простое аккуратное решение и ненужно грузить 190 кб дополнительного кода, что бы только открыть диалог.
Сам сделал так же, когда стояла задача с попапом. Долго выбирал, использовать ли UI.
Наши коды удивительно схожи между собой получились)))
Имхо, не стоит фейдить, тем более медленно, однотонные блоки большого размера — может это моя видеокарта не фонтан или монитор старенький, но у меня наблюдается мельтешение серых полос при появлении попапа.
У меня тоже немного есть такого — хотя ноут старенький, конечно.
Но думаю тут не в железе проблема, т.к. в разных браузерах — по-разному ведет себя.

Самое гладкое в FF, заметнее всего в Chrome имхо.
Надо бы в плагин оформить, чтоб можно было так вызывать:
Надо бы в плагин оформить, чтоб можно было так вызывать:
$('popup_bug').popup({
align: 'center',
borderColor: '#F00'
});


И опции использовать можно и методов потом приделать, а то у вас все глобальными методами, а центрирование (alignCenter) сделано отдельным плагином.
$('#popup_bug')
переделал в метод togglePopup(). Добавил по тексту UPD.
Только параметров не стал там задавать.
это если его растягивать или он такой сразу?
Это если растягиваете textarea. Лечится изменением в css для #popup с
width: 300px;
на
min-width: 300px;

Обновил.
на max-width
да нет, max-width даст тот же эффект, что и width — то есть блок закрепим по ширине и textarea будет вылезать.
А если min-width установить — то ширина блока будет плавно ездить и при расширении textarea.
сорри)
я предпочитаю текстарии ставить max-width, тянущая ареа редко нужна
поставьте для textarea width и height !important и webkit (сафари, хром) не дадут возможность растягивать елемент
а вот это не наадо =)
Во, во, это офигенная фишка. Очень удобная.
а IE?
замечательный браузер от самой лучшей компании. )
вы не учли ситуацию когда страница короткая(нет бокового скрола). размер «opaco» не будет меняться при изменении высоты окна браузера.
так что думаю стоит добавить в скрипт нечто типа
jQuery(window).resize(function(){
$('#opaco:visible').height($(document).height());
});

вы где-то смогли получить такую ошибку?
везде работает и так — без этого дополнения.
т.е. если изначально popup открываем в браузере не на полную высоту, а потом вытягиваем вниз — темный фон присутствует полностью во всю высоту.

на самом деле проблема, которая есть, это если разрешение монитора по высоте у пользователя в принципе меньше высоты popup блока — в этом случае он никогда не сможет добраться до кнопок. Но так как пример был больше про JQuery, чем CSS, внимания уделять не стал.
Firefox 3.0.8 — ресайзим браузер на половину высоты экрана, открываем попап, растягиваем окно браузера на максимум по высоте — покрывающий слой по высоте равен изначальной, снизу белая полоса, некрасиво.
Firefox 3.0.8 — делаю абсолютно то же самое — все работает без проблем.
а нельзя было просто прописать в css для центрирования диалога:
left: 50%;
margin-left: -ширина диалога / 2;
position: absolute;

Сейчас у вас позиция открытого диалога никак не зависит от размеров окна браузера — некрасиво как-то. Параметр margin можно вычислять через js и прописывать при окрытии диалога.
Сейчас у вас позиция открытого диалога никак не зависит от размеров окна браузера — некрасиво как-то. Параметр margin можно вычислять через js и прописывать при окрытии диалога.
Не правда Ваша. Сейчас позиция блока центрируется как раз методом alignCenter, который к jQuery добавил.
Ваш метод применим, но во-первых только для ширины блока, т.к. высота обычно динамическая и ее все равно считать на лету надо.
Но и есть ограничение Вашего метода. Например, если в CSS для popup прописать минимальную ширину min-width:300px, тогда каким образом в том же CSS добавить margin-left: -ширина диалога/2?
margin-left: -150px не пойдет, т.к. если внутри popup будет поле скажем шириной 500px весь блок станет шире и у вас он сместится вправо на экране.
У меня же будет всегда по центру как по высоте, так и по горизонтали.
Будет по вашему методу, но координаты высчитываются в момент открытия диалога, если потом размер окна браузера изменится, то координаты уже не будут пересчитаны и диалог будет не по центру, а то и вовсе может уйти к краю браузера.
Да, я понимаю, что эта ситуация не типичная, но представте когда у вас несколько диалогов расположенных в разных местах страницы и окно браузера меняет свой размер? Весь ваш интерфейс либо уйдёт за край страницы, либо его перекосит, если не установлен overflow.

Поэтому вам придётся либо пересчитывать координаты открытых диалогов при изменении размеров окна браузера, либо использовать вариации моего метода. А насчет min-width, что мешает учитывать этот параметр и физическую ширину при расчете положения окна диалога?
Да, я понимаю, что эта ситуация не типичная, но представте когда у вас несколько диалогов расположенных в разных местах страницы и окно браузера меняет свой размер?
ну я описывал сит-ю, когда одно окошко по центру. Если их несколько — там. конечно, все сложнее будет. Но что-то совсем не жизненная сит-я, когда несколько popup одновременно. Если не нравится, что уходит за край при растяжке браузера — можно дописать, конечно, пересчет отступов и навесить на $(window).resize().

А насчет min-width, что мешает учитывать этот параметр и физическую ширину при расчете положения окна диалога?
насколько я понял, Вы предлагали в CSS засунуть отступ слева для блока вида margin-left: -ширина блока/2. Если на лету считать — то понятно, там проблем не будет. Но у меня именно на лету и считалось.
Усложняете вы всё. Вот поэтому я недолюбливаю дискуссии про jquery — на то, что можно решить двумя строчками на css и тремя на js вы навешиваете полнофункциональный фреймворк и еще добавляете несколько обработчиков для разных событий.

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

Вместо того, что-бы установить процентное смещение и фиксированную отрицательную поправку (которая считается один раз при выводе окна диалога) и предоставить смещать блок диалога встроенному движку браузера вы предлагаете навесить еще одно событие с постоянными пересчетами.

Теперь я понимаю жалобы в других ветках сайта на тормознутость браузеров и нехватки памяти.
Простите.
Вместо того, что-бы установить процентное смещение и фиксированную отрицательную поправку (которая считается один раз при выводе окна диалога) и предоставить смещать блок диалога встроенному движку браузера вы предлагаете навесить еще одно событие с постоянными пересчетами.
да согласен полностью, я просто изначально недопонял Вас. Считал, что Вы это все прописать в CSS файлике именно хотите.
Про $(windows).resize() — это что в голову первое пришло, но тут, конечно, Ваше решение будет лучше.
Вот поэтому я недолюбливаю дискуссии про jquery — на то, что можно решить двумя строчками на css и тремя на js вы навешиваете полнофункциональный фреймворк
дискуссии нужны именно для того, чтобы дали совет и др начинающий понял, как делать не стоит. Как уже писал я в jQuery новичок, как в принципе и в Javascript. А это болезнь всех начинающих — наворачивать лишнее, когда можно сделать проще.
Сейчас у вас позиция открытого диалога никак не зависит от размеров окна браузера — некрасиво как-то. Параметр margin можно вычислять через js и прописывать при окрытии диалога.
Не правда Ваша. Сейчас позиция блока центрируется как раз методом alignCenter, который к jQuery добавил.
Ваш метод применим, но во-первых только для ширины блока, т.к. высота обычно динамическая и ее все равно считать на лету надо.
Но и есть ограничение Вашего метода. Например, если в CSS для popup прописать минимальную ширину min-width:300px, тогда каким образом в том же CSS добавить margin-left: -ширина диалога/2?
margin-left: -150px не пойдет, т.к. если внутри popup будет поле скажем шириной 500px весь блок станет шире и у вас он сместится вправо на экране.
У меня же будет всегда по центру как по высоте, так и по горизонтали.
FPS ужасное, это при том, что машина у меня не самая старая, и мой личный скрипт на эту тему, написанный, правда, с использованием MooTools, работает куда быстрее.
Сомневаюсь, что MooTools или что-то еще будет работать быстрее. Все сводится к Javascript, а jQuery и Mootools это только фреймворк.

Кстати, я перешел с MooTools на jQuery с тех пор, как MooTools зарубили обратную совместимость версий своего фреймворка ;)
А я пользуюсь старой версией Мутулз и это меня ничуть не смущает :)
Меня вот смутило :) Особенно то, что старой версии на сайте этого фреймворка нет. Это вообще из области антипаттернов, выпустить новую версию, которая будет несовместима со старой, да еще и старую с сайта убрать.
А вообще да, Мутулз уже не тот. Старый сайт был такой клевый, не то, что новый… Да и архитектура новая совсем какая-то странная.
+1. Вообще фейд в браузере допустим только на очень малюсеньких областях. А то даже на сильных машинах но с большими мониками и например под linux (ну прям хуже для браузера не придумаешь) и ещё и в firefox — все ТАК тормозит, аж противно.

Q6700 + Nec 24'' + Gentoo Linux + Firefox 3.1b
Честно говоря, не понимаю, зачем создавать темы в которых описываются простейшие приемы.
Хочется оригинального.
Автор перемести это в новорожденный блог «Это очевидно»? ;)
да хз куда переместить
жажда нового у меня :)
Действительно здорово.
А Вам никто не говорил, что onclick в HTML-коде — это прошлый век и просто некошерно?
А как правильно надо?
(function() {
window.onload = function () {

var elements_for_onclick = {
'_my_custom_popup' => function () { showPopup('bug'); },
'_my_custom_popup2' => function () { showPopup('bug'); },

};

}

)();
как-то так

function() {
window.onload = function () {

var elements_for_onclick = [
['_my_custom_popup', function () { showPopup('bug'); }],
['_my_custom_popup2', function () { showPopup('bug'); }],
['_my_custom_popup3', function () { showPopup('bug'); }]
], item, i=0;
while (elements_for_onclick[i] && (item = document.getElementById(elements_for_onclick[i][0]))) {
addOnClick(item, elements_for_onclick[i][1]);
i++;
}

}

)();
Да вы что, здесь же есть jQuery:

$(function() { // или $(document).ready(); кому как нравится
    $("a.popup").click(function() {
        // ...
        return false;
    });
});
черт, извините, привык все ручками писать :)
В IE 6
вообще полный бардак
будь он не ладен, этот IE6
поправил у #popup
position: fixed;
на
position:absolute;
Ковырнул код thickbox и активно использую. Велосипед…
и нафига козе баян? тем более, если вновь созданный баян, хуже имеющихся аналогов.
что-то у меня когда окно с нижней ссылки открывается — всё остаётся вверху.
фф3
вот-вот… )
в опере тоже самое
это я поторопился.
там написали, что в IE6 не работает, а не работало из-за position:fixed, ну я ее и поменял на position:absolute. И совсем забыл про первый пример, где вторая ссылка внизу дана.
вот оно всегда и позиционировалось сверху.

теперь прописал свойства отдельно для IE6.

во всех браузерах кроме IE6 — должно быть в центре и двигаться с прокруткой, в IE6 открывается по центру, но при прокрутке остается на месте.
да я это уже понял.
в жквери достаточно просто посчитать высоту окна/положение скролла.
я просто не стал расшифровывать, сорь;)
В примере тыкаю на нижнюю ссылку, а попап открывается вверху, надо скроллить.
Нелогично.

FF 3.0.8
исправил
причина ошибки — см. комменатрий
Еще было бы неплохо добавить чтобы при нажатии Esc, форма закрывалась. Порой очень удобно.
прочел «Завести ошибку», увидел, что при клику по фону окно не закрывается и закрыл пример. не грамотно.
использовать не буду.
1) При клике на темный фон надо бы закрывать попап.
2) при высоте активной области меньшей, чем высота попапа, последний должен быть виден полностью, а не уползать за границы окна.

А так вроде ниче нового и необычного… Сделано нормально, только уникальности нет.
добавил про клик на темном фоне — UPD 4 по тексту.
Javascript должен быть ненавязчивым, делается в jQuery это очень просто:

<p class="bug"><a href="bug.html">Сообщите об ошибке на сайте!</a></p>
<script type="text/javascript">
$(function() {
    $("p.bug a").click(function() {
        // здесь передается ссылка на форму сообщения ошибки
        // форму лучше подгружать через load() или аналогичные Ajax функции
        showPopup($(this).attr("href"));
        return false;
    });
});
</script>
в javascript'e не силен, статья очень помогла
спасибо!
У меня под IE8 фон затухает нифига не плавно, а моментально. Под FF всё OK.
В IE плавное затухание не работает. Я по тексту писал об этом:
если IE — то там плавного затухания сделать не получится (а мы даже и не пытаемся), а вот во всех остальных случаях, мы постепенно затемняем блок, используя метод fadeTo('slow', 0.7).
А вот в чем там причине — так навскидку не вспомню.
Странно, у меня отлично работают такие же затухания во всех браузерах, в т.ч. чуть ли не IE6. Только я использую другой метод. Сейчас я не на работе, но если память не изменяет, то я юзал css('opacity', 0.7). Попробуйте.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации