Галерея с использованием элемента HTML5 canvas
В данном уроке мы построим галерею с использованием визуальных эффектов на основе HTML5 и CSS3. Серая "копия" изображения будет создаваться элементом canvas, а визуальное преобразование при наведении курсора будет выполняться трансформациями CSS3.
Шаг 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.
Источник: http://feedproxy.google.com/~r/ruseller/CdHX/~3/AuqCHxbZyzU/lessons.php
Дайджест новых статей по интернет-маркетингу на ваш email
Новые статьи и публикации
- 2024-11-26 » Капитан грузового судна, или Как начать использовать Docker в своих проектах
- 2024-11-26 » Обеспечение безопасности ваших веб-приложений с помощью PHP OOP и PDO
- 2024-11-22 » Ошибки в Яндекс Вебмастере: как найти и исправить
- 2024-11-22 » Ошибки в Яндекс Вебмастере: как найти и исправить
- 2024-11-15 » Перенос сайта на WordPress с одного домена на другой
- 2024-11-08 » OSPanel 6: быстрый старт
- 2024-11-08 » Как установить PhpMyAdmin в Open Server Panel
- 2024-09-30 » Как быстро запустить Laravel на Windows
- 2024-09-25 » Next.js
- 2024-09-05 » OpenAI рассказал, как запретить ChatGPT использовать содержимое сайта для обучения
- 2024-08-28 » Чек-лист: как увеличить конверсию интернет-магазина на примере спортпита
- 2024-08-01 » WebSocket
- 2024-07-26 » Интеграция с Яндекс Еда
- 2024-07-26 » Интеграция с Эквайринг
- 2024-07-26 » Интеграция с СДЕК
- 2024-07-26 » Интеграция с Битрикс-24
- 2024-07-26 » Интеграция с Travelline
- 2024-07-26 » Интеграция с Iiko
- 2024-07-26 » Интеграция с Delivery Club
- 2024-07-26 » Интеграция с CRM
- 2024-07-26 » Интеграция с 1C-Бухгалтерия
- 2024-07-24 » Что такое сторителлинг: техники и примеры
- 2024-07-17 » Ошибка 404: что это такое и как ее использовать для бизнеса
- 2024-07-03 » Размещайте прайс-листы на FarPost.ru и продавайте товары быстро и выгодно
- 2024-07-01 » Профилирование кода в PHP
- 2024-06-28 » Изучаем ABC/XYZ-анализ: что это такое и какие решения с помощью него принимают
- 2024-06-17 » Зачем вам знать потребности клиента
- 2024-06-11 » Что нового в работе Яндекс Метрики: полный обзор обновления
- 2024-06-11 » Поведенческие факторы ранжирования в Яндексе
- 2024-06-11 » Скорость загрузки сайта: почему это важно и как влияет на ранжирование
Все мы сидим в сточной канаве, но некоторые при этом смотрят на звезды Уайльд Оскар - (1854-1900) - английский писатель |
Мы создаем сайты, которые работают! Профессионально обслуживаем и продвигаем их , а также по всей России и ближнему зарубежью с 2006 года!
Как мы работаем
Заявка
Позвоните или оставьте заявку на сайте.
Консультация
Обсуждаем что именно Вам нужно и помогаем определить как это лучше сделать!
Договор
Заключаем договор на оказание услуг, в котором прописаны условия и обязанности обеих сторон.
Выполнение работ
Непосредственно оказание требующихся услуг и работ по вашему заданию.
Поддержка
Сдача выполненых работ, последующие корректировки и поддержка при необходимости.