Галерея с использованием элемента HTML5 canvas

В данном уроке мы построим галерею с использованием визуальных эффектов на основе HTML5 и CSS3. Серая "копия" изображения будет создаваться элементом canvas, а визуальное преобразование при наведении курсора будет выполняться трансформациями CSS3.

Галерея на         элементе canvas

demosourse

 

Шаг 1. Разметка

Разметка очень простая. Каждый элемент галереи является пунктом неупорядоченного списка.

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8" />
	<title>Галерея на HTML5 | Материалы сайта RUSELLER.COM </title>
	<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
</head>

<body>
	<div id="wrap">
		<h1>Галерея</h1>
		<ul id="gallery">
			<li><a href="http://pinkonhead.com/freebies/photos/spring-is-coming-10-free-photos/" target="_blank"><img src="images/flo1.jpg"><div>Весенние цветы 1</div></a></li>
			<li><a href="http://pinkonhead.com/freebies/photos/night-photo-driving-17-free-photos/" target="_blank"><img src="images/lights2.jpg"><div>Городской свет 1</div></a></li>
			<li><a href="http://pinkonhead.com/freebies/photos/spring-is-coming-10-free-photos/" target="_blank"><img src="images/flo3.jpg"><div>Весенние цветы 2</div></a></li>
			<li><a href="http://pinkonhead.com/freebies/photos/night-photo-driving-17-free-photos/" target="_blank"><img src="images/lights1.jpg"><div>Городской свет 2</div></a></li>
			<li><a href="http://pinkonhead.com/freebies/photos/spring-is-coming-10-free-photos/" target="_blank"><img src="images/flo2.jpg"><div>Весенние цветы 3</div></a></li>
			<li><a href="http://pinkonhead./freebies/photos/night-photo-driving-17-free-photos/" target="_blank"><img src="images/lights3.jpg"><div>Городской свет 3</div></a></li>
		</ul>
		<p>Фотографии от <a href="http://pinkonhead.com" target="_blank">Pinkonhead</a></p>
	</div>
</body>
</html>

 

Шаг 2. Основные стили

Набор стилей начнем с простого сброса:

html, body, div, span, h1, h2,  p, a,  ul, li, img
{margin: 0; padding: 0;
border: 0; outline: 0;
font-size: 100%;background: transparent;}
ul {list-style: none;}
:focus {outline: 0;}
a {text-decoration:none;}

Мы используем изображения размером 300px x 300px. Основной контейнер #wrap центрируется по высоте (margin: 0 auto) и получает ширину 1020px (=340 x 3). Пункт списка получает свойство  float : left и позиционируется относительно. Заголовок изображения оборачивается в элемент div, который будет выдвигаться вверх при наведении курсора мыши на изображение. Для создания визуальных эффектов используется переход css3.

Примечание. Для наглядности в тексте урока опущены префиксы браузеров. Полный код можно найти в тексте исходников.

#wrap {
  width: 1020px; 
  margin: 0 auto;
} 
li {
  float:left; 
  position:relative; 
  display:inline-block; 
  width:300px; 
  height:300px;
  margin:10px; 
  padding:10px; 
  background:#fff; 
  box-shadow:0 0 5px rgba(0,0,0,.35);
}
li div {
  position:absolute;
  height:0; 
  width:280px;
  background:rgba(0,0,0,.45); 
  overflow:hidden;
  bottom:10px; 
  left:10px;
  padding: 0 10px;
  line-height:50px;
  color:#fff;
  transition:height 1s;
}
li:hover div {
  height:50px;
}

 

Шаг 3. Элемент canvas

Теперь приступим к использованию элемента HTML5 canvas, для формирования серой версии изображения. Функция createCanvas создает элемент, получает копию изображения, выполняет конвертацию и выводит результат в элемент canvas, а затем вставляет его в структуру DOM. С помощью метода .each() функция createCanvas выполняет итерации по всем изображениям в списке #gallery.

	$(window).load(function() {

	  $('#gallery img').each(function() {

	    createCanvas(this);
	  });

	  function createCanvas(image) {

	    var canvas = document.createElement('canvas');
	    if (canvas.getContext) {
	      var ctx = canvas.getContext("2d");

	      // Определяем размер элемента canvas
	      canvas.width = image.width;
	      canvas.height = image.height;

	      // Как только мы получили объект исходного изображения, можно использовать метод drawImage(reference, x, y) для вывода его в элемент canvas. 
		  // x, y - координаты, где должно размещаться изображение.
	      ctx.drawImage(image, 0, 0);

	      // Получаем данные изображения и сохраняем его в массиве imageData. 
		  // Данные о точках получаем с помощью метода getImageData(). 
		  // Данные включают цвет точки (десятичное, RGB значение) и прозрачность (значение альфа канала).
		  // Каждый цвет представлен целым значением в диапазоне 0 и 255. 
		  // imageData.da содержит данных объемом (высота x width x 4) байт с индексом в диапазоне от 0 до (высота x ширина x 4)-1.
	      var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height),
	          pixelData = imageData.data;

	      // Цикл по всем точкам в массиве imageData 
	      // и модификация значений цветов.
	      for (var y = 0; y < canvas.height; y++) {
	        for (var x = 0; x < canvas.width; x++) {

	          // Вычисляем индекс нужной точки (x,y):
	          var i = (y * 4 * canvas.width) + (x * 4);

	          // Получаем значение RGB.
	          var red = pixelData[i];
	          var green = pixelData[i + 1];
	          var blue = pixelData[i + 2];

	          // Переводим цвет в серую шкалу. Одна из формул конвертации:   
	          var grayScale = (red * 0.3) + (green * 0.59) + (blue * .11);

	          pixelData[i] = grayScale;
	          pixelData[i + 1] = grayScale;
	          pixelData[i + 2] = grayScale;
	        }
	      }

	      // Помещаем модифицированные данные imageData обратно в элемент canvas.
	      ctx.putImageData(imageData, 0, 0, 0, 0, imageData.width, imageData.height);

	      // Вставляем элемент canvas в DOM, перед изображением:
	      image.parentNode.insertBefore(canvas, image);
	    }
	  }
	});

 

Шаг 4. Стили для элемента canvas

Если посмотреть на сгенерированный код, то он будет выглядеть следующим образом:

<ul id="gallery">
    <li><a href=""><canvas width="300" height="300"></canvas><img src="images/flo1.jpg"><div>Весенние цветы 1</div></a></li>
    <li><a href=""><canvas width="300" height="300"></canvas><img src="images/lights2.jpg"><div>Свет города 1</div></a></li>
    <li>...</li>
    ...
</ul>

Добавим стили для элемента canvas.

canvas {
  opacity:1; 
  position:absolute; 
  top:10px;
  left:10px;
  transition:opacity 1s .2s;
}
li:hover canvas {
  opacity:0;
}

Примечание: данный метод не будет работать в Internet Explorer версий ниже 9.

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: pehaa.com/2012/02/create-your-portfolio-gallery-using-html5-canvas-tutorial/
Перевел: Сергей Фастунов
Урок создан: 1 Августа 2012
Просмотров: 58362
Правила перепечатки


5 последних уроков рубрики "HTML и DHTML"

^ Наверх ^