当前位置: 代码迷 >> Web前端 >> jquery兑现图片悬浮效果
  详细解决方案

jquery兑现图片悬浮效果

热度:142   发布时间:2012-09-05 15:19:34.0
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
};

  相关解决方案