jPutty для вёрстки, плагин под jQuery

в 15:25, , рубрики: javascript, jquery plugins, Веб-разработка, верстка, кроссбраузерность, метки: , ,

Задача

Вот с таким дизайном мне предстояло разработать сайт, главная страница делится на две полосы – тёмную и светлую. Тонкие линии и некоторые ключевые элементы расположены строго по принципу золотого сечения. И тут меня накрыло…

макет сайта Опять делать простые вещи сложным html+css кодом? Опять каждый браузер будет отображать страницу по-своему? Опять возиться с кроссбраузерностью? Писать хаки?

И почему таких проблем нет в desktop-программировании? Менять размеры элемента по формуле – пожалуйта. Пододвинуть кнопку левее на 17 пикселей – пожалуйста. Устроить принципиально разное расположение элементов в строгой зависимости от размеров окна – нет проблем! И только в html+css с этим могут возникнуть подобные трудности. Однажды я чуть не потерял заказчика, когда затянул с задачей «пододвинуть блок немножечко выше и левее»… мне пришлось основательно переделать всю вёрстку, потому что старая структура на такие перемещения блока рассчитана не была. Труд этот был не оценен, и поделом, ведь в результате я всего лишь пододвинул блок.

Всё, хватит, отныне я решил максимально использовать в вёрстке JavaScript. Да, я знаю что js включен не у всех. Да, я знаю, что сейчас мало кто так делает. По статистике, JavaScript выключен менее чем у 1% пользователей! Много это или мало?

jPutty

Идея была реализована в новом плагине под jQuery. Для тех, у кого выключен JavaScript, реализуем максимально простую вёрстку в подключенном обычном css-стиле (не к максимальной ли простоте стремятся такие пользователи?). Для тех, у кого JavaScript включен, запустится скрипт, реализующий специальное событие:

$(window).readyresize(function(width, height) {
	// using jPutty
});

Событие “readyresize” вызывается один раз по завершению загрузки страницы, и каждый последующий раз при изменении размеров окна браузера.

Подробности на сайте плагина — jputty.ru/getting-started.

Как выглядит решение

Раз — фрагмент html-кода верхней (тёмной) половины страницы.
Каждый элемент – отдельный блок div. Не нужно никаких wrapper-ов, разделительных блоков, и прочих трюков.

<!-- Тёмная (верхняя) сторона сайта -->
 <div id="dark">

	<!-- Sliderman Endegor's Degustation -->
	<div id="DegustationNavigation"></div>
	<div id="Degustation">
	  <img src="./img/Degustation/cognac.png" width="383" height="600" alt="Degustation cognac" />
	  <img src="./img/Degustation/riesling.png" width="383" height="600" alt="Degustation riesling" />
	  <img src="./img/Degustation/bourgogne.png" width="383" height="600" alt="Degustation bourgogne" />
	  <img src="./img/Degustation/bordeaux.png" width="383" height="600" alt="Degustation bordeaux" />
	  <img src="./img/Degustation/champagne.png" width="383" height="600" alt="Degustation champagne" />
	  <img src="./img/Degustation/martini.png" width="383" height="600" alt="Degustation martini" />
	</div>
	<!-- /Sliderman Endegor's Degustation -->

	<div class="delivery_text">Доставка по Украине</div>

	<a href="#">
	  <div class="shop_wine"></div>
	  <div class="shop_wine_text">вино</div>
	</a>
	<a href="#">
	  <div class="shop_cognac"></div>
	  <div class="shop_cognac_text">коньяк</div>
	</a>
	<a href="#">
	  <div class="shop_armagnac"></div>
	  <div class="shop_armagnac_text">арманьяк</div>
	</a>

	<div class="JJB"></div>

	<div class="line"></div>

</div>
<!-- /Тёмная (верхняя) сторона сайта -->

Два — соответствующий фрагмент css-кода.
Для блоков-текстов задаём шрифт, для блоков-картинок задаём фон.

#dark { background-color: #000; color: #f0f0f0; z-index: -10; }

#dark .delivery_text { text-align: right; font-size: 12pt; }
	
#dark .shop_wine { background-image: url(../img/shop/wine.png); }
#dark .shop_wine_text { text-align: center; }
#dark .shop_cognac { background-image: url(../img/shop/cognac.png); }
#dark .shop_cognac_text { text-align: center; }
#dark .shop_armagnac { background-image: url(../img/shop/armagnac.png); }
#dark .shop_armagnac_text { text-align: center; }
	
#dark .JJB { background-image: url("../img/Jean Jacques Brissot.png"); }
	
#dark .line { background-color: #fff; z-index: -10; }

И три! Фрагмент js-кода.
Указываем расположение каждого блока в зависимости от размеров (width и height) браузера.

$(window).readyresize(function(width, height) {

	...

	var dy = (height - 600) / 1.618 + 35;

	$('#dark').putty('xysize', 0, 0, width, height);

	$('#dark #Degustation').putty('xysize', 0, dy - 35 - 1, 383, 600);
	$('#dark #DegustationNavigation').putty('xysize', 0, dy - 35, 20, 600);
	$("#dark #DegustationNavigation a").each(function (i) {
		$(this).putty('xysize', 25, 10 + 25 * i, 11, 11);
	});

	$('#dark .delivery_text').putty('xysize', 0, 5, width - 50, 30);

	$('#dark .shop_wine').putty('xysize', (width - width / 1.618) - 48 / 2, dy, 48, 174);
	$('#dark .shop_wine_text').putty('xysize', (width - width / 1.618) - 100, dy + 174, 200, 36);
	$('#dark .shop_cognac').putty('xysize', (width / 1.618) - 68 / 2, dy + 174 - 139, 68, 139);
	$('#dark .shop_cognac_text').putty('xysize', (width / 1.618) - 100, dy + 174, 200, 36);
	$('#dark .shop_armagnac').putty('xysize', (3*width / 1.618 - width) - 36 / 2, dy + 174 - 172, 36, 172);
	$('#dark .shop_armagnac_text').putty('xysize', (3*width / 1.618 - width) - 100, dy + 174, 200, 36);

	$('#dark .JJB').putty('xysize', 383, height / 1.618 - 76, 768, 76);

	$('#dark .line').putty('xysize', 0, height / 1.618, width, 1);

	...
});

Функция putty() принимает параметры x,y, width и height и задаёт их блоку через свойства css. Таким образом, положение блоков можно задавать динамически, используя все возможности языка JavaScript.

Ссылки и исходники

Сайт плагина jPutty — jputty.ru/
Демо: brissot.biz/
Исходники демо-сайта: data.brissot.biz/jjb.rar

Автор: szubkov

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js