So this could be filed under “I did it because I can” (which is a really good mantra in science…) and am not sure I’ll use it but it is useful in the concept.
The idea is to set the hover on one div to show/hide another div WITHOUT having to use some kind of id/name trick (as in setting the id to “divHide1”) and to have it be completely self setting in the .ready method. Why would this be at all useful? Say you want to roll through a list of things and generate the divs, but want to defer the jQuery until the page has loaded. And you don’t want to have to resort to:
<div id="someDiv<%= someId %>"></div>
like structure where you parse some identifier from the id property. Mostly because you have no idea how many someDiv1s there could be on the page. It could be a highly reused name (someDiv) and that could lead to a mess.
Also the reason ‘cuz. If you have any more questions of why after that answer, well you’re just being annoying.
Anywho, here’s the actual html for structure.
<div class="mainDiv"> <div class="showDiv" id="oneTop"> Kaneda? </div> <div class="slideDiv" id="one"> What do you see?! </div> </div> <div class="clear"></div>
Now I get that this isn’t off a foreach, but it doesn’t take much to figure out that it’s easily made into a loop if you just loop it over and over. Why? Because first there are no ids or names so that you can’t have two of the same name and also because that chunk is self contained.
So what is going on there? Simple, you have a parent container that holds a div to hold and a div to hover over and the other that will be shown/hidden.
Here’s the styles involved just incase you care:
<style type="text/css"> .clear { clear:both; } .leftDiv { float:left; } .mainDiv { margin:5px; height:200px; } .rightDiv { float:left; } .showDiv { float:left; margin-right:5px; height:200px; background-color:Silver; } .slideDiv { background-color:Teal; height:200px; position:absolute; float:left; z-index:100; } </style>
That doesn’t entirely matter, but it does to show the div “sliding” over another div. Kind of a little somethin’ somethin’ I threw in at no extra cost. Now for the jQuery:
First the method for setting the mouse over and out events for the show div, we turn to .hover:
function setHover(currentSlideDiv, currentStableDiv) { currentStableDiv.hover ( //first parameter is the method for showing the div on mouse over function() { if (currentSlideDiv.is(":hidden")) { currentSlideDiv.show("slide", { direction: "left" }, 100); } }, //second parameter is the method for hiding the div on mouse out function() { if (currentSlideDiv.is(":visible")) { currentSlideDiv.hide("slide", { direction: "left" }, 100); } } ); };
Now for the method that actually uses these:
//This is used to take in one of the main divs and set all the //show and slide divs within. function setChildrenDivs(mainDiv) { //get all the show and slide dvis within the main div var mainChildrenStableDiv = jQuery(mainDiv).children(".showDiv"); var mainChildrenSlide = jQuery(mainDiv).children(".slideDiv"); //loop through the list of show divs for (var loopCounter = 0; loopCounter < mainChildrenStableDiv.length; loopCounter++) { //Get the show div and it's corresponding slide div using the //two lists and the current counter. var currentStableDiv = jQuery(mainChildrenStableDiv[loopCounter]); var currentSlideDiv = jQuery(mainChildrenSlide[loopCounter]); //This is to make sure the slide is where it should be. //to the right of the show div. var containerPosition = jQuery(currentStableDiv).position(); jQuery(currentSlideDiv).css({ left: containerPosition.left + currentStableDiv.width() }); //Set the mouse over and the mouse out on the show div setHover(currentSlideDiv, currentStableDiv); } }
Now the final touch, the .ready method:
jQuery(document).ready ( function() { //hide all the slide divs jQuery(".slideDiv").hide(); //find all the parent divs var mainDivs = jQuery(".mainDiv"); //set the children for (var loopCounter = 0; loopCounter < mainDivs.length; loopCounter++) { setChildrenDivs(mainDivs[loopCounter]); } } );
And boom, now you have multiple show/hide (Slide in this instance). Now if I could just find a use for it…
Oh yeah and you’ll need jQuery 1.3.2 and jQuery ui 1.7.2 to use this. At least those are the versions I know this works with.
Update: Due to popular demand… one person… Source can be found here.
Very nice. Cant wait sit down and really put this to use.
Can’t wait to sit down and find a use for it 🙁
A link to an example would be helpful
I suppoooooose I could just host the full source… Why are you making me put effort in?
OK so hosting this now.
Here it is… I updated the link.
Good work looks good, I’m having trouble with the zip, I’d like to have a look and see if I can use ithorizontally rather than verticle… might just copy the code…
Hrm I think I moved it. I’ll get the real link.
Here
Sorry I forgot I switched places where I was hosting the zip files.
And just cause I’m a nice guy, here’s a vertical version.
very nice work. Can soemone please send me the vertical version of this?
Hey Sean,
how do you set it so it reacts on the onclick event?
I’ll make a new example of that. It’s a little more complicated and I’m not sure it would work with this situation. Because the two divs are paired and not in a child/parent relationship the left div’s MouseOver is not paired with the pop up div’s MouseOver like it would be if the pop up was a child of the left div.
Actually you might want to just look at this one:
Slide Hover With Section with the source being here.
This one involves a child/parent relationship instead of a pairing, however it is a much easier way to get what I think you want.
I can put something up tomorrow but in reality I’m pretty sure just using “view source” and copy/paste will give you what you need from the example. (http://byatool.com/Hosted/LiveDemos/SlideOnHover/SlideOnHover.htm) Only things missing would be the two jquery files: the regular one and custom. With that being said, I’ll fix the code source link. Thanks for the heads up.
Ok link should work now for the download.
Good one.. but not working in IE6….:(
That’s odd… I thought I did everything in jQuery and jQuery should be tested in IE 6. I could be wrong though.
Vertical version is as follows:
1. Remove the floats from the slideDiv and showDiv classes.
2. Set position: absolute; on mainDiv class.
2. Add a top: Xpx; style to slideDiv class, x = height of showDiv.
3. In the script, switch the “left” in this line, to “up”, like so:
currentSlideDiv.show(“slide”, { direction: “up” }, 100);
4. In the script, switch the “left” in this line, to “up”, like so:
currentSlideDiv.hide(“slide”, { direction: “up” }, 100);
Should work like a charm…