中关村村草 发表于 2012-01-10 11:54

jquery实现图片悬浮效果

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('(').split(')').split(','),
                a = values,
                b = values,
                c = values,
                d = values;

            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
};

冰释一片天 发表于 2012-01-10 11:54

谢谢分享
页: [1]
查看完整版本: jquery实现图片悬浮效果