`
star65225692
  • 浏览: 268251 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类

jquery实现图片悬浮效果

阅读更多

主要的想法是当鼠标悬浮后计算所有的描述容器大小和位置。主要依赖于缩略图的最大尺寸及其居于主要wrapper中的位置。例如,当缩略图接近边缘,我们就使得描述区域显示在缩略图左边

然后我们将帮定逼近事件到图片。主要想法是根据鼠标位置来变化图片大小。一旦图片达到最大尺寸,我们设置z-index最高,因此位于最高层次,并且显示分开的描述。风之境地

// list of thumbs
var $list        = $('#pe-thumbs'),
    // list's width and offset left.
    // this will be used to know the position of the description container
    listW        = $list.width(),
    listL        = $list.offset().left,
    // the images
    $elems        = $list.find('img'),
    // the description containers
    $descrp        = $list.find('div.pe-description'),
    // maxScale : maximum scale value the image will have
    // minOpacity / maxOpacity : minimum (set in the CSS) and maximum values for the image's opacity
    settings    = {
        maxScale    : 1.3,
        maxOpacity    : 0.9,
        minOpacity    : Number( $elems.css('opacity') )
    },
    init        = function() {

        // minScale will be set in the CSS
        settings.minScale = _getScaleVal() || 1;
        // preload the images (thumbs)
        _loadImages( function() {

            _calcDescrp();
            _initEvents();

        });

    },
    // Get Value of CSS Scale through JavaScript:
    // http://css-tricks.com/get-value-of-css-rotation-through-javascript/
    _getScaleVal= function() {

        var st = window.getComputedStyle($elems.get(0), null),
            tr = st.getPropertyValue("-webkit-transform") ||
                 st.getPropertyValue("-moz-transform") ||
                 st.getPropertyValue("-ms-transform") ||
                 st.getPropertyValue("-o-transform") ||
                 st.getPropertyValue("transform") ||
                 "fail...";

        if( tr !== 'none' ) {    

            var values = tr.split('(')[1].split(')')[0].split(','),
                a = values[0],
                b = values[1],
                c = values[2],
                d = values[3];

            return Math.sqrt( a * a + b * b );

        }

    },
    // calculates the style values for the description containers,
    // based on the settings variable
    _calcDescrp    = function() {

        $descrp.each( function(i) {

            var $el        = $(this),
                $img    = $el.prev(),
                img_w    = $img.width(),
                img_h    = $img.height(),
                img_n_w    = settings.maxScale * img_w,
                img_n_h    = settings.maxScale * img_h,
                space_t = ( img_n_h - img_h ) / 2,
                space_l = ( img_n_w - img_w ) / 2;

            $el.data( 'space_l', space_l ).css({
                height    : settings.maxScale * $el.height(),
                top        : -space_t,
                left    : img_n_w - space_l
            });

        });

    },
    _initEvents    = function() {

        $elems.on('proximity.Photo', { max: 80, throttle: 10, fireOutOfBounds : true }, function(event, proximity, distance) {

            var $el            = $(this),
                $li            = $el.closest('li'),
                $desc        = $el.next(),
                scaleVal    = proximity * ( settings.maxScale - settings.minScale ) + settings.minScale,
                scaleExp    = 'scale(' + scaleVal + ')';

            // change the z-index of the element once
            // it reaches the maximum scale value
            // also, show the description container
            if( scaleVal === settings.maxScale ) {

                $li.css( 'z-index', 1000 );

                if( $desc.offset().left + $desc.width() > listL + listW ) {

                    $desc.css( 'left', -$desc.width() - $desc.data( 'space_l' ) );

                }

                $desc.fadeIn( 800 );

            }
            else {

                $li.css( 'z-index', 1 );

                $desc.stop(true,true).hide();

            }   

            $el.css({
                '-webkit-transform'    : scaleExp,
                '-moz-transform'    : scaleExp,
                '-o-transform'        : scaleExp,
                '-ms-transform'        : scaleExp,
                'transform'            : scaleExp,
                'opacity'            : ( proximity * ( settings.maxOpacity - settings.minOpacity ) + settings.minOpacity )
            });

        });

    },
    _loadImages    = function( callback ) {

        var loaded     = 0,
            total    = $elems.length;

        $elems.each( function(i) {

            var $el = $(this);

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

                ++loaded;
                if( loaded === total )
                    callback.call();

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

        });

    };

return {
    init    : init
};

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics