Ich habe einen Block, der Inhalte enthält, die beim Hover angezeigt werden. Der Effekt sollte wie folgt wirken:
.hoverCard
Grundlegende Inhalte werden standardmäßig angezeigt (der Inhalt in .hoverCard__showOnHover ist ausgeblendet)
Der Benutzer bewegt sich über .hoverCard, wodurch .hoverCard__showOnHover
显示其内容,并且 .hoverCard__body
der Übergang nach oben erfolgt (was ihm einen „offenen“ Effekt verleiht) Das Problem, auf das ich gestoßen bin, ist:
visibility:hidden
、opacity:0
和 height:0
仍然为 .hoverCard__showOnHover
保留空间。这意味着,如果默认情况下,.hoverCard__body
的底部填充量为 40px,而 .hoverCard__showOnHover
mit einer Höhe von 100 Pixel muss der Benutzer nicht mehr mit der Maus über die .hoverCard fahren, um den 140 Pixel großen Bereich anzuzeigen.GSAP
逐渐赋予 .hoverCard__showOnHover
Höhe zu verwenden. Aber kein Glück, da das oben genannte Problem immer noch besteht Gibt es eine Möglichkeit, dieses Problem zu lösen? Ich verwende nicht unbedingt GSAP, ich habe GSAP nur ausprobiert, um das oben genannte Problem zu lösen.
const hoverCard = document.querySelector('.hoverCard'); const hoverCardBodyShowOnHover = document.querySelector('.hoverCard__showOnHover'); hoverCard.addEventListener('mouseenter', function() { gsap.to(hoverCardBodyShowOnHover, { duration: 0.5, display: 'block', height: 'auto', ease: 'power4.out' }); }); hoverCard.addEventListener('mouseleave', function() { gsap.to(hoverCardBodyShowOnHover, { duration: 0.5, height: 0, ease: 'power4.out', onComplete: function() { this.targets()[0].style.display = 'none'; }}); });
:root { --black: #000000; --white: #ffffff; --yellow: #FFE775; } /* general */ body { font-family: "Poppins", sans-serif; background-color: var(--white); color: var(--black); } section { margin: 100px 0 300px 0; } /* card */ .hoverCard { margin-bottom: 15px; width: 100%; border-radius: 8px; overflow: hidden; background-color: var(--black); color: var(--white); border: 1px solid var(--black); } .hoverCard * { transition: all 0.5s ease; } .hoverCard:hover .hoverCard__body { transform: translateY(-75px); } .hoverCard:hover .hoverCard__body .hoverCard__showOnHover { opacity: 1; visibility: visible; display: block; height: auto; transform: translateY(75px); } .hoverCard__header { height: 350px; background-color: var(--yellow); } .hoverCard__showOnHover { display: none; height: 0; overflow: hidden; } .hoverCard__body { width: 100%; padding: 30px 30px 40px 30px; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.11.3/gsap.min.js"></script> <link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.0.2/css/bootstrap.min.css" rel="stylesheet"> <section> <div class="container"> <div class="row"> <div class="col-12 col-md-6"> <article class="hoverCard position-relative"> <div class="hoverCard__header"> <!-- img here --> </div> <div class="hoverCard__body"> <div class="hoverCard__body-text">Subheader</div> <div class="hoverCard__showOnHover"> <p>This will show on hover Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p> </div> </div> </article> </div> <div class="col-12 col-md-6"> <article class="hoverCard position-relative"> <div class="hoverCard__header"> <!-- img here --> </div> <div class="hoverCard__body"> <div class="hoverCard__body-text">Subheader 2</div> <div class="hoverCard__showOnHover"> <p>This will show on hover</p> </div> </div> </article> </div> </div> </div> </section>
So sieht die Standardversion der Karte optisch aus (rechte Karte) und wie die Hover-Interaktion funktioniert (linke Karte):
Beachten Sie, dass sich die Kartenhöhe nicht erhöht hat. Stattdessen bewegt sich der Körper nach oben (innerhalb der Karte), um den Inhalt preiszugeben.
Basierend auf Kooilncs Antwort:
:root { --black: #000000; --white: #ffffff; --yellow: #FFE775; } /* general */ body { background-color: var(--white); color: var(--black); } section { margin: 100px 0 300px 0; } /* card */ .hoverCard { margin-bottom: 15px; width: 100%; border-radius: 8px; overflow: hidden; background-color: var(--black); color: var(--white); border: 1px solid var(--black); position: relative; /* added */ } .hoverCard * { transition: all 0.5s ease; } .hoverCard:hover .hoverCard__body { transform: translateY(-75px); } .hoverCard:hover .hoverCard__body .hoverCard__showOnHover { /* opacity: 1; visibility: visible; display: block; height: */ auto; overflow: initial; /* added */ height: auto; /* added */ max-height: 100px; /* added */ transform: translateY(75px); } .hoverCard__header { height: 200px; background-color: var(--yellow); } .hoverCard__showOnHover { overflow: hidden; max-height: 0; /* added */ transition: max-height 0.5s ease-in-out; /* added */ overflow: hidden; /* added */ } .hoverCard__body { width: 100%; padding: 30px 30px 40px 30px; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.11.3/gsap.min.js"></script> <link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.0.2/css/bootstrap.min.css" rel="stylesheet"> <section> <div class="container"> <div class="row"> <div class="col-6"> <article class="hoverCard position-relative"> <div class="hoverCard__header"> <!-- img here --> </div> <div class="hoverCard__body"> <div class="hoverCard__body-text">Subheader</div> <div class="hoverCard__showOnHover"> <p>This will show on hover Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p> </div> </div> </article> </div> <div class="col-6"> <article class="hoverCard position-relative"> <div class="hoverCard__header"> <!-- img here --> </div> <div class="hoverCard__body"> <div class="hoverCard__body-text">Subheader 2</div> <div class="hoverCard__showOnHover"> <p>This will show on hover</p> </div> </div> </article> </div> </div> </div> </section>
Müssen wir außerdem eine Zahl für max-height: 100px;
definieren? Was passiert, wenn die Inhaltsgröße unbekannt ist und dynamisch sein muss?
Neueste Methode:
:root{ --white: #FFFFFF; --black: #000000; --yellow: #FFE775; } section{ padding: 150px 0; } .hoverCard { margin-bottom: 15px; width: 100%; border-radius: 8px; overflow: hidden; padding-bottom: 180px; // seems I need this to maintain height background-color: var(--black); color: var(--white); border: 1px solid var(--black); /* only on non touch devices ================================== */ @media (hover: hover) { * { transition: all 0.5s ease; } &:hover { .hoverCard__body { transform: translateY(-75px); } .hoverCard__showOnHover { display: block; max-height: none; overflow: visible; } } } &__showOnHover { display: none; max-height: 0; overflow: hidden; transition: max-height 0.5s ease-in-out; } /* only on touch devices ================================== */ @media (pointer: coarse) { &__showOnHover { margin-bottom: 30px; } } /* =============================== */ &__header { height: 350px; background-color: var(--yellow); } &__body { position: absolute; bottom: 0; width: 100%; padding: 30px 30px 0px 30px; color: var(--white); background-color: var(--black); &-text { margin-bottom: 60px; } } }
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.11.3/gsap.min.js"></script> <link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.0.2/css/bootstrap.min.css" rel="stylesheet"> <section> <div class="container"> <div class="row"> <div class="col-6"> <article class="hoverCard position-relative"> <div class="hoverCard__header"> <!-- img here --> </div> <div class="hoverCard__body"> <div class="hoverCard__body-text">Subheader</div> <div class="hoverCard__showOnHover"> <p>This will show on hover Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p> </div> </div> </article> </div> <div class="col-6"> <article class="hoverCard position-relative"> <div class="hoverCard__header"> <!-- img here --> </div> <div class="hoverCard__body"> <div class="hoverCard__body-text">Subheader 2</div> <div class="hoverCard__showOnHover"> <p>This will show on hover</p> </div> </div> </article> </div> </div> </div> </section>
Nach oben:
.hoverCard__body
上方出现不必要的空格(应仅填充顶部 30px
).
技巧是将要显示的文本设置为
max-height: 0
和overflow: hide
。这是一个最小可重现示例。