2009-11-27 4 views
0

그래서이 jQuery CSS dock menu을 설정 하려는데 설정에서 근접성을 입력 할 수 있습니다. 근접 거리는 줌이 트리거되는 시점을 결정하지만 높이와 너비와 동일하게 한 거리 만 넣습니다. 이 코드를 변경하여 하나의 높이에 하나의 코드를 입력하고 하나의 코드에는 너비를 입력 할 수있게하려면 어떻게해야합니까? - 또는 - 하나의 값을 입력 할 수 있지만 세로의 코드를 절반으로 줄이는 방법은 무엇입니까? 둘 중 하나는 여기에 변경이되는 내가 필요를 생각하는 코드의 비트가이 모든 일을해야하는 경우 알려 주시면이너비가 mousemove에서 너비보다 적게 읽도록이 자바 스크립트를 변경할 수 없습니다.

jQuery(document).bind('mousemove', function(e) { 
    var pointer = jQuery.iUtil.getPointer(e); 
    var toAdd = 0; 

    if (el.fisheyeCfg.halign && el.fisheyeCfg.halign == 'center') 
    var posx = pointer.x - el.fisheyeCfg.pos.x 
       - (el.offsetWidth - el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.size()) 
      /2 - el.fisheyeCfg.itemWidth/2; 
    else if (el.fisheyeCfg.halign && el.fisheyeCfg.halign == 'right') 
    var posx = pointer.x - el.fisheyeCfg.pos.x - el.offsetWidth 
       + el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.size(); 
    else 
    var posx = pointer.x - el.fisheyeCfg.pos.x; 

    var posy = Math.pow(pointer.y - el.fisheyeCfg.pos.y - el.offsetHeight/2, 2); 

    el.fisheyeCfg.items.each(function(nr) { 
    distance = Math.sqrt(Math.pow(posx - nr * el.fisheyeCfg.itemWidth, 2) + posy); 
    distance -= el.fisheyeCfg.itemWidth/2; 
    distance = distance < 0 ? 0 : distance; 
    distance = distance > el.fisheyeCfg.proximity ? el.fisheyeCfg.proximity : distance; 
    distance = el.fisheyeCfg.proximity - distance; 
    extraWidth = el.fisheyeCfg.maxWidth * distance/el.fisheyeCfg.proximity; 
    this.style.width = el.fisheyeCfg.itemWidth + extraWidth + 'px'; 
    this.style.left = el.fisheyeCfg.itemWidth * nr + toAdd + 'px'; 
    toAdd += extraWidth; 
    }); 
    jQuery.iFisheye.positionContainer(el, toAdd); 
}); 

어떤 아이디어가의 나머지 부분을 게시합니다 ...의 ... 작동?

감사합니다,
매트

답변

1

본인은 스크립트로 주위를 엉망 내가 계획 한 것보다 좀 더 변화 끝났다.

이제 몇 가지 새로운 매개 변수를 사용하여 스크립트를 호출해야합니다 itemHeight, proximityXproximityY

$(document).ready(function() { 
$('#fisheye').Fisheye({ 
    maxWidth: 90, 
    items: 'a', 
    itemsText: 'span', 
    container: '.fisheyeContainter', 
    itemWidth: 40, 
    itemHeight: 40, 
    proximityX: 90, 
    proximityY: 10, 
    halign : 'center' 
}) 
}); 

나는 그것을 작게를하지 않았다, 그러나 여기에 전체에 수정 된 플러그인 :

/** 
* Interface Elements for jQuery 
* Fisheye menu 
* 
* http://interface.eyecon.ro 
* 
* Copyright (c) 2006 Stefan Petre 
* Dual licensed under the MIT (MIT-LICENSE.txt) 
* and GPL (GPL-LICENSE.txt) licenses. 
* 
*/ 

/** 
* Build a Fisheye menu from a list of links 
* 
* @name Fisheye 
* @description Build a Fisheye menu from a list of links 
* @param Hash hash A hash of parameters 
* @option String items items selection 
* @option String container container element 
* @option Integer itemWidth the minimum width for each item 
* @option Integer maxWidth the maximum width for each item 
* @option String itemsText selection of element that contains the text for each item 
* @option Integer proximity the distance from element that make item to interact 
* @option String valign vertical alignment 
* @option String halign horizontal alignment 
* 
* @type jQuery 
* @cat Plugins/Interface 
* @author Stefan Petre 
*/ 
jQuery.iFisheye = { 

build : function(options) 
{ 

    return this.each(
    function() 
    { 
    var el = this; 
    el.fisheyeCfg = { 
    items : jQuery(options.items, this), 
    container: jQuery(options.container, this), 
    pos : jQuery.iUtil.getPosition(this), 
    itemWidth: options.itemWidth, 
    itemHeight: options.itemHeight, 
    itemsText: options.itemsText, 
    proximityX: options.proximityX, 
    proximityY: options.proximityY, 
    valign: options.valign, 
    halign: options.halign, 
    maxWidth : options.maxWidth 
    }; 
    jQuery.iFisheye.positionContainer(el, 0); 
    jQuery(window).bind(
    'resize', 
    function() 
    { 
     el.fisheyeCfg.pos = jQuery.iUtil.getPosition(el); 
     jQuery.iFisheye.positionContainer(el, 0); 
     jQuery.iFisheye.positionItems(el); 
    } 
    ); 
    jQuery.iFisheye.positionItems(el); 
    el.fisheyeCfg.items 
    .bind(
     'mouseover', 
     function() 
     { 
     jQuery(el.fisheyeCfg.itemsText, this).get(0).style.display = 'block'; 
     } 
    ) 
    .bind(
     'mouseout', 
     function() 
     { 
     jQuery(el.fisheyeCfg.itemsText, this).get(0).style.display = 'none'; 
     } 
    ); 
    jQuery(document).bind(
    'mousemove', 
    function(e) 
    { 
     var pointer = jQuery.iUtil.getPointer(e); 
     var toAdd = 0; 
     if (el.fisheyeCfg.halign && el.fisheyeCfg.halign == 'center') 
     var posx = pointer.x - el.fisheyeCfg.pos.x - (el.offsetWidth - el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.size())/2 - el.fisheyeCfg.itemWidth/2; 
     else if (el.fisheyeCfg.halign && el.fisheyeCfg.halign == 'right') 
     var posx = pointer.x - el.fisheyeCfg.pos.x - el.offsetWidth + el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.size(); 
     else 
     var posx = pointer.x - el.fisheyeCfg.pos.x; 
     var posy = Math.pow(pointer.y - el.fisheyeCfg.pos.y - el.offsetHeight + el.fisheyeCfg.itemHeight,2); 
     el.fisheyeCfg.items.each(
     function(nr) 
     { 
     distanceX = Math.sqrt(
     Math.pow(posx - nr*el.fisheyeCfg.itemWidth, 2) 
     ); 
     distanceY = Math.sqrt(posy) - el.fisheyeCfg.itemHeight; 
     distanceX -= el.fisheyeCfg.itemWidth/2; 
     distanceX = distanceX < 0 ? 0 : distanceX; 
     distanceX = distanceX > el.fisheyeCfg.proximityX ? el.fisheyeCfg.proximityX : distanceX; 
     distanceX = el.fisheyeCfg.proximityX - distanceX; 
     distanceY = distanceY > el.fisheyeCfg.proximityY ? el.fisheyeCfg.proximityY : distanceY; 
     distanceY = el.fisheyeCfg.proximityY - distanceY; 
     extraWidth = el.fisheyeCfg.maxWidth/4 * (distanceX*distanceY)/(el.fisheyeCfg.proximityX*el.fisheyeCfg.proximityY); // divided by 4 to smooth the sizing transition 
     extraWidth = (extraWidth > el.fisheyeCfg.maxWidth) ? el.fisheyeCfg.maxWidth : extraWidth; 
     this.style.width = el.fisheyeCfg.itemWidth + extraWidth + 'px'; 
     this.style.left = el.fisheyeCfg.itemWidth * nr + toAdd + 'px'; 
     toAdd += extraWidth; 
     } 
    ); 
     jQuery.iFisheye.positionContainer(el, toAdd); 
    } 
    ); 
    } 
) 
}, 

positionContainer : function(el, toAdd) 
{ 
    if (el.fisheyeCfg.halign) 
    if (el.fisheyeCfg.halign == 'center') 
    el.fisheyeCfg.container.get(0).style.left = (el.offsetWidth - el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.size())/2 - toAdd/2 + 'px'; 
    else if (el.fisheyeCfg.halign == 'left') 
    el.fisheyeCfg.container.get(0).style.left = - toAdd/el.fisheyeCfg.items.size() + 'px'; 
    else if (el.fisheyeCfg.halign == 'right') 
    el.fisheyeCfg.container.get(0).style.left = (el.offsetWidth - el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.size()) - toAdd/2 + 'px'; 
    el.fisheyeCfg.container.get(0).style.width = el.fisheyeCfg.itemWidth * el.fisheyeCfg.items.size() + toAdd + 'px'; 
}, 

positionItems : function(el) 
{ 
    el.fisheyeCfg.items.each(
    function(nr) 
    { 
    this.style.width = el.fisheyeCfg.itemWidth + 'px'; 
    this.style.left = el.fisheyeCfg.itemWidth * nr + 'px'; 
    } 
); 
} 
}; 

jQuery.fn.Fisheye = jQuery.iFisheye.build; 
관련 문제