When I recently learned that the submenus in MenuMatic were not being positioned correctly in IE7 (when the zoom level was not 100%) I had to figure out how to detect the current zoom amount. I read a forum post a week or so ago where someone suggested using flash and setting the stage to not scale. I have since looked for that post to give the poster credit but I could not find it. However I used the general idea, and decided to share the flash file in case anybody else needed it (since I mostly found people asking how to detect the zoom level but no working examples).
How It Works:
Basically the movie is 100px wide, the stage's scaleMode is set to not scale, and there is an onenterframe function to detect the stage width and send it to the javascript function. Although when it detects the stage's width it is actually detecting the movie's width while the stage stays at 100px wide. So if the zoom level is 120% it reads the "stage" width as 120.
The javascript function updates a global variable so you can access it easily. I am not normally a fan of global variables in javascript but felt it was an acceptable solution in this case. The flash file only runs at 1 frame per second, and is less than 2kb in size so it should not be too taxing on user resources.
To Use:
- Insert the .swf into the page.
- Hide it with css.
- Add 2 lines to your javascript (the function and the global variable)
Example
DownloadLabels: flash, ie7, MenuMatic, zoom
I just released MenuMatic 0.68 which has a few improvements and should be a little more efficient. Some of the improvements are:
- center option: A method I often use to center elements with css is setting the left to 50% and then the left margin to minus half the width of the element. This works really well when you know the width of the element is not going to change. But when your client has control to add or remove pages via a cms the menu width might change. So I added a center option to keep your menu centered even if the width of the menu changes.
- stretchMainMenu option: I renamed the menuWidth option to stretchMainMenu as that seems like a much more accurate name. Also I made it work much quicker. In case you have not used it, this option will stretch each link in your main menu until they fill the main ul or ol. So set stretchMainMenu to true and set a width on your main ol or ul in the css and you can simulate layouts that you can normally only achieve with tables.
- fixHasLayoutBug option: A few of you have run into Microsoft's hasLayout Bug, so if you find yourself troubleshooting a weird bug like the submenus all show up at the top of the window instead of by the link you are hovering over, then try enabling this option. It will force all the menu elements to have layout in IE, also all the parent elements of the menu since this is also important for getting accurate positioning. * Note I have not yet tested this, so if you end up using it please let me know if it works or not :)
- call-back functions: I added 18 callback functions to make modifying MenuMatic for different unique situations easier and faster. For example, if you need to do something right after a subMenu is positioned but before it is shown, you can use onPositionSubMenu_complete
- Google Code: I am now using Google Code to host MenuMatic so you can use the issue tracker there to report any bugs or submit feature requests. Thanks!
Labels: css, javascript, MenuMatic, mootools
Here is a simple MooTools script that adds a getId method to the Element class. The getId method simply returns the element's id if it already exists, if not it generates a unique id, assigns it to the element and returns that. The generated id does not persist from page to page, however this little script comes in handy sometimes.
Element.implement({
getId: function(){
if(!this.get('id')){
var uniqueId = this.get('tag') + "-" + $time();
while($(uniqueId)){ uniqueId = this.get('tag') + "-" + $time(); }
this.set('id', uniqueId);
}
return this.get('id');
}
});
So usage would look like this:
var theIdofTheFirstLink = $(document.body).getElement('a').getId();
//or something like this would make sure every element on the page has an id
$$('*').getId();
Labels: javascript, mootools
I am pretty sure I am addicted to Google Analytics. Ever since I first installed it on my site over a year ago ( and on every site I've built since ). I'm not sure what it is, since I am not a math geek, there is just something very interesting about trolling through the analytics of several different sites and comparing trends and see who is getting traffic from where and such.
On a completely unrelated note, I updated MooScroll over the weekend. Of the 3 projects I have released for download, MooScroll by far was the most raw. I hammered out several bugs and it should be much more stable than before. I also added an extra demo page with an OSX style layout.
Labels: MooScroll
A couple of years ago when I got into web design I decided to make my own javascript drop-down menu based on the fact that I could not find one out there with all the features I wanted. Several versions later when I found and fell in love with MooTools I immediately rewrote it for mootools. I have been using this for websites for some time now and recently made some more improvements and decided to release it for download. I plan on making several more sweeping improvements in the not-to-distant future (sometime before the holidays hopefully).
I mentioned in a previous post that I would be releasing this script under the name MooMenu but after some googling I found that it seemed that name had been used so I finally settled on the more original name of MenuMatic.

Essentially MenuMatic takes an ordered or unordered list of links and turns it into a dynamic drop down menu system with loads of options. Some advantages of MenuMatic are that it is based on semantic xthml structure, it is completely keyboard accessible, and easier to use than CSS based menus alone since you can adjust the hideDelay option, however it is based on a keyboard accessible version of Suckerfish Dropdowns for users without javascript enabled.
It should be pretty solid but as always email me or post a comment if you find any bugs.
Labels: javascript, MenuMatic, MooMenu, mootools
I just released MooScroll version 0.53 beta which has several enhancements over 0.52.
It should now be much quicker and easier to plug into a design as it now plays nicer when the original element is positioned. Version 0.53 also has the following improvements.
fullWindowMode option
You can use the fullWindowMode option to "replace" the window's scrollbar.
refresh function
The refresh function lets you update the scrollbar (if, for instance, you change the size of the MooScroll object ).
loadContent function
To dynamically update the content of a MooScroll object, just call the loadContent function passing in the new content as as string.
You can check out the updated examples to test it out:
Main MooScroll Example Page (including loadContent function demo)
fullWindowMode Example Page
Thanks to Bob Ralian for his contributions! Still on my To Do List is to add the ability for horizontal and/or vertical scrollbars (instead of just vertical). As always, you can email me or post a comment if you run across any bugs, or have any feature requests!
Labels: javascript, MooScroll, mootools
Response.Right is a useful tool that I have used many times to convert HTML or Javascript to a string in my server-side code (I use ASP.NET 2.0 C# and PHP). Basically if you have ever pasted some HTML into a C# code behind page and had to go through and manually escape all the quotation marks you know how annoying that can be. So I just have this tool bookmarked and use it instead to save some precious time. I especially like the option to include line breaks.
Input:

Result:

Labels: javascript