Animating max-height with CSS transitions

前端 未结 6 2025
死守一世寂寞
死守一世寂寞 2020-12-02 21:58

I want to create an expand/collapse animation that\'s powered only by classnames (javascript is used to toggle the classnames).

I\'m giving one class max-heigh

相关标签:
6条回答
  • 2020-12-02 22:30

    The solution is actually quite simple. Make a child div, that has the content. The parent div will be the one that expands collapses.

    On load the parent div will have a max-height. when toggling, you can check the child height by writing document.querySelector('.expand-collapse-inner').clientHeight; and set the maxheight with javascript.

    In your CSS, you will have this

    .parent {
    transition: max-height 250ms;
    }
    
    0 讨论(0)
  • 2020-12-02 22:31

    Fix delay solution:

    Put cubic-bezier(0, 1, 0, 1) transition function for element.

    scss

    .text {
      overflow: hidden;
      max-height: 0;
      transition: max-height 0.5s cubic-bezier(0, 1, 0, 1);
    
      &.full {
        max-height: 1000px;
        transition: max-height 1s ease-in-out;
      }
    }
    

    css

    .text {
      overflow: hidden;
      max-height: 0;
      transition: max-height 0.5s cubic-bezier(0, 1, 0, 1);
    }
    
    .text.full {
      max-height: 1000px;
      transition: max-height 1s ease-in-out;
    }
    
    0 讨论(0)
  • 2020-12-02 22:31

    This is an old question but I just worked out a way to do it and wanted to stick it somewhere so I know where to find it should I need it again :o)

    So I needed an accordion with clickable "sectionHeading" divs that reveal/hide corresponding "sectionContent" divs. The section content divs have variable heights, which creates a problem as you can't animate height to 100%. I've seen other answers suggesting animating max-height instead but this means sometimes you get delays when the max-height you use is larger than the actual height.

    The idea is to use jQuery on load to find and explicitly set the heights of the "sectionContent" divs. Then add a css class 'noHeight' to each a click handler to toggle it:

    $(document).ready(function() {
        $('.sectionContent').each(function() {
            var h = $(this).height();
            $(this).height(h).addClass('noHeight');
        });
        $('.sectionHeader').click(function() {
            $(this).next('.sectionContent').toggleClass('noHeight');
        });
    });
    

    For completeness, the relevant css classes:

    .sectionContent {
        overflow: hidden;
        -webkit-transition: all 0.3s ease-in;
        -moz-transition: all 0.3s ease-in;
        -o-transition: all 0.3s ease-in;
        transition: all 0.3s ease-in;
    }
    .noHeight {
            height: 0px !important;
    }
    

    Now the height transitions work without any delays.

    0 讨论(0)
  • 2020-12-02 22:41

    You can accomplish this just fine using jQuery Transit:

    $(function () {
        $(".paragraph").click(function () {
            var expanded = $(this).is(".expanded");
            if (expanded) 
            {
                $(this).transition({ 'max-height': '4em', overflow: 'hidden' }, 500, 'in', function () {$(this).removeClass("expanded"); });
            } 
            else 
            {
                $(this).transition({ 'max-height': $(this).get(0).scrollHeight, overflow: ''}, 500, 'out', function () { $(this).addClass("expanded"); });
            }
        });
    });
    

    You can definitely tidy it up a bit to your liking, but that should do what you want.

    JS Fiddle Demo

    0 讨论(0)
  • 2020-12-02 22:46

    Use display:flex. This will work:

    .parent > div {
      display: flex;
      flex-direction: column;
      height: 0px;
      max-height: 0px;
      opacity: 0;
      overflow: hidden;
      transition: all 0.3s;
    }
    
    .parent > div.active {
      opacity: 1; 
      height: 100%;
      max-height: none; /* important for animation */
    }
    
    0 讨论(0)
  • 2020-12-02 22:47

    In case anyone is reading this, I have not found a solution and went with an expand-only effect (which was achieved by moving the transition style to the expanded class definition)

    0 讨论(0)
提交回复
热议问题