Статьи

Создайте Awesome Image Gallery с помощью jQuery, Modernizr и CSS3

Даже при том, что мы определенно живем в Эру Flickr (очевидно, это тот, который прибывает сразу после Эры Водолея), все еще есть кое-что настолько прекрасное в том, чтобы иметь возможность распространять большую коробку фотографий по моему кухонному столу. Фактически, мой любимый скринсейвер довольно неплохо справляется с этой задачей — это тот, который встроен в MacOS X, который захватывает фотографии из вашей библиотеки iPhoto и постепенно разбрасывает их по всему экрану в красивой, грязной куче. Это выглядит примерно так:

Фотографии медленно исчезают и падают на экран, беспорядочно вращаясь. Это отличный эффект, и на него довольно приятно смотреть. На правильном сайте это может даже сделать забавную альтернативу обычной галерее изображений.

Можем ли мы достичь этого только с помощью CSS3? Могу поспорить, вы уже думаете о том, как заставить это работать. К сожалению, версии Firefox и IE, которые будут их поддерживать, все еще находятся в бета-версии — и даже когда они появятся, мы все знаем, сколько времени потребуется миру для обновления своих браузеров. А пока давайте рассмотрим гибридный подход:

  • Для людей без JS изображения будут показаны в чистой, простой фотогалерее. Здесь нет необходимости в героизме.
  • Браузеры с включенным JS, но без CSS3-fu увидят версию этой галереи, которая плавно выцветает на фотографиях и разбрасывает их случайным образом. Мы будем использовать jQuery для этого.
  • Браузеры, которые могут выполнять CSS3-преобразования, получат одинаковую анимацию затухания и рассеяния, а также немного поворота для более реалистичного, грязного эффекта.

Давайте начнем с голой версии. Вот небольшая фотогалерея с использованием снимков размером 250 × 250, которые я сделал с помощью различных приложений для iPhone:

Разметка для пользователей, не являющихся JS, проста: некоторые div , немного CSS для базового макета и изображения, расположенные слева в виде сетки. Это чисто и легко и пока будет хорошо; Вы можете увидеть разметку в Примере 1. Давайте перейдем к рассмотрению пользователей JS.

Введите Модернизр

Существует несколько различных способов проверить наличие или отсутствие JS, но что вы делаете, когда вам нужно больше подробностей, например, поддерживает ли браузер CSS3 box-shadow или знает, что делать с canvas ? Введите Modernizr , простой и интуитивно понятный способ обнаружения различных видов поддержки браузеров, не полагаясь на неуклюжие тесты на анализ и расстраивание браузера. Все подробности о том, как это происходит, вы можете услышать в недавнем выпуске подкаста SitePoint. Мы будем использовать его, чтобы увидеть, доступны ли CSS3-преобразования.

Пользовательский компоновщик Modernizr может создавать аккуратную минимизированную версию скрипта, которая включает в себя только те тесты, которые вам нужны, поэтому я использовал компоновщик для сборки с помощью этой опции.

Давайте включим это и jQuery на нашу страницу. Теперь к вашему HTML-элементу должны быть прикреплены два новых класса: js и csstransforms . Используйте инструменты разработчика вашего любимого браузера, чтобы убедиться, что они есть.

Регулировка CSS

Когда JavaScript включен, я бы хотел, чтобы изображения сначала были скрыты — мы будем раскрывать их, увеличивая их непрозрачность по одному. Они также будут абсолютно позиционированы в области галереи. Modernizr дал нам класс js , так что давайте используем это:

  .js #gallery { width: 960px; height: 300px; margin: 50px 0; } .js #gallery, .js #info { width: 100%; position: relative; } .js #gallery img { margin: 0; opacity: 0.0; -moz-opacity: 0.0; -ms-opacity: 0.0; -webkit-opacity: 0.0; position: absolute; bottom:0; left: 0; } 

Так как свойство opacity изображений установлено в 0.0 , вы не должны видеть изображений после того, как вставите это. Все нормально; мы вернем их все в следующей части. Если вас это беспокоит, прокомментируйте эти строки.

Подготовка изображений

Наша следующая задача — перетасовать изображения: мы начнем с each цикла jQuery, который назначает им новые стили. Наш div галереи имеет ширину 760 пикселей и высоту 300 пикселей, поэтому нам понадобится число до 510 для левых позиций изображений и до 30 для их позиций снизу — это должно гарантировать, что они остаются в пределах Границы галереи. По мере того, как они попадают в деление, они будут уменьшаться до своего нормального размера, поэтому мы также добавим переменную для количества жира в пикселях, которое мы хотим добавить к каждому измерению. Мои изображения не превышают 250 пикселей в любом измерении, поэтому обязательно сделайте небольшой расчет для размещения больших или меньших изображений!

Объект JavaScript Math позаботится о том, чтобы мы разработали для нас несколько случайных мест размещения. Поскольку Math.random знает только, как выбрать число от 0 до меньше единицы, нам нужно умножить, а затем округлить с помощью Math.floor чтобы получить полезную цифру:

 $('#gallery img').each(function(count) { var $photo = $(this); var zoom = 150; var offsetLeft = Math.floor(Math.random() * 510); var offsetBottom = Math.floor(Math.random() * 70); }); 

Теперь у нас есть наши числа, мы можем подключить их к стилям и атрибутам изображений, используя методы jQuery css и attr . Это несколько простых строк:

 $('#gallery img').each(function(count) { ... $photo.css({ "left" : offsetLeft + "px", "bottom" : offsetBottom + "px" }).attr({ height : $photo.height() + zoom, width : $photo.width() + zoom }); }); 

Showdown

Каждое фото теперь должно быть заправлено искусственными пикселями и небрежно брошено в беспорядок — пора раскрывать их один за другим. Анимационный метод jQuery может позаботиться о постепенном уменьшении изображения и увеличении прозрачности — просто передайте ему атрибуты CSS, которые вы хотите изменить, и время, потраченное на это.

Мы завернем все это в методе JavaScript setTimeout , который позволяет нам выполнять действия после задержки. В нашем случае мы хотим, чтобы наша анимация происходила с интервалом в пять секунд (это 5000 миллисекунд). Вы заметили, что у нас есть счетчик count в each нашей функции? Мы будем использовать это для разметки наших фото-анимаций, умножив их на 5000 в конце each цикла. На этом этапе весь цикл должен выглядеть следующим образом:

 $('#gallery img').each(function(count) { var $photo = $(this); var zoom = 150; var offsetLeft = Math.floor(Math.random() * 450); var offsetBottom = Math.floor(Math.random() * 30); $photo.css({ "left" : offsetLeft + "px", "bottom" : offsetBottom + "px" }).attr({ height : $photo.height() + zoom, width : $photo.width() + zoom }); if (Modernizr.csstransforms) { var degrees = Math.floor(Math.random() * 40) -20; var rotations = "rotate(" + degrees + "deg)"; $photo.css({ "transform" : rotations, "-moz-transform" : rotations, "-ms-transform" : rotations, "-o-transform" : rotations, "-webkit-transform" : rotations }); } setTimeout(function() { $photo.animate({ height: "-=" + zoom + "px", width: "-=" + zoom + "px", opacity: 1.0 }, 4000); }, (count*5000)); count++; }); 

Если все прошло хорошо, у вас должно быть что-то похожее на Пример 2, и когда вы запустите его, ваша галерея должна выглядеть примерно так, как показано ниже.

Images scattered about when JS is on

Наклон!

Это приятно случайно, но углы действительно отражают эффект. Для тех браузеров с поддержкой transform CSS3 мы добавим несколько случайно сгенерированных вращений. как нам это сделать?

Наряду с добавлением удобных имен классов, Modernizr добавляет глобальный объект, который дает нам «да» или «нет» для каждой из запрашиваемых нами возможностей. В нашем скрипте мы проверим, является ли Modernizr.csstransforms истинным; если это так, мы сделаем еще немного математики, чтобы выяснить хороший случайный поворот, а затем применим его как преобразование к фотографии. Это похоже на последний шаг, за исключением того, что наше случайное число может быть отрицательным:

 if (Modernizr.csstransforms) { var degrees = Math.floor(Math.random() * 40) -20; $photo.css({ "transform" : "rotate(" + degrees + "deg)", "-moz-transform" : "rotate(" + degrees + "deg)", "-ms-transform" : "rotate(" + degrees + "deg)", "-o-transform" : "rotate(" + degrees + "deg)", "-webkit-transform" : "rotate(" + degrees + "deg)" }); } 

Поместите это в each цикл, прежде чем начнется метод setTimeout . Пример 3 показывает вам весь комплект и Caboodle, и если у вас есть браузер с возможностью transform , вы должны увидеть что-то вроде этого:

Scattered and rotated in CSS3

Это оно!

Вы только что создали гладкую, успокаивающую альтернативу скучным старым вращающимся слайд-шоу изображений. Если вы хотите продвинуться еще дальше, вы можете добавить некоторые изюминки, добавив больше визуальных эффектов, таких как box-shadow или дополнительные анимации. Что еще более важно, если вы впервые использовали Modernizr, вы почувствовали, как легко внедрить его в свои проекты.