Заходи
Гость

Хостинг

Статистика
Яндекс.Метрика Счетчик PR-CY.Rank
Онлайн всего: 1
Гостей: 1
Пользователей: 0

Ccылки

Свежак

Главная » 2013 » Декабрь » 8 » Фотогалерея с альбомами на JQUERY
11:33
Фотогалерея с альбомами на JQUERY

Фотогалерея с альбомами на JQUERY

 

 

В этом уроке мы собираемся создать галерею изображений. У нас будет несколько альбомов содержащих слегка повернутые миниатюры, которые будут, появляются при  наведении курсора мыши. Полное изображение будет загружаться при нажатии на миниатюру. Для этой галерее мы будем использовать 2D Transform плагин для анимации вращения.

 

ПОСМОТРЕТЬ ДЕМО                             СКАЧАТЬ ИСХОДНИКИ

 

Давайте начнем.

РАЗМЕТКА

Мы собираемся включить в HTML все наши  DIV с классом "pp_gallery". Он будет состоять из загрузочной DIV, навигации, которая появится, когда полное изображение загрузиться и контейнером основных миниатюр.

Внутри  контейнера, который будет иметь класс "pp_thumbContainer", мы будем иметь несколько DIV для альбомов и DIV для возвращения в альбом. Каждый альбом будет содержать эскизы с описанием, упакованные в DIV с классом «содержания». 

<div id="pp_gallery" class="pp_gallery">

    <div id="pp_loading" class="pp_loading"></div>

    <div id="pp_next" class="pp_next"></div>

    <div id="pp_prev" class="pp_prev"></div>

    <div id="pp_thumbContainer">

        <div class="album">

            <div class="content">

                <img src="images/album1/thumbs/1.jpg" alt="images/album1/1.jpg" />

                <span>The Sixties by Tetsumo</span>

            </div>

            <div class="content">

                <img src="images/album1/thumbs/2.jpg" alt="images/album1/2.jpg" />

                <span>The Sixties by Tetsumo</span>

            </div>

            ...

            <div class="descr">

                The Sixties

            </div>

        </div>

        <div class="album" style="bottom:-90px;">

            ...

        </div>

        ...

        <div class="pp_back">Albums</div>

    </div>

</div>

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

<div id="pp_preview" class="pp_preview">

    <img src="images/album1/1.jpg" />

    <div class="pp_descr"><span>Description</span></div>

</div>

Теперь, давайте посмотрим на стиль.

CSS

*{

    margin:0;

    padding:0;

}

body{

    background:#000 url(../bg.jpg) repeat center center;

    font-family:"Myriad Pro", "Trebuchet MS", Helvetica, sans-serif;

    font-size:12px;

    color: #fff;

    overflow:hidden;

}

Структурированный  фон очень хорошо подходит, мы решили добавить текстуру дерева. Вы можете найти эту текстуру на Webtreats .

Далее стиль загрузки DIV и навигация для фотографии, когда мы находимся в режиме предварительного просмотра:

.pp_loading{

    display:none;

    position:fixed;

    top:50%;

    left:50%;

    margin:-35px 0px 0px -35px;

    background:#fff url(../icons/loader.gif) no-repeat center center;

    width:70px;

    height:70px;

    z-index:999;

    opacity:0.7;

    -moz-border-radius:10px;

    -webkit-border-radius:10px;

    border-radius:10px;

}

.pp_next, .pp_prev{

    cursor:pointer;

    top:50%;

    margin-top:-16px;

    width:32px;

    height:32px;

    position:fixed;

    text-align:center;

    border:1px solid #111;

    color:#fff;

    -moz-box-shadow:0px 0px 3px #000;

    -webkit-box-shadow:0px 0px 3px #000;

    box-shadow:0px 0px 3px #000;

}

.pp_next{

    right:-40px;

    background:#222 url(../icons/next.png) no-repeat center center;

}

.pp_prev{

    left:-40px;

    background:#222 url(../icons/prev.png) no-repeat center center;

}

Загрузка изображений будет в центре страницы с помощью 50% отрицательного значения margin-top. То же самое мы сделаем для элементов навигации, просто, что здесь будут элементы располагаться  вертикально.

Контейнер с эскизами будет расположен в нижней части страницы:

#pp_thumbContainer{

    position:fixed;

    bottom:0px;

    left:0px;

    height:65px;

    width:100%;

}

Альбомы  изначально скрыты. При загрузке страницы, они будут скользить в снизу, поэтому мы установим  начальное нижнее значение -90 пикселей:

#pp_thumbContainer .album{

    position:absolute;

    width:200px;

    height:65px;

    bottom:-90px;

}

 Значение для позиционирования альбомов будет рассчитываться динамически при загрузке страницы. Мы расположим  все альбомы равномерно по всей ширине страницы.

.album .descr,

.pp_back{

    position:absolute;

    bottom:0px;

    left:-16px;

    background:#222;

    text-align:center;

    border:1px solid #111;

    padding:5px;

    cursor:pointer;

    width:169px;

    color:#fff;

    cursor:pointer;

    text-shadow:0px 0px 1px #fff;

    -moz-box-shadow:1px 1px 4px #000;

    -webkit-box-shadow:1px 1px 4px #000;

    box-shadow:1px 1px 4px #000;

}

 

.pp_back{

    text-transform:uppercase;

    bottom:120px;

    left:-100px;

    width:80px;

}

Рамка для изображения и названия изображений будут иметь следующий стиль:

#pp_thumbContainer .content{

    position:absolute;

    top:0px;

    height:155px;

    cursor:pointer;

}

Эти рамки также будет распространяться в динамическом положении в нашем JavaScript. Мы установили верхнее значение 0, для того чтобы  все эскизы выровнять к верхней части контейнера эскизов. Нам не нужны, вертикальные миниатюры.

Миниатюры будут иметь белую рамку и тень:

#pp_thumbContainer img{

    border:5px solid #fff;

    -moz-box-shadow:1px 1px 7px #000;

    -webkit-box-shadow:1px 1px 7px #000;

    box-shadow:1px 1px 7px #000;

}

Описание для каждого изображения невидимо. Мы будем использовать его только, для того чтобы заполнить описание элемента  для просмотра в полном размере.

#pp_thumbContainer .content span{

    display:none;

}

Упаковка  для полного изображения будет позиционироваться вне страницы, установив верхнюю границу до 150%. После загрузки изображения, мы будем двигать его снизу. Мы ставим левое значение до 50%, поскольку мы хотим, отцентрировать изображение. Поскольку мы не знаем еще, ширину и высоту фото, мы не можем устанавливать какие-либо отрицательные поля. Мы сделаем это в нашей функции JavaScript.

.pp_preview{

    position:fixed;

    top:150%;

    left:50%;

}

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

.pp_preview img{

    position:absolute;

    top:0px;

    left:0px;

    border:10px solid #fff;

    border-bottom:45px solid #fff;

    -moz-box-shadow:1px 1px 7px #000;

    -webkit-box-shadow:1px 1px 7px #000;

    box-shadow:1px 1px 7px #000;

}

Описание будет в нижней части предварительного просмотра. В JavaScript мы установим ширину и высоту предварительного просмотра  одного изображения, поэтому описание будет позиционироваться в толще нижней границы изображения.

.pp_descr{

    height:45px;

    line-height:45px;

    font-size:20px;

    width:100%;

    bottom:0px;

    left:0px;

    position:absolute;

    text-align:center;

    color:#00021c;

}

А теперь, давайте добавим немного эффекта!

JAVASCRIPT

У нас будет много анимации по всему JavaScript. Альбомы будут скользить снизу при загрузке страницы. Когда мы выбираем миниатюру, мы должны создать предварительный просмотр DIV и сдвинуть ее. Изображение будет изменять размер, так чтобы оно вписалось в окно.

 

var ie          = false;

if ($.browser.msie) {

    ie = true;

}

Мы будем использовать некоторые индексные переменные для навигации и сохранения некоторых элементов:

//current album/image displayed

var current     = -1;

var album       = -1;

//windows width

var w_width     = $(window).width();

//caching

var $albums     = $('#pp_thumbContainer div.album');

var $loader     = $('#pp_loading');

var $next       = $('#pp_next');

var $prev       = $('#pp_prev');

var $images     = $('#pp_thumbContainer div.content img');

var $back       = $('#pp_back');

Мы хотим распространить альбомы равномерно по всей странице, поэтому мы рассчитаем  левое значение:

 

var nmb_albums  = $albums.length;

var spaces      = w_width/(nmb_albums+1);

var cnt         = 0;

//preload all the images (thumbs)

var nmb_images  = $images.length;

var loaded      = 0;

$images.each(function(i){

    var $image = $(this);

    $('<img />').load(function(){

        ++loaded;

        if(loaded == nmb_images){

            //let's spread the albums evenly at the bottom of the page

            $albums.each(function(){

                var $this   = $(this);

                ++cnt;

                var left    = spaces*cnt - $this.width()/2;

                $this.css('left',left+'px');

                $this.stop().animate({'bottom':'0px'},500);

            }).unbind('click').bind('click',spreadPictures);

            //also rotate each picture of an album with a random number of degrees

            $images.each(function(){

                var $this = $(this);

                var r = Math.floor(Math.random()*41)-20;

                $this.transform({'rotate'   : r + 'deg'});

            });

        }

    }).attr('src', $image.attr('src'));

});

SpreadPictures функция сделает подобную вещь: он будет двигаться по выбранному альбому влево и распространять все эскизы:

 

function spreadPictures(){

    var $album = $(this);

    //track which album is opened

    album = $album.index();

    //hide all the other albums

    $albums.not($album).stop().animate({'bottom':'-90px'},300);

        $album.unbind('click');

        //now move the current album to the left

        //and at the same time spread its images throughout

        //the window, rotating them randomly, hide the description of the album

 

    //store the current left for the reverse operation

    $album.data('left',$album.css('left'))

          .stop()

          .animate({'left':'0px'},500)

          .find('.descr')

          .stop()

          .animate({'bottom':'-30px'},200);

        var total_pic   = $album.find('.content').length;

        var cnt         = 0;

        //each picture

        $album.find('.content')

              .each(function(){

            var $content = $(this);

            ++cnt;

            //window width

            var w_width     = $(window).width();

            var spaces      = w_width/(total_pic+1);

            var left        = (spaces*cnt) - (140/2);

            var r           = Math.floor(Math.random()*41)-20;

            //var r = Math.floor(Math.random()*81)-40;

        $content.stop().animate({'left':left+'px'},500,function(){

            $(this).unbind('click')

                       .bind('click',showImage)

                       .unbind('mouseenter')

                       .bind('mouseenter',upImage)

                       .unbind('mouseleave')

                       .bind('mouseleave',downImage);

        }).find('img')

          .stop()

          .animate({'rotate': r+'deg'},300);

        $back.stop().animate({'left':'0px'},300);

            });

}

Теперь мы определим, что происходит, когда пользователь нажмет на пункт, чтобы вернуться к просмотру  альбомов. Мы будем анимировать альбом в исходное левое положение и сдвинем другие альбомы снова:

 

$back.bind('click',function(){

    $back.stop().animate({'left':'-100px'},300);

    hideNavigation();

    //there's a picture being displayed

    //lets slide the current one up

    if(current != -1){

        hideCurrentPicture();

    }

 

    var $current_album = $('#pp_thumbContainer div.album:nth-child('+parseInt(album+1)+')');

    $current_album.stop()

                  .animate({'left':$current_album.data('left')},500)

                  .find('.descr')

                  .stop()

                  .animate({'bottom':'0px'},500);

 

    $current_album.unbind('click')

                  .bind('click',spreadPictures);

 

    $current_album.find('.content')

              .each(function(){

                var $content = $(this);

                $content.unbind('mouseenter mouseleave click');

                $content.stop().animate({'left':'0px'},500);

        });

 

    $albums.not($current_album).stop().animate({'bottom':'0px'},500);

    });

Следующая функция, называется ShowImage , для отображения полного  образа, сдвинув его снизу. Для центрирования предварительного просмотра, нам нужно установить свои отрицательные поля в зависимости от ширины и высоты изображения. Мы также будем вращать превью в случайном порядке:

 

function showImage(nav){

    if(nav == 1){

        //reached the first one

        if(current==0){

            return;

        }

        var $content = $('#pp_thumbContainer div.album:nth-child('+parseInt(album+1)+')')

                       .find('.content:nth-child('+parseInt(current)+')');

        //reached the last one

        if($content.length==0){

            current-=2;

            return;

        }

    }

    else

    var $content    = $(this);

 

    //show ajax loading image

    $loader.show();

 

    //there's a picture being displayed

    //lets slide the current one up

    if(current != -1){

        hideCurrentPicture();

    }

 

    current                 = $content.index();

    var $thumb              = $content.find('img');

    var imgL_source         = $thumb.attr('alt');

    var imgL_description    = $thumb.next().html();

    //preload the large image to show

    $('<img style=""/>').load(function(){

        var $imgL   = $(this);

        //resize the image based on the windows size

        resize($imgL);

        //create an element to include the large image

        //and its description

        var $preview = $('<div />',{

            'id'        : 'pp_preview',

            'className' : 'pp_preview',

            'html'      : '<div class="pp_descr"><span>'+imgL_description+'</span></div>',

            'style'     : 'visibility:hidden;'

    });

        $preview.prepend($imgL);

        $('#pp_gallery').prepend($preview);

        var largeW  = $imgL.width()+20;

        var largeH  = $imgL.height()+10+45;

        //change the properties of the wrapping div

        //to fit the large image sizes

        $preview.css({

            'width'         :largeW+'px',

            'height'        :largeH+'px',

            'marginTop'     :-largeH/2-20+'px',

            'marginLeft'    :-largeW/2+'px',

            'visibility'    :'visible'

        });

        Cufon.replace('.pp_descr');

        //show navigation

        showNavigation();

 

        //hide the ajax image loading

        $loader.hide();

 

        //slide up (also rotating) the large image

        var r           = Math.floor(Math.random()*41)-20;

        if(ie)

            var param = {

                'top':'50%'

            };

        else

            var param = {

                'top':'50%',

                'rotate': r+'deg'

            };

        $preview.stop().animate(param,500);

    }).error(function(){

        //error loading image.

        //Maybe show a message : 'no preview available'

    }).attr('src',imgL_source);

}

Следующие две функции для обработки навигации по изображениям:

 

//click next image

$next.bind('click',function(){

    current+=2;

    showImage(1);

});

 

//click previous image

$prev.bind('click',function(){

    showImage(1);

});

Функция hideCurrentPicture переведет  превью в режим слайд вверх. Мы не будем использовать анимацию вращения при использовании браузера IE:

 

//slides up the current picture

function hideCurrentPicture(){

    current = -1;

    var r   = Math.floor(Math.random()*41)-20;

    if(ie)

        var param = {

            'top':'-100%'

        };

    else

        var param = {

            'top':'-100%',

            'rotate': r+'deg'

        };

    $('#pp_preview').stop()

                    .animate(param,500,function(){

                        $(this).remove();

                    });

}

 ShowNavigation и HideNavigation функция будет отвечать за отображения и скрытия элементов навигации:

 

//shows the navigation buttons

function showNavigation(){

    $next.stop().animate({'right':'0px'},100);

    $prev.stop().animate({'left':'0px'},100);

}

 

//hides the navigation buttons

function hideNavigation(){

    $next.stop().animate({'right':'-40px'},300);

    $prev.stop().animate({'left':'-40px'},300);

}

При наведении указателя мыши на эскиз, мы хотим, чтобы он немного сдвигался вверх  и немного поворачивался:

 

function upImage(){

    var $content    = $(this);

    $content.stop().animate({

        'marginTop'     : '-70px'

    },400).find('img')

          .stop()

          .animate({'rotate': '0deg'},400);

}

Когда мышь покидает текущий эскиз  миниатюры, она должна вернуться в исходное положение:

 

function downImage(){

    var $content    = $(this);

    var r           = Math.floor(Math.random()*41)-20;

    $content.stop().animate({

        'marginTop'     : '0px'

    },400).find('img').stop().animate({'rotate': r + 'deg'},400);

}

И, наконец, мы будем использовать функцию изменения размера, чтобы изображение соответствовало окну просмотра:

 

function resize($image){

    var widthMargin     = 50

    var heightMargin    = 200;

 

    var windowH      = $(window).height()-heightMargin;

    var windowW      = $(window).width()-widthMargin;

    var theImage     = new Image();

    theImage.src     = $image.attr("src");

    var imgwidth     = theImage.width;

    var imgheight    = theImage.height;

 

    if((imgwidth > windowW)||(imgheight > windowH)){

        if(imgwidth > imgheight){

            var newwidth = windowW;

            var ratio = imgwidth / windowW;

            var newheight = imgheight / ratio;

            theImage.height = newheight;

            theImage.width= newwidth;

            if(newheight>windowH){

                var newnewheight = windowH;

                var newratio = newheight/windowH;

                var newnewwidth =newwidth/newratio;

                theImage.width = newnewwidth;

                theImage.height= newnewheight;

            }

        }

        else{

            var newheight = windowH;

            var ratio = imgheight / windowH;

            var newwidth = imgwidth / ratio;

            theImage.height = newheight;

            theImage.width= newwidth;

            if(newwidth>windowW){

                var newnewwidth = windowW;

                var newratio = newwidth/windowW;

                var newnewheight =newheight/newratio;

                theImage.height = newnewheight;

                theImage.width= newnewwidth;

            }

        }

    }

    $image.css({'width':theImage.width+'px','height':theImage.height+'px'});

}

Нам нужно добавить следующие строки в главе HTML:

<script src="js/cufon-yui.js" type="text/javascript"></script>

<script src="js/Note_this_400.font.js" type="text/javascript"></script>

Мы надеемся, вам понравился этот урок и он будет Вам полезным!

 

ПОСМОТРЕТЬ ДЕМО                            СКАЧАТЬ ИСХОДНИКИ

 

Источник

Категория: jQuery/JS | Просмотров: 1682 | Добавил: Iron | Теги: Фотогалерея с альбомами на JQUERY | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск

Статьи
[Прогараммирование]
Как работает CSS?
[Прогараммирование]
ЛЕКЦИЯ. Язык Pascal
[Прогараммирование]
Статический анализ: ошибки в медиаплеере и безглючная аська
[Операционные системы]
Особенности применения технологий Lotus Domino и Notes в современных информационных системах
[Устронение ошибок систем]
Устранение неполадок при возникновении (синего экрана) Blue Screen Of Death (BSOD) (2)
[Прогараммирование]
Разработка ПО с открытыми исходными текстами как особый вид прикладной науки
[Операционные системы]
MAC OS
[Устронение ошибок систем]
Возможные нежелательные последствия разгона
[Прогараммирование]
Строковый тип данных
[Прогараммирование]
Прячем целые программы Delphi

Категории
HTML/CSS [21]
jQuery/JS [36]
PHP [4]
Для Ucoz [38]

Популярный софт
Iron Kaspersky Internet Security 2015
Kaspersky Internet Security 2015
Iron Virtual DJ
Virtual DJ
Iron SoundForge 11
SoundForge 11
Iron Alcohol 120
Alcohol 120
Iron Norton Internet Security 2014
Norton Internet Security 2014
Iron Loaris Trojan Remover
Loaris Trojan Remover

Жми

Copyright MyCorp © 2024Конструктор сайтов - uCoz