I have two divs that have 50% width each. I want to make it so that the the hovered div expands to 70% and the other reduces to 30%. And when the mouse moves out, they both
To take @James' answer (+1) and add animation, just use .animate():
$(function(){
$("#div1").hover(
function(){
$(this).animate({width: '70%'});
},
function(){
$(this).animate({width: '50%'});
}
);
});
Demo: http://jsfiddle.net/mattball/sAW2c/
Doesn't know if this suites you: http://jsfiddle.net/yCY9y/3/
DOM:
<div id="wrapper">
<div id="left" class="content_left">LEFT</div><div id="right" class="content_right">RIGHT</div>
</div>
I use the wrapper to be sure we never break the RIGHT to the next line.
CSS:
#wrapper {
width:100%;
overflow:hidden;
white-space:nowrap;
}
#left, #right {
display:inline-block;
width: 50%;
}
#left {
background:red;
}
#right {
background:yellow;
}
I use on #wrapper
white-space:nowrap; // Newer break whitespaces (break to the next line)
and
width:100%;
On #left, #right
we use:
display:inline-block;
witch is first compatible with >IE6. (hopes this is not a problem).
JS:
$("#left, #right").each(function() {
$(this).data("standardWidth", $(this).width());
});
$("#left, #right").hover(function() {
$(this).animate({
width: "70%"
}, 300 );
$(this).parent().children().not(this).animate({
width: "30%"
}, 300 );
}, function() {
$(this).parent().children().each(function() {
$(this).animate({
width: $(this).data("standardWidth")
}, 300 );
});
});
First i Bind the same mouseover
and mouseout
event on both #right
and #left
$(selector).hover(mouseOverHandler, mouseOutHandler);
...
$(this).parent().children().not(this)
We take the element the event is fired throw and finds all it's parents (#wrapper
) childNodes: $(this).parent().children()
Now we filter out everything matching this
using jQuery's not
method. (this
= #left
OR #right
) witch is the element. Now we have #right -> #left
and #left -> #right
.
The mouseOutHandler
resets all of #wrapper
childNodes's width to 50%
Hopes this leads you the right way...
EDIT:
If you are expiring your animation to chain / queue up use can use the stop
method witch stop all active animations and clears the queue:
$(selector).stop().animate({
....
})
This should work nicely for you:
<script type="text/javascript">
$(function(){
$("#div1").hover(
function(){
$(this).css("width", "70%");
},
function(){
$(this).css("width", "50%");
}
);
});
</script>
EDIT: Added animation
EDIT: Added height resize to animation
<script type="text/javascript">
$(function(){
$("#div1").hover(
function(){
$(this).animate({ "width" : "70%", "height" : $("#container").height() + "px" });
},
function(){
$(this).animate({ "width" : "50%", "height" : "" });
}
);
});
</script>
<div id="container" style="height:400px;border:1px solid #000;padding:10px;">
<div id="div1" style="width:50%;border:1px solid #000;min-height:100px;">
Hello world!
</div>
</div>
EDIT: If you want it to fill the height of the window, just use window.innerHeight
in place of the container height:
<script type="text/javascript">
$(function(){
$("#div1").hover(
function(){
$(this).animate({ "width" : "70%", "height" : window.innerHeight + "px" });
},
function(){
$(this).animate({ "width" : "50%", "height" : "" });
}
);
});
</script>
<div id="div1" style="width:50%;border:1px solid #000;min-height:100px;">
Hello world!
</div>
Here's a jsFiddle that demonstrates it working.