Expand / shrink div on hover / out with jQuery

后端 未结 5 595
野趣味
野趣味 2020-12-25 12:30

I am looking for a jQuery plugin to expand div elements so as to reveal their overflow (if any) on hover. Illustration:

相关标签:
5条回答
  • 2020-12-25 12:58

    You can actually do this entirely with css, this is a snipet from a website of mine, im entirly too lazy to edit it, but you get the idea:

    <ul class="hover">
      <li style="margin-top:40px;"">
       <a href=""><img src="images/Home/Home.jpg" alt="home" style="width:130px; height:100px;"/>
       <img src="images/Home/Home.jpg" alt="home" class="preview" style="width:180px; height:150px;"/></a>
      </li>
      <li style="margin-left:55px; margin-top:-20px;">
       <a href=""><img src="images/About/About.jpg" alt="About The Author" style="width:200px; height:200px;"/>
       <img src="images/About/About.jpg" alt="About The Author" class="preview" style="width:250px; height:250px;"/></a>
      </li>
    </ul>
    

    css:

    /* begin hover */
    
    .hover{
    cursor: default;
    list-style: none;
    }
    
    .hover a .preview{
    display: none;
    }
    
    .hover a:hover .preview{
    display: block;
    position: absolute;
    top: -33px;
    left: -45px;
    z-index: 1;
    }
    
    .hover img{
    background: white;
    border-color: black;
    border-style: solid;
    border-width: 4px;
    color: inherit;
    padding: 2px;
    vertical-align: top;
    -moz-border-radius: 15px;
    border-radius: 15px;
    }
    
    .hover li{
    background: black;
    border-color: black;
    border-style: solid;
    border-width: 1px;
    color: inherit;
    display: block;
    float: left;
    margin: 3px;
    padding: 5px;
    position: relative;
    }
    
    .hover .preview{
    border-color:black;
    border-width:8px;
    border-stle:solid;
    }
    
    li{
    -moz-border-radius: 15px;
    border-radius: 15px;
    }
    

    there are some not needed styles in there but again, you get the idea. basically youre just showing one image on top of the original, on hover

    0 讨论(0)
  • 2020-12-25 13:00

    You don't need a plugin. Just add proper css and use jQuery animate:

    $div
    .on('mouseenter', function(){
        $(this).animate({ margin: -10, width: "+=20", height: "+=20" });
    })
    .on('mouseleave', function(){
        $(this).animate({ margin: 0, width: "-=20", height: "-=20" });
    })​
    

    demo here

    0 讨论(0)
  • 2020-12-25 13:02

    thanks to @MarkPieszak. For dynamically created elements use

    $(document).on({
      mouseenter: function () {
        $(this).animate({ height: "200", width: "200", left: "-=55", top: "-=55" }, "fast");
      },
      mouseleave: function () {
        $(this).animate({ height: "90", width: "90", left: "+=55", top: "+=55" }, "fast");
      }    
    }, '.img a img');
    

    .hover() does work only on static elements. more here

    0 讨论(0)
  • 2020-12-25 13:04

    The images are missing here... but here is how I pulled this off a few years ago. The basic theory is that all of the images/div's whatever are absolute, inside of their own relative area. I then animate the left & top position both -negatively. This makes them protrude above the surrounding boxes and look like they are popping out. (Of course you also need to make sure the z-index of this one is higher than the ones around it).

    jsFiddle DEMO

    $(".img a img").hover(function() {
        $(this).closest(".img").css("z-index", 1);
    
        // this is where the popping out effect happens
        $(this).animate({ height: "200", width: "200", left: "-=55", top: "-=55" }, "fast");
    
    }, function() {
        $(this).closest(".img").css("z-index", 0);
        $(this).animate({ height: "90", width: "90", left: "+=55", top: "+=55" }, "fast");
    });​
    

    The styles I have for these two things are:

    .img { 
       position:relative; 
       z-index:0px;  
    }
    
    .img a img { 
       position:absolute;
       border:1px #1b346c solid; 
       background:#f1f1f1; 
       width:90px; 
       height:90px; 
    }
    
    0 讨论(0)
  • 2020-12-25 13:15

    If it is text, it is a little more complicated...

    I use it like this:

    $('.floating').mouseenter(function(){
      const $this = $(this);
      const dimension = $this.data('dimension');
      const ratioEnlarged = 2;
    
      const tempElement = $this.clone();
      tempElement.appendTo('body');
      tempElement.css({
        width: dimension.width,
        height: dimension.height
      });
    
      if(tempElement.is(':offscreen')){
        // Change this to animate if you want it animated.
        $this.css({
          'margin-left': -dimension.width * ratioEnlarged/2,
          'margin-top': -dimension.height * ratioEnlarged/4,
          'font-size': ratioEnlarged + 'em',
          width: dimension.width * ratioEnlarged,
          height: dimension.height * ratioEnlarged
        });
      } else {
        $this.css({
          'margin-left': -dimension.width * ratioEnlarged/4,
          'margin-top': -dimension.height * ratioEnlarged/4,
          'font-size': ratioEnlarged + 'em',
          width: dimension.width * ratioEnlarged,
          height: dimension.height * ratioEnlarged
        });
      }
    
      tempElement.remove();
    });
    
    $('.floating').mouseleave(function(event) {
      const $this = $(this);
      const dimension = $this.data('dimension');
    
      if(!$this.hasClass('context-menu-active')){
        $this.css({
          margin: 0,
          'font-size': '1em',
          width: dimension.width,
          height: dimension.height
        });
      }
    });
    
    0 讨论(0)
提交回复
热议问题