0

This is my first time using JQuery in any of my projects.

I have implemented the superfish menu.

On some of my pages I have a horizontal scroll. I would like to make the menu float on the center of the page as the page is scrolled.

Also I need to make sure that the submenu on the far right hand side of the menu does not open up off the page. When I hover on the right most element it opens up half off the page.

Any ideas on how to fix these two things?

I'm perfectly willing to use a different Jquery menu if there is a better one that has these features built in...

Thanks!

javascrupt call in my page:

$(document).ready(function () {
        $("ul.sf-menu").supersubs({
            minWidth: 12,   // minimum width of sub-menus in em units 
            maxWidth: 27,   // maximum width of sub-menus in em units 
            extraWidth: 1     // extra width can ensure lines don't sometimes turn over 
            // due to slight rounding differences and font-family 
        }).superfish({ animation: { opacity: 'show', height: 'show' }, autoArrows: false });  // call supersubs first, then superfish, so that subs are 
        // not display:none when measuring. Call before initialising 
        // containing tabs for same reason. 

I can post any more code that is needed, but there is quite a lot of code in the superfish files so i'm not sure what I should post.

I found this script and it works well, however when I scroll right the horizonal menu starts to stack so the menu items are side by side rather then vertical. I want to modify this to keep the menu horizonal...

<script type="text/javascript"><!--
            var floatingMenuId = 'floatdiv';
            var floatingMenu =

{ targetX: -1000, targetY: 10,

hasInner: typeof (window.innerWidth) == 'number',
hasElement: document.documentElement
    && document.documentElement.clientWidth,

menu:
    document.getElementById
    ? document.getElementById(floatingMenuId)
    : document.all
      ? document.all[floatingMenuId]
      : document.layers[floatingMenuId]

};

            floatingMenu.move = function () {
                if (document.layers) {
                    floatingMenu.menu.left = floatingMenu.nextX;
                    floatingMenu.menu.top = floatingMenu.nextY;
                }
                else {
                    floatingMenu.menu.style.left = floatingMenu.nextX + 'px';
                    floatingMenu.menu.style.top = floatingMenu.nextY + 'px';
                }
            }

            floatingMenu.computeShifts = function () {
                var de = document.documentElement;

                floatingMenu.shiftX =
    floatingMenu.hasInner
    ? pageXOffset
    : floatingMenu.hasElement
      ? de.scrollLeft
      : document.body.scrollLeft;
                if (floatingMenu.targetX < 0) {
                    if (floatingMenu.hasElement && floatingMenu.hasInner) {
                        // Handle Opera 8 problems    
                        floatingMenu.shiftX +=
            de.clientWidth > window.innerWidth
            ? window.innerWidth
            : de.clientWidth
                    }
                    else {
                        floatingMenu.shiftX +=
            floatingMenu.hasElement
            ? de.clientWidth
            : floatingMenu.hasInner
              ? window.innerWidth
              : document.body.clientWidth;
                    }
                }

                floatingMenu.shiftY =
    floatingMenu.hasInner
    ? pageYOffset
    : floatingMenu.hasElement
      ? de.scrollTop
      : document.body.scrollTop;
                if (floatingMenu.targetY < 0) {
                    if (floatingMenu.hasElement && floatingMenu.hasInner) {
                        // Handle Opera 8 problems    
                        floatingMenu.shiftY +=
            de.clientHeight > window.innerHeight
            ? window.innerHeight
            : de.clientHeight
                    }
                    else {
                        floatingMenu.shiftY +=
            floatingMenu.hasElement
            ? document.documentElement.clientHeight
            : floatingMenu.hasInner
              ? window.innerHeight
              : document.body.clientHeight;
                    }
                }
            }

            floatingMenu.doFloat = function () {
                var stepX, stepY;

                floatingMenu.computeShifts();

                stepX = (floatingMenu.shiftX +
    floatingMenu.targetX - floatingMenu.nextX) * .07;
                if (Math.abs(stepX) < .5) {
                    stepX = floatingMenu.shiftX +
        floatingMenu.targetX - floatingMenu.nextX;
                }

                stepY = (floatingMenu.shiftY +
    floatingMenu.targetY - floatingMenu.nextY) * .07;
                if (Math.abs(stepY) < .5) {
                    stepY = floatingMenu.shiftY +
        floatingMenu.targetY - floatingMenu.nextY;
                }

                if (Math.abs(stepX) > 0 ||
    Math.abs(stepY) > 0) {
                    floatingMenu.nextX += stepX;
                    floatingMenu.nextY += stepY;
                    floatingMenu.move();
                }

                setTimeout('floatingMenu.doFloat()', 20);
            };

            // addEvent designed by Aaron Moore    
            floatingMenu.addEvent = function (element, listener, handler) {
                if (typeof element[listener] != 'function' ||
   typeof element[listener + '_num'] == 'undefined') {
                    element[listener + '_num'] = 0;
                    if (typeof element[listener] == 'function') {
                        element[listener + 0] = element[listener];
                        element[listener + '_num']++;
                    }
                    element[listener] = function (e) {
                        var r = true;
                        e = (e) ? e : window.event;
                        for (var i = element[listener + '_num'] - 1; i >= 0; i--) {
                            if (element[listener + i](e) == false)
                                r = false;
                        }
                        return r;
                    }
                }

                //if handler is not already stored, assign it    
                for (var i = 0; i < element[listener + '_num']; i++)
                    if (element[listener + i] == handler)
                        return;
                element[listener + element[listener + '_num']] = handler;
                element[listener + '_num']++;
            };

            floatingMenu.init = function () {
                floatingMenu.initSecondary();
                floatingMenu.doFloat();
            };

            // Some browsers init scrollbars only after    
            // full document load.    
            floatingMenu.initSecondary = function () {
                floatingMenu.computeShifts();
                floatingMenu.nextX = floatingMenu.shiftX +
    floatingMenu.targetX;
                floatingMenu.nextY = floatingMenu.shiftY +
    floatingMenu.targetY;
                floatingMenu.move();
            }

            if (document.layers)
                floatingMenu.addEvent(window, 'onload', floatingMenu.init);
            else {
                floatingMenu.init();
                floatingMenu.addEvent(window, 'onload',
    floatingMenu.initSecondary);
            }    

    </script> 
kralco626
  • 7,896
  • 36
  • 104
  • 165

1 Answers1

0

I'm not sure on how you mean centering, but if you mean horizontally centered:

Could you separate the main page (that horizontally overflows) and the menu into separate div's? e.g.

<div id="menu"><center><ul class="sf-menu">...</ul></center></div>
<div id="mainpage" style="overflow:auto;">Contents goes here</div>

(the <center> tag might have to be <div style="width:X;margin:0 auto;"> depending on how superfish works)

On the menu going over the page, sorry I'll have to defer to someone more knowable to answer that.

Phil
  • 1,091
  • 1
  • 9
  • 25
  • but this wont keep the menu centered on the screen as I scroll... maybe i'm being unclear... – kralco626 Sep 29 '10 at 12:40
  • Could you explain a bit more fully, or give a link to a site which does what your trying to achieve? – Phil Sep 30 '10 at 21:30
  • if you go to this site there is a little floating menu on the side: http://www.dynamicdrive.com/dynamicindex1/staticmenu.htm I want to do that, except I have a horizonal menu and I want to keep it centered – kralco626 Oct 01 '10 at 11:58
  • oh and for the menu going off the right hand side of the page check out: http://www.whitehouse.gov/ notice how the submenu on the right most menu item goes left, rather then right and off the page... – kralco626 Oct 01 '10 at 12:42
  • For the menu placement it sounds like you need fixed positioning something like `
    `.
    – Phil Oct 03 '10 at 20:32
  • Please son't use the `center` tag it has been depreicated and has no semantic value: http://stackoverflow.com/questions/1798817/why-is-the-center-tag-deprecated-in-html – Jon P Jul 01 '14 at 01:46