Javascript.RU

Отказ от js как оптимизация js, часть 1

Пагубное влияние jQuery уже приводит к тому, что разработчики потихоньку начинают забывать css и сталкиваются с ним исключительно в виде element.style. А зря! Ведь несложные, в общем-то, вещи могут сильно облегчить жизнь как разработчика, как и пользователя.

Сегодня в своих социально-эксгибиционистских мемуарах я поведаю про такие вот вещи. Как обычно, «из коробки» они Вам вряд ли пригодятся, но могут пригодиться как методы.

Начнем с основ, т.е., блочной модели.

Иллюстрация таковой для элемента с position:absolute или position:fixed будет выглядеть примерно так:

  • Белой заливкой обозначена «рабочая» часть элемента, ее ширина и высота и задаются height и width.
  • Желтой — отбивка (padding).
  • Синей — поля (margin).
  • Зеленой — top и bottom, т.е., расстояния от верхней границы поля до верхней границы offsetParent и от нижней до нижней.
  • Фиолетовой — left и right. То же самое, но для левой и правой границ.

(Кстати, Вы были когда-нибудь удивлены, когда абсолютно спозиционированный <h1> или <ul> оказывались ниже, чем Вам хотелось бы? )

Вместе эти размеры составляют неразрывную размерную цепь. Вот и выходит, что инструментария для точного позиционирования элементов у нас более, чем достаточно. Более того, top, right, bottom, left, margin-top, margin-right, margin-bottom и margin-left могут принимать еще и отрицательные значения и задаваться в процентах от размеров offsetParent.
Сразу оговорюсь, что если у родительского элемента height установлено в auto, W3C-браузеры должны считать, что высоты у него нет, и выражение высоты или отступа по высоте в процентах от него смысла не имеет и всегда равно нулю.

Но в случае элементов с position: fixed нам несказанно повезло, offsetParent'ом для таких элементов служит окно браузера, которое всегда имеет как ширину так и высоту.

Воспользуемся этим: расположим лайтбокс фиксированных размеров ровно посередине экрана. Для этого при помощи top и left установим границу полей прямо посередине экрана, а сами поля сделаем отрицательными, так, что они «вытолкнут» элемент в центр.

Вот так. Дешево и сердито. И, заметьте, никаких onresize, нам нужно установить элемент в центр экрана (viewport'а, если точнее), мы берем его и устанавливаем. В замечательном браузере Microsoft Internet Explorer 6, правда, position: fixed нет как такового, но зато есть целая гора фиксов.

Ну и примерчик.

var createLightBox = (function (){
	function insertCSS (){
		if (arguments.callee.run) return;
		var css = document.createElement("style");
		css.type = "text/css";
		css.appendChild(document.createTextNode("\
		.js-my-lightbox {\
			position: fixed;\
			left: 50%;\
			width: 336px;\
			height: 76px;\
			margin: -38px 0px 0px -168px;\
			top: 50%;\
			background: crimson url(/forum/images/ca_serenity/misc/logo.gif) 0px 0px no-repeat;\
			cursor: pointer;\
		}\
		"));
		document.getElementsByTagName("head")[0].appendChild(css);
		arguments.callee.run = true;
	};
	function onclick(){
		this.parentNode.removeChild(this);
	};
	return function(){
		insertCSS();
		var myLightBox = document.createElement("div");
		myLightBox.className = "js-my-lightbox";
		myLightBox.onclick = onclick;
		document.body.appendChild(myLightBox);
	};
})();

createLightBox();

И напоследок. Как Вы думаете, как будет расположен элемент?

.my-element {
	position: fixed;
	margin: 3px;
	border: solid green 3px;
	padding: 10px;
	width: auto;
	height: auto;
	top: 0px;
	right: 0px;
	bottom: 0px;
	left: 0px;
}

Эх, боюсь, за сегодня не напишу всего, что хотел. Ну, как-нибудь в другой раз.

+5

Автор: Octane, дата: 23 декабря, 2009 - 12:54
#permalink

После FD точку с запятой ставить не надо:

function insertCSS() {
    …
}; // ←

Точку с запятой ставят после FE, чтобы следующее выражение в скобках не привело к вызову функции:

var test1 = function () {
    alert(arguments[0]);
}
(function () { return "test1" }())

var test2 = function () {
    alert(arguments[0]);
};
(function () { return "test2" }())

function test3() {
    alert(arguments[0]);
}
(function () { return "test3" }())

Автор: Shahurik, дата: 14 марта, 2010 - 19:24
#permalink

Неудобно. Нужно знать ширину и высоту объекта. А если не знаем или она динамически изменяется?


Автор: Гость (не зарегистрирован), дата: 14 апреля, 2010 - 23:45
#permalink

А где вы увидели указание о том, что этот рецепт на все случаи жизни?


Автор: Александер (не зарегистрирован), дата: 21 июля, 2010 - 14:43
#permalink

Не могу понять, почему left:-50% на схеме отступов... ))) видимо опечатка ? )


Автор: subzey, дата: 1 ноября, 2010 - 11:46
#permalink

Да, разумеется, опечатка.


Автор: Гость (не зарегистрирован), дата: 29 августа, 2011 - 14:38
#permalink

Можно сделать проще, если ввести ещё один div

Чтобы не распинаться, пишу всё в атрибут style. Думаю, кому надо, сам рассуёт всё по таблице стилей.
<div style="position:fixed;left:50%;top:50%">
<div style="position:relative;left:-50%;top:-50%">

</div>
</div>
Такой подход не требует вычисления величины отрицательных отступов.
Понятно, что я прописал не все параметры, необходимые для нормальной работы (требуется как минимум задать ширину и высоту внешнего div-a), но достаточно, чтобы показать суть идеи.

Метод не универсален, т.к. внешний div может своими невидимыми частями перекрывать расположенные на более низких слоях элементы, не позволяя осуществить по ним клик.


Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
17 + 2 =
Введите результат. Например, для 1+3, введите 4.
 
Поиск по сайту
Другие записи этого автора
subzey
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Популярные таги
Последние комментарии
Последние темы на форуме
Forum