JQuery Zoom
Уроки JQuery Zoom
15 января 2014
1907
zoom, зуммер, jquery

JQuery Zoom

Сложность Рубрика JQuery Браузеры
Демонстрация » Скачать »

Всем привет! Давно не виделись) пора узнать Вам что-то новое. Данный урок приготовлен по просьбе наших читателей и в нем я затрону такую интересную тему как зуммеры, то бишь программные средства увеличения изображений, объектов и т.д. Скрипт JQuery Zoom написан на примере увеличения планет Солнечной системы, но понятное дело, можно его использовать и в других вариациях. Так как в данном примере изображения не большого разрешения, то пришлось использовать дополнительные изображения, которые расположены в папке, но если у вас есть высококачественные фотографии, то нужные участки вы можете увеличить с оригинальной фотографии и использовать их.


И так, начнем. Первое, что мы сделаем это индексный файл index.php. В данном файле нам обязательно надо подключить файлы CSS-стилей и библиотек JQuery, а также настроить размер, положение и анимацию областей увеличения изображения. Его код приведен ниже:

 

<div class='text'>

        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"> </script>
        <script type="text/javascript" src="js/jquery.transform-0.9.3.min_.js"> </script>
        <script type="text/javascript" src="js/jquery.easing.1.3.js"> </script>
        <script type="text/javascript" src="js/jquery.zoomtour.js"> </script>
        <script type="text/javascript">
            $(function() {
                $('#zt-container').zoomtour();	
            });
        </script>

<div class="container">
            
            <div id="zt-container" class="zt-container">
                
                <div class="zt-item" data-id="zt-item-1">
                    <img class="zt-current" src="images/image1.jpg" />
                
                    <div class="zt-tag" data-dir="1" data-link="zt-item-3" data-zoom="6" data-speed="850" data-delay="20" style="width:150px;height:111px;top:186px;left:50px;"></div><!--Первая область снизу-->
                    
                    <div class="zt-tag" data-dir="1" data-link="zt-item-2" data-zoom="14" data-speed="950" data-delay="150" style="width:111px;height:111px;top:69px;left:130px;"></div><!--Вторая область снизу-->
                    
                    <div class="zt-tag" data-dir="1" data-link="zt-item-4" data-zoom="9" data-speed="800" data-delay="70" style="width:25px;height:25px;top:67px;left:261px;"></div><!--Третья нижняя область-->
                    
                    <div class="zt-tag" data-dir="1" data-link="zt-item-5" data-zoom="12" data-speed="800" data-delay="150" style="width:40px;height:40px;top:37px;left:295px;"></div><!--Четвертая верхняя область-->
                    
                    </div><!--Общие настройки анимации, положения и появления областей-->

                <div class="zt-item" data-id="zt-item-3">
                    <a href="saturn.html"> <img src="images/image1_2.jpg"></a>
                    <img class="zt-current" src="images/image1_2.jpg"></a>
                    <div class="zt-tag zt-tag-back" data-dir="-1" data-link="zt-item-1" data-zoom="6" data-speed="550" data-delay="20"></div>
                    </div><!--Первая область снизу-->
                    
                <div class="zt-item" data-id="zt-item-2">
                    <a href="jupiter.html"> <img src="images/image1_1.jpg"></a>
                    <img class="zt-current" src="images/image1_1.jpg" />
                    <div class="zt-tag" data-dir="1" data-link="zt-item-6" data-zoom="6" data-speed="950" data-delay="150" style="width:80px;height:80px;top:320px;left:280px;"></div> <!--Размеры и положение второго увеличения-->
                    <div class="zt-tag zt-tag-back" data-dir="-1" data-link="zt-item-1" data-zoom="14" data-speed="750" data-delay="80"></div>
                    </div><!--Вторая область снизу-->
                    
                <div class="zt-item" data-id="zt-item-6">
                    <a href="pov_jupiter.html"> <img src="images/image1_5.jpg"></a>
                    <img class="zt-current" src="images/image1_5.jpg" />
                    <div class="zt-tag zt-tag-back" data-dir="-1" data-link="zt-item-2" data-zoom="12" data-speed="700" data-delay="20"></div>
                </div><!--Вторая область снизу, второе увеличение-->
                    
                <div class="zt-item" data-id="zt-item-4">
                    <a href="mars.html"> <img src="images/image1_3.jpg"></a>
                    <img class="zt-current" src="images/image1_3.jpg" />
                    <div class="zt-tag zt-tag-back" data-dir="-1" data-link="zt-item-1" data-zoom="9" data-speed="700" data-delay="70"></div>
                    </div><!--Третья область снизу-->
                    
                <div class="zt-item" data-id="zt-item-5">
                    <a href="zeml.html"> <img src="images/image1_4.jpg"></a>
                    <img class="zt-current" src="images/image1_4.jpg" />
                    <div class="zt-tag zt-tag-back" data-dir="-1" data-link="zt-item-1" data-zoom="12" data-speed="700" data-delay="10"></div>
                    </div><!--Четвертая область снизу-->
                    
            </div>
        </div>

</div>

 

 

В подключенных файлах, есть стандартные библиотеки, а также созданная с нуля jquery.zoomtour.js.

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

 

var dist_element;
                switch( quadrant ) {
                    case 1 :
                        dist_element = Math.sqrt( Math.pow( ( center.x - 0 ), 2 ) + Math.pow( ( center.y - 0 ), 2 ) );
                        break;
                    case 2 :
                        dist_element = Math.sqrt( Math.pow( ( center.x - cache.ztdim.x ), 2 ) + Math.pow( ( center.y - 0 ), 2 ) );
                        break;
                    case 3 :
                        dist_element = Math.sqrt( Math.pow( ( center.x - 0 ), 2 ) + Math.pow( ( center.y - cache.ztdim.y ), 2 ) );
                        break;
                    case 4 :
                        dist_element = Math.sqrt( Math.pow( ( center.x - cache.ztdim.x ), 2 ) + Math.pow( ( center.y - cache.ztdim.y ), 2 ) );
                        break;
                }
                var anglefactor = 25;
                var angle	= ( ( cache.dist_center - dist_element ) / cache.dist_center ) * anglefactor;
                
                switch( quadrant ) {
                    case 1 :
                        $tag.data( 'rotate', angle ).transform({'rotate'	: angle + 'deg'});
                        break;
                    case 2 :
                        $tag.data( 'rotate', -angle ).transform({'rotate'	: -angle + 'deg'});
                        break;
                    case 3 :
                        $tag.data( 'rotate', -angle ).transform({'rotate'	: -angle + 'deg'});
                        break;
                    case 4 :
                        $tag.data( 'rotate', angle ).transform({'rotate'	: angle + 'deg'});
                        break;
                }
        
            },
            getElementQuadrant	: function( c, cache ) {
                if( c.x <= cache.ztdim.x / 2 && c.y <= cache.ztdim.y / 2 ) 
                    return 1;
                else if( c.x > cache.ztdim.x / 2 && c.y <= cache.ztdim.y / 2 ) 
                    return 2;	
                else if( c.x <= cache.ztdim.x / 2 && c.y >= cache.ztdim.y / 2 ) 
                    return 3;
                else if( c.x > cache.ztdim.x / 2 && c.y > cache.ztdim.y / 2 ) 
                    return 4;
            }
        },
        viewport	= {
            zoom				: function( $ztcontainer, $tag, cache, settings ) {
                var $ztitem			= $tag.closest('div.zt-item'),
                    ztitemid		= $ztitem.data('id'),
                    $ztimage		= $ztitem.children('img.zt-current'),
                    
                    zoomfactor		= $tag.data('zoom'),
                    speedfactor		= $tag.data('speed'),
                    imgdelayfactor 	= $tag.data('delay'),
                    link			= $tag.data('link'),
                    dir				= $tag.data('dir'),
                    
                    $new_ztitem		= $ztcontainer.find('div.' + link),
                    $new_ztitemimage= $new_ztitem.find('img.zt-current'),
                    
                    zoomAnimation	= true;
                
                if( !link ) return false;
                
                if( zoomfactor === undefined || speedfactor === undefined || imgdelayfactor === undefined || dir === undefined )
                    zoomAnimation = false;
                    
                ( dir === 1 ) ? 
                    viewport.zoomin( $tag, $ztitem, ztitemid, $ztimage, zoomfactor, speedfactor, imgdelayfactor, zoomAnimation, $new_ztitem, $new_ztitemimage, cache, settings ) : 
                    viewport.zoomout( $tag, $ztitem, ztitemid, $ztimage, zoomfactor, speedfactor, imgdelayfactor, zoomAnimation, $new_ztitem, $new_ztitemimage, cache, settings );		
            },
            zoomin				: function( $tag, $ztitem, ztitemid, $ztimage, zoomfactor, speedfactor, imgdelayfactor, zoomAnimation, $new_ztitem, $new_ztitemimage, cache, settings ) {
                
                var el_l 			= $tag.data('left') + $tag.data('width') / 2,
                    el_t 			= $tag.data('top') + $tag.data('height') / 2;
                
                $.fn.applyStyle 	= ( zoomAnimation ) ? $.fn.animate : $.fn.css;
                
                $ztimage.applyStyle( {
                    width	: cache.ztdim.x * zoomfactor + 'px',
                    height	: cache.ztdim.y * zoomfactor + 'px',
                    left	: - ( ( zoomfactor * ( 2 * el_l ) ) - ( 2 * el_l ) ) / 2 + 'px',
                    top		: - ( ( zoomfactor * ( 2 * el_t ) ) - ( 2 * el_t ) ) / 2 + 'px'
                }, $.extend( true, [], { duration : speedfactor } ) );

 



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

 

.zt-container{
    width:500px;
    height:500px;
    position:relative;
    overflow:hidden;
    margin:20px auto;
    background:#fff;
    border:7px solid #fff;
    -moz-box-shadow:1px 1px 3px #ddd;
    -webkit-box-shadow:1px 1px 3px #ddd;
    box-shadow:1px 1px 3px #ddd;
}
img.zt-current{
    position:absolute;
    display:none;
}
img.zt-temp{
    position:absolute;
    opacity:0;
    filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);
}
.zt-tag{
    position:absolute;
    z-index:10;
    border:2px solid #fff;
    background:transparent url(../images/tag.png) repeat top left;
    width:50px;
    height:37px;
    cursor:pointer;
    -moz-box-shadow:1px 1px 2px rgba(0,0,0,0.7);
    -webkit-box-shadow:1px 1px 2px rgba(0,0,0,0.7);
    box-shadow:1px 1px 2px rgba(0,0,0,0.7);
}
.zt-tag-back{
    width:30px;
    height:20px;
    left:50%;
    bottom:0px;
    margin-left:-16px;
    background:#fff url(../images/back.png) no-repeat center center;
    -moz-border-radius:5px 5px 0px 0px;
    -webkit-border-radius:5px 5px 0px 0px;
    border-radius:5px 5px 0px 0px;
    border:1px solid #fff;
    border-bottom:none;
}

 


Вот и все. На самом деле достаточно сложный скрипт JQuery Zoom, который украсит Ваш сайт и придаст эстетичности Вашим сайтам. Кстати, посмотрите еще урок на тему эффект zoom, может тоже пригодиться. Благодарю за внимание. Скоро увидимся, всем удачи! 





Алексей Копча