උස සංක්‍රාන්තිය කරන්නේ කෙසේද: 0; උස දක්වා: ස්වයංක්‍රීය; CSS භාවිතා කරනවාද?


2149

මම <ul>CSS සංක්‍රාන්ති භාවිතා කරමින් ස්ලයිඩයක් පහළට දැමීමට උත්සාහ කරමි .

මෙම <ul>දී ලකුණු ආරම්භ height: 0;. සැරිසැරීමේදී, උස සකසා ඇත height:auto;. කෙසේ වෙතත්, මෙය සංක්‍රාන්තිය නොව සරලව පෙනෙන්නට සලස්වයි

මම එය කරනවා නම් height: 40px;කිරීමට height: auto;, එය දක්වා තල්ලු කරනු ඇත height: 0;, පසුව හදිසියේ නිවැරදි උස පැනීමට.

ජාවාස්ක්‍රිප්ට් භාවිතා නොකර මට මෙය කළ හැක්කේ කෙසේද?

#child0 {
  height: 0;
  overflow: hidden;
  background-color: #dedede;
  -moz-transition: height 1s ease;
  -webkit-transition: height 1s ease;
  -o-transition: height 1s ease;
  transition: height 1s ease;
}
#parent0:hover #child0 {
  height: auto;
}
#child40 {
  height: 40px;
  overflow: hidden;
  background-color: #dedede;
  -moz-transition: height 1s ease;
  -webkit-transition: height 1s ease;
  -o-transition: height 1s ease;
  transition: height 1s ease;
}
#parent40:hover #child40 {
  height: auto;
}
h1 {
  font-weight: bold;
}
The only difference between the two snippets of CSS is one has height: 0, the other height: 40.
<hr>
<div id="parent0">
  <h1>Hover me (height: 0)</h1>
  <div id="child0">Some content
    <br>Some content
    <br>Some content
    <br>Some content
    <br>Some content
    <br>Some content
    <br>
  </div>
</div>
<hr>
<div id="parent40">
  <h1>Hover me (height: 40)</h1>
  <div id="child40">Some content
    <br>Some content
    <br>Some content
    <br>Some content
    <br>Some content
    <br>Some content
    <br>
  </div>
</div>


මා විශ්වාස කරනවා, height:auto/max-heightවඩා වැඩි ඔබ ප්රදේශයේ ව්යාප්ත කරන්නේ නම්, විසඳුමක් පමණක් වැඩ කරන heightඔබ සීමා කරන්න ඕනේ. ඔබ සතුව max-heightඇති 300px, නමුත් ආපසු කළ හැකි combo කොටුව දක, 50px, එසේ නම් max-heightඔබ, උදව් නැහැ 50pxඅංග ගණන මත පදනම්ව විචල්ය වන අතර, ඔබ විසින් ඒ නිසා මම ඒක හදන්න නොහැකි කළ නොහැකි තත්වයට පැමිණීමට හැකි heightනොවේ ස්ථාවරයි, height:autoවිසඳුම, නමුත් මට මේ සමඟ සංක්‍රාන්ති භාවිතා කළ නොහැක.
ක්‍රිස්ටෝපර් තෝමස්

52
OP උත්සාහ කරන්නේ css විසඳුම සඳහා මිස js නොවේ, එසේ නොමැතිනම් ඔවුන්ට පිටාර ගැලීම සහ සජීවිකරණය භාවිතා කළ හැකිය
ටෝනි ලී

5
IDVesesignz: නමුත් අභ්‍යන්තර div හි -100% ආන්තික-ඉහළට ලැබෙන්නේ උස නොව , ආවරණ div හි පළලයි . එබැවින් මෙම විසඳුමට එකම ආකාරයේ ගැටළුවක් ඇත, උපරිම උස විසඳුම. තවද පළල අන්තර්ගතයේ උසට වඩා කුඩා වන විට, සියලු අන්තර්ගතයන් -100% ආන්තික-ඉහළින් සැඟවී නැත. එබැවින් මෙය වැරදි විසඳුමකි.
ග්‍රෙග්ටොම්

1
නිසි විසඳුමක් ක්‍රියාත්මක කිරීම හා ක්‍රියාත්මක කිරීම පිළිබඳ සාකච්ඡා කිරීම සඳහා github.com/w3c/csswg-drafts/issues/626 බලන්න
බෙන්

Answers:


2775

max-heightසංක්‍රාන්තියේදී භාවිතා කරන්න height. max-heightඔබේ කොටුවට ලැබෙන ප්‍රමාණයට වඩා විශාල දෙයකට වටිනාකමක් සකසන්න .

ශුද්ධාසනයේ JSFiddle Demo තවත් ක්රිස් ජෝර්දානය විසින් සපයන පිළිතුර මෙතන.

#menu #list {
    max-height: 0;
    transition: max-height 0.15s ease-out;
    overflow: hidden;
    background: #d5d5d5;
}

#menu:hover #list {
    max-height: 500px;
    transition: max-height 0.25s ease-in;
}
<div id="menu">
    <a>hover me</a>
    <ul id="list">
        <!-- Create a bunch, or not a bunch, of li's to see the timing. -->
        <li>item</li>
        <li>item</li>
        <li>item</li>
        <li>item</li>
        <li>item</li>
    </ul>
</div>


325
මෙය විශිෂ්ටයි! එය ආරම්භ වන විට ප්‍රමාදයක් ඇතිවීම හැර, එය ආරම්භ වන්නේ උපරිම උස සඳහා වන නිසා එය මුලින් ඉතා ඉහළ මට්ටමක පවතී..හ්ම්, මෙය තරමක් කරදරකාරී යැයි මම සිතමි
vsync

175
+1 විශිෂ්ට විසඳුමක්! සංක්‍රාන්තියේ වේගය ගණනය කරනු ලබන්නේ ඔබ උපරිම උස අගයට මාරුවීමට නියම කරන කාලය ලෙසය ... නමුත් උස උපරිම උසකට වඩා අඩු වනු ඇති බැවින් සත්‍ය උසකට මාරුවීම වේගයෙන් (බොහෝ විට සැලකිය යුතු ලෙස) සිදුවනු ඇත කාලය නියම කර ඇත.
කිං ජෙෆ්රි

50
සත්‍ය ගණනය කළ අගයට වඩා විශාල අගයන් භාවිතා කිරීමට සිදු වූ විට මෙය කැත සංක්‍රාන්ති අවසානයක් ඇති කළ හැකි බව සලකන්න. විවිධ තිර ප්‍රමාණයන් නිසා විශාල උසකින් වෙනස් වන 0 සිට අන්තර්ගත උස දක්වා බෙදීමක් ඇති කිරීමට උත්සාහ කරන අතරතුර මම මෙය දුටුවෙමි (මගේ 2560x1440 මොනිටරයේ පේළි 2 ක් සහ ස්මාර්ට් ජංගම දුරකතනයේ පේළි 10 ක්). මේ සඳහා මම ජේ.එස්.
jpeltoniemi

44
එය එක් දිශාවකට ප්‍රමාදයක් ඇති කරන නමුත් අනෙක් දිශාවට නොවන බැවින් ඉතා කැත විසඳුමකි.
ටිම්

84
මෙය ලස්සන කම්මැලි විසඳුමකි. මම හිතන්නේ OP ට උස භාවිතා කිරීමට අවශ්‍යයි: ස්වයංක්‍රීයව කන්ටේනරයේ පුළුල් උස තරමක් අනාවැකි කිව නොහැකි නිසා. සජීවිකරණය දෘශ්‍ය වීමට පෙර මෙම විසඳුම ප්‍රමාද වීමට හේතු වේ. මීට අමතරව සජීවිකරණයේ දෘශ්‍යමාන කාල සීමාව අනපේක්ෂිත වනු ඇත. එක් එක් බහාලුම් ළමා නෝඩ් වල ඒකාබද්ධ උස ගණනය කිරීමෙන් සහ නිශ්චිත උස අගයකට ලිහිල් කිරීමෙන් ඔබට වඩාත් පුරෝකථනය කළ හැකි (හා වඩා සුමට) ප්‍රති results ල ලැබෙනු ඇත.
ෂෝන් වින්නරි

316

ඒ වෙනුවට ඔබ පරිමාණ Y භාවිතා කළ යුතුය.

ul {
  background-color: #eee;
  transform: scaleY(0);    
  transform-origin: top;
  transition: transform 0.26s ease;
}
p:hover ~ ul {
  transform: scaleY(1);
}
<p>Hover This</p>
<ul>
  <li>Coffee</li>
  <li>Tea</li>
  <li>Milk</li>
</ul>

මම ඉහත කේතයේ විකුණුම්කරුගේ පෙර සංස්කරණයක් jsfiddle මත සාදා ඇති අතර උස වෙනුවට පරිමාණ Y භාවිතා කිරීමට ඔබේ jsfiddle වෙනස් කර ඇත.


6
මම මෙම පිළිතුර ඉහළට ඔසවා තබන්නේ එය css3- සංක්‍රාන්ති හැකියාව සහිත බ්‍රව්සර්වල හොඳින් ක්‍රියාත්මක වන බැවිනි, නමුත් මෙය IE <9 හි කිසිසේත් ක්‍රියා නොකරන බව සැලකිල්ලට ගත යුතු අතර IE <10 හි සජීවීකරණය
හෙල්වුඩ්

215
මෙම ක්‍රමය අර්ධ වශයෙන් පමණක් අපේක්ෂිත ප්‍රති achieve ල ලබා ගන්නා නමුත් ඇත්ත වශයෙන්ම අවකාශය ඉවත් නොකරයි . පරිණාමිත කොටුව සාපේක්ෂව ස්ථානගත කළ මූලද්‍රව්‍යයක් ලෙස ක්‍රියා කරයි - අවකාශය එය කොතරම් පරිමාණය කළත් එය භාර ගනී. ඔබේ පළමු එක ගෙන පතුලේ ව්‍යාජ පෙළක් එකතු කරන මෙම jsFiddle බලන්න . කොටුවේ උස බිංදුවට පරිමාණය කළ විට එයට පහළින් ඇති පෙළ ඉහළට නොයන ආකාරය සැලකිල්ලට ගන්න.
animuson

9
දැන් එය සිදු වන්නේ: jsfiddle.net/gNDX3/1 මූලික වශයෙන් ඔබට අවශ්‍ය දේ අනුව ඔබේ අංග මෝස්තර කළ යුතුය. CSS / HTML හි හැසිරීම වැනි රිදී උණ්ඩයක් හෝ විජට් නොමැත.
dotnetCarpenter

71
යමෙකු විවිධ ප්‍රවේශයන් අත්හදා බලන බව මම අගය කරන අතරම, මෙම විසඳුම ගෙන එන සැබෑ ලෝක බලපෑම සහ සංකූලතා දැනටමත් භයානක උපරිම උස හැක් කිරීමට වඩා නරක ය. කරුණාකර භාවිතා නොකරන්න.
mystrdat

2
QSquareCat හරි. මෙන්න වඩාත් ලාච්චු වැනි එකක්: jsfiddle.net/dotnetCarpenter/WTL2r
dotnetCarpenter

202

සම්බන්ධ වී ඇති උසකින් එකක් වන විට ඔබට දැනට උස සජීවීකරණය කළ නොහැක auto, ඔබට පැහැදිලි උස දෙකක් සැකසිය යුතුය.


12
ගැටලුවක් විසඳීම සඳහා සාමාන්‍යයෙන් විවිධ ක්‍රම තිබේ, ඒවා සියල්ලම සුදුසු හෝ හැකි නොවේ. ප්‍රශ්න හා පිළිතුරු වෙබ් අඩවියක ඇති පිළිතුරු සීමා කිරීමට ජෙඩිඩියාහර්ට් සහ රයන් ඕර් උත්සාහ කරන්නේ මන්දැයි මම නොදනිමි. විශේෂයෙන් මෙම පිළිතුර සලකා බැලීමේදී පළමුව මෙහි විය. දෙගුණයක් එසේ නම්, පිළිගත් පිළිතුර ප්‍රති ar ලයකි.
හුරේ ඉම් හෙල්පින්

5
Ake ජේක්ගෙන් ලැබෙන පිළිතුර අලංකාර හෝ නිවැරදි නොවේ. මෙහි සම්බන්ධිත පිළිතුර වඩා හොඳය. එය නිවැරදිව ක්‍රියාත්මක වන අතර සියලු ප්‍රමාණයේ සිද්ධීන් හසුරුවයි - පිළිගත් පිළිතුර ගැන කිව නොහැක.
ග්‍රැෆික්ස් මුන්චර්

5
ඔව්: එය සිදු වේthis.$element[dimension](this.$element[dimension]())[0].offsetHeight
ඇන්ඩි

4
මෙය කෙසේ හෝ නිවැරදි කිරීමට සැලසුම් කර තිබේද? මම කිව්වේ, උස 0 සිට සංක්‍රමණය වීමට හැකි වීම අපේක්ෂා කිරීම ස්වාභාවිකය auto...
ඔගස්ටින් රයිඩින්ගර්

6
El මෙලියෝඩාස් "නැත / ඔබට නොහැක" යනු තොග පිටාර ගැලීම පිළිබඳ ප්‍රශ්න වලට වලංගු සහ පිළිගත හැකි පිළිතුරකි.
ටයිලර් එච්

122

මම හැම විටම භාවිතා කර ඇති බව විසඳුම, පසුව එය හැකිලී පළමු සුවදායී නින්දක් සිදු විය font-size, paddingසහ marginවටිනාකම්. එය පිසදැමීමකට සමාන නොවේ, නමුත් එය ස්ථිතික heightහෝ නොමැතිව ක්‍රියා කරයි max-height.

වැඩ කරන උදාහරණය:

/* final display */
#menu #list {
    margin: .5em 1em;
    padding: 1em;
}

/* hide */
#menu:not(:hover) #list {
    font-size: 0;
    margin: 0;
    opacity: 0;
    padding: 0;
    /* fade out, then shrink */
    transition: opacity .25s,
                font-size .5s .25s,
                margin .5s .25s,
                padding .5s .25s;
}

/* reveal */
#menu:hover #list {
    /* unshrink, then fade in */
    transition: font-size .25s,
                margin .25s,
                padding .25s,
                opacity .5s .25s;
}
<div id="menu">
    <b>hover me</b>
    <ul id="list">
        <li>item</li>
        <li>item</li>
        <li>item</li>
        <li>item</li>
        <li>item</li>
    </ul>
</div>

<p>Another paragraph...</p>


මා වෙනුවෙන් පිළිවෙලට වැඩ කළා. JQuery slideUp / Down තරම් නොවේ. ඔබට වෙනසක් දැකිය හැක්කේ පැරණි පරිගණක හෝ ජංගම වැනි දුර්වල CPU සමඟ පමණක් වන අතර ඒවායින් බොහොමයක් එකවර විවෘත කර වසා දමයි.
නූනස්

3
ඔබට බොත්තම් හෝ වෙනත් පෙළ නොවන මූලද්‍රව්‍ය තිබේ නම්, ඔබ සැරිසරන්නේ නැති අතර අනවශ්‍ය හිස් අවකාශයකින් අවසන් වේ.
ඩෙනිස් ඩබ්ලිව්

3
සියලුම ළමා අංග තෝරාගෙන *වෙනත් වෙනස්කම් යෙදීමෙන් ඔබට එය තවදුරටත් ශෝධනය කළ හැකිය . බොත්තම් මගේ ඉහත කේතය මගින් බලපෑමට ලක්විය යුතුය, කෙසේ වෙතත්, ඒවා නිවැරදිව මෝස්තර කර emතිබේ නම්.
ස්ටීවන් වචොන්

1
මගේ නඩුව, මම ද එක් කිරීමට අවශ්ය line-height: 0;හාborder-width: 0;
අන්ෙදේ Shatilov

1
ඔබ වෙනස් කිරීම සඳහා අවශ්ය නොවේ line-heightඔබ නිවැරදිව අගය ඒකක වැළකී සිටිනවා නම්: developer.mozilla.org/en-US/docs/Web/CSS/...
ස්ටීවන් Vachon

93

මෙම ප්‍රශ්නයට තිස්වන පිළිතුර මෙය බව මම දනිමි, නමුත් එය වටිනවා යැයි මම සිතමි. මෙය පහත සඳහන් ගුණාංග සහිත CSS පමණක් විසඳුමකි:

  • ආරම්භයේ ප්‍රමාදයක් නොමැති අතර සංක්‍රාන්තිය කලින් නතර නොවේ. දෙපැත්තෙන්ම (පුළුල් කිරීම හා කඩා වැටීම), ඔබ ඔබේ CSS හි සංක්‍රාන්ති කාල සීමාව 300ms ලෙස සඳහන් කරන්නේ නම්, සංක්‍රාන්තිය 300ms, කාල පරිච්ඡේදයක් ගතවේ.
  • එය සත්‍ය උස සංක්‍රමණය කරයි (මෙන් නොව transform: scaleY(0)), එබැවින් බිඳෙනසුලු මූලද්‍රව්‍යයෙන් පසුව අන්තර්ගතයක් තිබේ නම් එය නිවැරදි දේ කරයි.
  • එහි (වෙනත් විසඳුම් වැනි) අතර වේ (මෙන් "ඔයාගේ පෙට්ටිය වඩා වැඩි බව දිග මෙතෙක් වනු ඇත තෝරාගන්න") මැජික් අංක, එය ඔබගේ උපකල්පනය වැරදි ජීවියෙක් නම් නොවේ මාරක වේ. සංක්‍රාන්තිය එවැනි අවස්ථාවක දී පුදුම සහගත ලෙස පෙනෙන්නට නොතිබිය හැකි නමුත් සංක්‍රාන්තියට පෙර සහ පසු මෙය ගැටළුවක් නොවේ: පුළුල් කළ ( height: auto) තත්වය තුළ, සමස්ත අන්තර්ගතයටම සෑම විටම නිවැරදි උස ඇත (උදා: ඔබ max-heightහැරෙන දෙයක් තෝරා ගන්නේ නම් මෙන් නොව) ඉතා අඩු). බිඳ වැටුණු තත්වයේ දී, උස ශුන්‍ය වේ.

නිරූපණය

මෙන්න එකම බිඳවැටෙන මූලද්‍රව්‍ය තුනක්, විවිධ උසකින් යුත් සියල්ලම එකම CSS භාවිතා කරන නිරූපණයක්. "ධාවන ස්නිපෙට්" ක්ලික් කිරීමෙන් පසු ඔබට "සම්පූර්ණ පිටුව" ක්ලික් කිරීමට අවශ්‍ය විය හැකිය. ජාවාස්ක්‍රිප්ට් collapsedසීඑස්එස් පන්තියට පමණක් ටොගල් කරන බව සලකන්න , මිනුම් කිරීමක් නොමැත. (ඔබට කිසියම් ජාවාස්ක්‍රිප්ට් එකක් නොමැතිව චෙක් කොටුවක් භාවිතා කිරීමෙන් මෙම නිර්‍මාණ නිරූපණය කළ හැකිය :target). සංක්‍රාන්තිය සඳහා වගකිව යුතු CSS හි කොටස ඉතා කෙටි බවත්, HTML සඳහා අවශ්‍ය වන්නේ එක් අතිරේක ආවරණයක් පමණක් බවත් මතක තබා ගන්න.

$(function () {
  $(".toggler").click(function () {
    $(this).next().toggleClass("collapsed");
    $(this).toggleClass("toggled"); // this just rotates the expander arrow
  });
});
.collapsible-wrapper {
  display: flex;
  overflow: hidden;
}
.collapsible-wrapper:after {
  content: '';
  height: 50px;
  transition: height 0.3s linear, max-height 0s 0.3s linear;
  max-height: 0px;
}
.collapsible {
  transition: margin-bottom 0.3s cubic-bezier(0, 0, 0, 1);
  margin-bottom: 0;
  max-height: 1000000px;
}
.collapsible-wrapper.collapsed > .collapsible {
  margin-bottom: -2000px;
  transition: margin-bottom 0.3s cubic-bezier(1, 0, 1, 1),
              visibility 0s 0.3s, max-height 0s 0.3s;
  visibility: hidden;
  max-height: 0;
}
.collapsible-wrapper.collapsed:after
{
  height: 0;
  transition: height 0.3s linear;
  max-height: 50px;
}

/* END of the collapsible implementation; the stuff below
   is just styling for this demo */

#container {
  display: flex;
  align-items: flex-start;
  max-width: 1000px;
  margin: 0 auto;
}  


.menu {
  border: 1px solid #ccc;
  box-shadow: 0 1px 3px rgba(0,0,0,0.5);
  margin: 20px;

  
}

.menu-item {
  display: block;
  background: linear-gradient(to bottom, #fff 0%,#eee 100%);
  margin: 0;
  padding: 1em;
  line-height: 1.3;
}
.collapsible .menu-item {
  border-left: 2px solid #888;
  border-right: 2px solid #888;
  background: linear-gradient(to bottom, #eee 0%,#ddd 100%);
}
.menu-item.toggler {
  background: linear-gradient(to bottom, #aaa 0%,#888 100%);
  color: white;
  cursor: pointer;
}
.menu-item.toggler:before {
  content: '';
  display: block;
  border-left: 8px solid white;
  border-top: 8px solid transparent;
  border-bottom: 8px solid transparent;
  width: 0;
  height: 0;
  float: right;
  transition: transform 0.3s ease-out;
}
.menu-item.toggler.toggled:before {
  transform: rotate(90deg);
}

body { font-family: sans-serif; font-size: 14px; }

*, *:after {
  box-sizing: border-box;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div id="container">
  <div class="menu">
    <div class="menu-item">Something involving a holodeck</div>
    <div class="menu-item">Send an away team</div>
    <div class="menu-item toggler">Advanced solutions</div>
    <div class="collapsible-wrapper collapsed">
      <div class="collapsible">
        <div class="menu-item">Separate saucer</div>
        <div class="menu-item">Send an away team that includes the captain (despite Riker's protest)</div>
        <div class="menu-item">Ask Worf</div>
        <div class="menu-item">Something involving Wesley, the 19th century, and a holodeck</div>
        <div class="menu-item">Ask Q for help</div>
      </div>
    </div>
    <div class="menu-item">Sweet-talk the alien aggressor</div>
    <div class="menu-item">Re-route power from auxiliary systems</div>
  </div>

  <div class="menu">
    <div class="menu-item">Something involving a holodeck</div>
    <div class="menu-item">Send an away team</div>
    <div class="menu-item toggler">Advanced solutions</div>
    <div class="collapsible-wrapper collapsed">
      <div class="collapsible">
        <div class="menu-item">Separate saucer</div>
        <div class="menu-item">Send an away team that includes the captain (despite Riker's protest)</div>
      </div>
    </div>
    <div class="menu-item">Sweet-talk the alien aggressor</div>
    <div class="menu-item">Re-route power from auxiliary systems</div>
  </div>

  <div class="menu">
    <div class="menu-item">Something involving a holodeck</div>
    <div class="menu-item">Send an away team</div>
    <div class="menu-item toggler">Advanced solutions</div>
    <div class="collapsible-wrapper collapsed">
      <div class="collapsible">
        <div class="menu-item">Separate saucer</div>
        <div class="menu-item">Send an away team that includes the captain (despite Riker's protest)</div>
        <div class="menu-item">Ask Worf</div>
        <div class="menu-item">Something involving Wesley, the 19th century, and a holodeck</div>
        <div class="menu-item">Ask Q for help</div>
        <div class="menu-item">Separate saucer</div>
        <div class="menu-item">Send an away team that includes the captain (despite Riker's protest)</div>
        <div class="menu-item">Ask Worf</div>
        <div class="menu-item">Something involving Wesley, the 19th century, and a holodeck</div>
        <div class="menu-item">Ask Q for help</div>
      </div>
    </div>
    <div class="menu-item">Sweet-talk the alien aggressor</div>
    <div class="menu-item">Re-route power from auxiliary systems</div>
  </div>

</div>

එය ක්‍රියාත්මක වන්නේ කෙසේද?

ඇත්ත වශයෙන්ම මෙය සිදු කිරීම සඳහා සංක්‍රාන්ති දෙකක් සම්බන්ධ වේ. ඒවායින් එකක් margin-bottom0px (පුළුල් කළ තත්වයේ) සිට -2000pxබිඳ වැටුණු තත්වයට ( මෙම පිළිතුරට සමාන ) සංක්‍රමණය වේ. මෙහි 2000 යනු පළමු මැජික් අංකයයි, එය පදනම් වී ඇත්තේ ඔබේ කොටුව මීට වඩා වැඩි නොවනු ඇතැයි යන උපකල්පනය මත ය (පික්සල් 2000 සාධාරණ තේරීමක් සේ පෙනේ).

margin-bottomසංක්‍රාන්තිය තනිවම භාවිතා කිරීම ගැටළු දෙකක් ඇත:

  • ඔබ සතුව ඇත්ත වශයෙන්ම පික්සල් 2000 ට වඩා වැඩි පෙට්ටියක් තිබේ නම්, එවිට margin-bottom: -2000pxසියල්ල සැඟවිය නොහැක - කඩා වැටුණු නඩුවේදී පවා දෘශ්‍යමාන දේවල් තිබේ. මෙය සුළු විසඳුමක් වන අතර පසුව අපි එය කරන්නෙමු.
  • සත්‍ය පෙට්ටිය පික්සල් 1000 ක් උස නම් සහ ඔබේ සංක්‍රාන්තිය මීටර් 300 ක් දිග නම්, දෘශ්‍ය සංක්‍රාන්තිය මීටර 150 කට පමණ පසු දැනටමත් අවසන් වී ඇත (නැතහොත් ප්‍රතිවිරුද්ධ දිශාවට මීටර් 150 ක් ප්‍රමාද වී ආරම්භ වේ).

මෙම දෙවන ගැටළුව නිරාකරණය කිරීම යනු දෙවන සංක්‍රාන්තිය පැමිණෙන ස්ථානය වන අතර, මෙම සංක්‍රාන්තිය සංකල්පමය වශයෙන් එතුමගේ අවම උස ඉලක්ක කරයි (“සංකල්පමය වශයෙන්” අපි ඇත්ත වශයෙන්ම මේ min-heightසඳහා දේපල භාවිතා නොකරන නිසා ; පසුව වැඩි විස්තර).

පහළ ආන්තික සංක්‍රාන්තිය අවම උස සංක්‍රාන්තිය සමඟ සමාන කාල පරිච්ඡේදයක් සමඟ සංයෝජනය කරන්නේ කෙසේද යන්න පෙන්වන සජීවිකරණයක් මෙහි දැක්වේ, එකම කාල සීමාවක් ඇති සම්පූර්ණ උස සිට ශුන්‍ය උස දක්වා ඒකාබද්ධ සංක්‍රාන්තියක් අපට ලබා දෙයි.

ඉහත විස්තර කර ඇති පරිදි සජීවිකරණය

දෘශ්‍ය උස අඩු කරමින් negative ණ පහළ ආන්තිකය පහළට තල්ලු කරන ආකාරය වම් තීරුව පෙන්වයි. කඩා වැටෙන අවස්ථාවෙහිදී, සංක්‍රාන්තිය කලින් අවසන් නොවන බව අවම උස සහතික කරන ආකාරය මැද තීරුව පෙන්වයි. නිවැරදි තීරුව මඟින් දෙකෙහි සංයෝජනය නිවැරදි කාලය තුළ කොටුව සම්පූර්ණ උස සිට ශුන්‍ය උස දක්වා සංක්‍රමණය වීමට හේතු වන ආකාරය පෙන්වයි.

මගේ නිරූපණය සඳහා මම අවම අවම උස අගය ලෙස 50px මත පදිංචි වී සිටිමි. මෙය දෙවන මැජික් අංකය වන අතර එය කොටුවේ උස වෙන කවරදාටත් වඩා අඩු විය යුතුය. 50px ද සාධාරණ බව පෙනේ; මුලින්ම පික්සල් 50 ක්වත් නොඉක්මවන මූලද්‍රව්‍යයක් බිඳවැටීමට ඔබට බොහෝ විට අවශ්‍ය වනු ඇතැයි සිතිය නොහැක.

සජීවිකරණයේ ඔබට දැකිය හැකි පරිදි, එහි ප්‍රති trans ලයක් ලෙස සිදුවන සංක්‍රාන්තිය අඛණ්ඩව පවතී, නමුත් එය වෙනස් කළ නොහැක - අවම උස පහළ ආන්තිකය මඟින් සකස් කරන ලද සම්පූර්ණ උස හා සමාන වන මොහොතේ, වේගයේ හදිසි වෙනසක් දක්නට ලැබේ. සජීවිකරණයේ මෙය ඉතා කැපී පෙනෙන්නේ එය සංක්‍රාන්ති දෙකටම රේඛීය කාල ශ්‍රිතයක් භාවිතා කරන නිසා සහ සමස්ත සංක්‍රාන්තිය ඉතා මන්දගාමී බැවිනි. සත්‍ය අවස්ථාවේ දී (ඉහළින් මගේ නිරූපණය), සංක්‍රාන්තිය ගත වන්නේ මීටර් 300 ක් පමණක් වන අතර පහළ ආන්තික සංක්‍රාන්තිය රේඛීය නොවේ. සංක්‍රාන්ති දෙකටම මම විවිධ කාල නියමයන් සමඟ සෙල්ලම් කර ඇති අතර, මා විසින් අවසන් කරන ලද ඒවා පුළුල්ම විවිධාකාර අවස්ථාවන් සඳහා වඩාත්ම හොඳින් ක්‍රියා කළ බවක් මට හැඟුණි.

විසඳීමට ගැටළු දෙකක් ඉතිරිව ඇත:

  1. කඩා වැටුණු තත්වයේ පික්සල් 2000 ට වඩා උස පෙට්ටි සම්පූර්ණයෙන්ම සැඟවී නැති ඉහළ සිට ලක්ෂ්‍යය,
  2. සහ ප්‍රතිලෝම ගැටළුව, සැඟවී නොමැති අවස්ථාවක, සංක්‍රාන්තිය ක්‍රියාත්මක නොවන විට පවා පික්සල් 50 ට වඩා අඩු උසකින් යුත් පෙට්ටි වැඩිය, මන්ද අවම උස ඒවා පික්සල් 50 ක තබා ගනී.

max-height: 0බිඳවැටුණු නඩුවේ බහාලුම් මූලද්‍රව්‍යය 0s 0.3sසංක්‍රාන්තියකින් ලබා දීමෙන් අපි පළමු ගැටළුව විසඳන්නෙමු . මෙයින් අදහස් කරන්නේ එය සැබවින්ම සංක්‍රාන්තියක් නොවන නමුත් max-heightඑය ප්‍රමාදයකින් ක්‍රියාත්මක වන බවයි; එය අදාළ වන්නේ සංක්‍රාන්තිය අවසන් වූ පසු පමණි. මෙය නිවැරදිව ක්‍රියාත්මක වීමට නම්, max-heightප්‍රතිවිරුද්ධ, බිඳවැටෙන්නේ නැති, සංඛ්‍යා සඳහා සංඛ්‍යාවක් තෝරා ගත යුතුය . නමුත් 2000px නඩුවේදී මෙන් නොව, විශාල සංඛ්‍යාවක් තෝරාගැනීම සංක්‍රාන්තියේ ගුණාත්මක භාවයට බලපායි, මේ අවස්ථාවේ දී, එය ඇත්ත වශයෙන්ම වැදගත් නොවේ. ඒ නිසා අපට ඉතා ඉහළ සංඛ්‍යාවක් තෝරා ගත හැකි අතර කිසිදු උසකට මෙයට ළඟා නොවන බව අපි දනිමු . මම පික්සල් මිලියනයක් තෝරා ගත්තා. ඔබට පික්සල් මිලියනයකට වඩා උස අන්තර්ගතයකට සහාය වීමට අවශ්‍ය යැයි ඔබට හැඟේ නම්, 1) මට කණගාටුයි, සහ 2) ශුන්‍ය කිහිපයක් එක් කරන්න.

දෙවන ගැටළුව වන්නේ min-heightඅවම උස සංක්‍රාන්තිය සඳහා අප සැබවින්ම භාවිතා නොකිරීමට හේතුවයි . ඒ වෙනුවට, 50px සිට ශුන්‍යයට සංක්‍රමණය වන ::afterභාජනයක ව්‍යාජ මූලද්‍රව්‍යයක් ඇත height. මෙය සමාන බලපෑමක් ඇති කරයි min-height: එය දැනට පවතින ව්‍යාජ මූලද්‍රව්‍යයේ ඕනෑම උසකට වඩා බහාලුම් හැකිලීමට ඉඩ නොදේ. නමුත් අප භාවිතා කරන heightනිසා නොව min-height, max-heightසංක්‍රාන්තිය අවසන් වූ වහාම ව්‍යාජ මූලද්‍රව්‍යයේ සත්‍ය උස ශුන්‍යයට සැකසීමට (නැවත වරක් ප්‍රමාදයකින් යෙදිය හැකිය), අවම වශයෙන් සංක්‍රාන්තියෙන් පිටත වුවද කුඩා මූලද්‍රව්‍යයන් පවා ඇති බව සහතික කරයි. නිවැරදි උස. නිසා min-heightශක්තිමත් වඩා max-height, මේ අපි රුවනයකි ගේ භාවිතා නම් වැඩ නැහැ min-height, ඒ වෙනුවට, ව්යාජ-අංගයක් ගේheight. max-heightපෙර ඡේදයේ දී මෙන් , මෙය max-heightද සංක්‍රාන්තියේ ප්‍රතිවිරුද්ධ කෙළවර සඳහා අගයක් අවශ්‍ය වේ. නමුත් මේ අවස්ථාවේ දී අපට 50px තෝරා ගත හැකිය.

ක්‍රෝම් (වින්, මැක්, ඇන්ඩ්‍රොයිඩ්, අයිඑස්), ෆයර්ෆොක්ස් (වින්, මැක්, ඇන්ඩ්‍රොයිඩ්), එජ්, අයිඊ 11 (මා නිදොස්කරණයට කරදර නොකළ මගේ නිරූපණය සමඟ නම්‍යශීලි සැකැස්මක් හැර), සහ සෆාරි (මැක්, iOS ). නම්‍යශීලි කොටුව ගැන කතා කිරීම, කිසිදු නම්‍යශීලි පෙට්ටියක් භාවිතා නොකර මෙම කාර්යය කිරීමට හැකි විය යුතුය; ඇත්ත වශයෙන්ම මම හිතන්නේ ඔබට IE7 හි සෑම දෙයක්ම පාහේ ක්‍රියාත්මක කළ හැකිය - ඔබට CSS සංක්‍රාන්ති නොතිබීම හැර, එය අර්ථ විරහිත ව්‍යායාමයක් බවට පත් කරයි.


38
ඔබේ විසඳුම කෙටි කිරීමට (හෝ සරල කිරීමට) හෝ කේත උදාහරණය අවම වශයෙන් කිරීමට මම ප්‍රාර්ථනා කරමි - කේත උදාහරණයෙන් 90% ක් ඔබේ පිළිතුරට අදාළ නොවන බව පෙනේ.
ගිල් එප්ෂයින්

collapsible-wrapperතනතුරක් නිරපේක්ෂ නම් මෙම සංක්‍රාන්ති ද ක්‍රියාත්මක කිරීමට ක්‍රමයක් තිබේද? මෙම overflow: hiddenපරම ස්ථානගත මූලද්රව්ය සමග මාරුවීම නමුත් මැදිහත් සඳහා මව් මත අවශ්ය වේ.
pmkro

1
@pmkro ඔව්, මටත් ඒ ප්‍රශ්නය තිබුණා. මම එය විසඳුවේ ඒ clip-path: polygon(...)වෙනුවට භාවිතා කිරීමෙනි overflow: hidden, මන්දයත් දෙවැන්න මෙන් නොව ඔබට කලින් ඇති දේ සංක්‍රමණය කළ හැකිය. පැරණි බ්‍රව්සර් සඳහා පසුබෑමක් ලෙස මම අතිරේක පරිමාණ පරිවර්තනයක් භාවිතා කළෙමි. Github.com/StackExchange/Stacks/blob/develop/lib/css/components/…
balpha

2
හොඳයි. මෙය ඉතා හොඳින් ක්‍රියාත්මක වේ. පිළිගත් පිළිතුර විය යුතුය
හෙන්රි ඉන්ග්-සිමන්ස්

84

ඔබට අර්ථකථන නොවන ජිගරි-පොකරි ස්වල්පයක් සමඟ කළ හැකිය. මගේ සුපුරුදු ප්‍රවේශය වන්නේ තනි දරුවෙකු සිටින පිටත ඩීඅයිවී එකක උස සජීවීකරණය කිරීමයි. එය විලාසිතාවට වඩා අඩු ඩීඅයිවී අන්තර්ගතයේ උස මැනීම සඳහා පමණක් භාවිතා කරයි.

function growDiv() {
  var growDiv = document.getElementById('grow');
  if (growDiv.clientHeight) {
    growDiv.style.height = 0;
  } else {
    var wrapper = document.querySelector('.measuringWrapper');
    growDiv.style.height = wrapper.clientHeight + "px";
  }
}
#grow {
  -moz-transition: height .5s;
  -ms-transition: height .5s;
  -o-transition: height .5s;
  -webkit-transition: height .5s;
  transition: height .5s;
  height: 0;
  overflow: hidden;
  outline: 1px solid red;
}
<input type="button" onclick="growDiv()" value="grow">
<div id='grow'>
  <div class='measuringWrapper'>
    <div>
      The contents of my div.
    </div>
    <div>
      The contents of my div.
    </div>
    <div>
      The contents of my div.
    </div>
    <div>
      The contents of my div.
    </div>
    <div>
      The contents of my div.
    </div>
    <div>
      The contents of my div.
    </div>
  </div>
</div>

යමෙකු කැමති වන්නේ .measuringWrapperඩීඅයිවී හි උස ස්වයංක්‍රීයව සකසා එම සජීවිකරණය ලබා ගැනීමටය, නමුත් එය ක්‍රියා කරන බවක් නොපෙනේ (උස සකසා ඇත, නමුත් සජීවිකරණයක් සිදු නොවේ).

function growDiv() {
  var growDiv = document.getElementById('grow');
  if (growDiv.clientHeight) {
    growDiv.style.height = 0;
  } else {
    growDiv.style.height = 'auto';
  }
}
#grow {
  -moz-transition: height .5s;
  -ms-transition: height .5s;
  -o-transition: height .5s;
  -webkit-transition: height .5s;
  transition: height .5s;
  height: 0;
  overflow: hidden;
  outline: 1px solid red;
}
<input type="button" onclick="growDiv()" value="grow">
<div id='grow'>
  <div>
    The contents of my div.
  </div>
  <div>
    The contents of my div.
  </div>
  <div>
    The contents of my div.
  </div>
  <div>
    The contents of my div.
  </div>
  <div>
    The contents of my div.
  </div>
  <div>
    The contents of my div.
  </div>
</div>

මගේ අර්ථ නිරූපණය නම් සජීවිකරණය ක්‍රියාත්මක වීමට පැහැදිලි උසකි. උස (ආරම්භක හෝ අවසාන උස) වන විට ඔබට උස පිළිබඳ සජීවීකරණයක් ලබා ගත නොහැක auto.


10
මෙය ජාවාස්ක්‍රිප්ට් මත රඳා පවතින බැවින්, ඔබට පහසුවෙන් ජාවාස්ක්‍රිප්ට් භාවිතයෙන් මිනුම් රැපර් ද එක් කළ හැකිය!
Quickredfox

18
ඔබට එය එතීමෙන් තොරව කළ හැකිය. හුදෙක්: ශ්‍රිතය growDiv () grow var growDiv = document.getElementById ('grow'); if (growDiv.clientHeight) {growDiv.style.height = 0; } else {growDiv.style.height = growDiv.scrollHeight + 'px'; }}
user1742529

8
මෙය පරීක්ෂා කරන්න ... සරල පිළිතුරක් ගැන කතා කරන්න jsfiddle.net/n5XfG/2596 ... හොඳ හේතුවක් නොමැතිව ඔබේ පිළිතුර ඉතා සංකීර්ණ ය. අවශ්ය නෑ max-height, කිසිදු අවශ්යතාවයක් auto, හා විශේෂයෙන් ජාවාස්ක්රිප්ට් කිසිදු අවශ්යතාවක් !! සරල ප්‍රකාශ දෙකක් පමණි
VIDesignz

12
IDVIDesignz ඔබ ආන්තිකය ඉක්මවා සජීවීකරණය කරයි: 100%. මෙය මූලද්‍රව්‍යයේ පළලින් 100% ක් මිස එහි උස නොවේ! මෙයින් අදහස් කරන්නේ, ඔබට එහි පළලට වඩා විශාල උසකින් යුත් මූලද්‍රව්‍යයක් තිබේ නම්, මෙය සැඟවිය නොහැකි බවයි. එසේම, සැබෑ සජීවිකරණ වේගය අර්ථ දක්වා ඇති වේගයට වඩා සම්පූර්ණයෙන්ම වෙනස් ය.
ටිමෝ ටර්ෂ්මන්

3
ටිමෝගේ අදහස් දැක්වීම ගැන වැඩිදුර කියවන තෙක් VIDesignz ගේ පිළිතුර ගැන මම සතුටට පත් වීමි. ඔව්, margin-top(සහ margin-bottom) ප්‍රතිශත වලින් අර්ථ දැක්වීමේදී පළලට සාපේක්ෂ වේ, ඔව් එය මෝඩය, නමුත් විවෘත හා සමීප සජීවිකරණ වේලාවන් සම්පූර්ණයෙන්ම වෙනස් වන්නේ ඇයිද යන්නත් එය පැහැදිලි කරයි - ඉහළ ශ්‍රේණිගත කළ පිළිතුරේ ඔබ දකින දේම, දෘඩයක් නියම කරයි -කෝඩ් කරන ලද උපරිම උස. හරි දේ කිරීමට මෙය එතරම් අපහසු ඇයි?
කෝඩරර්

52

CSS3 සංක්‍රාන්ති භාවිතා කරමින් උස සජීවිකරණය කිරීම සඳහා දෘශ්‍ය විසඳුමක් වන්නේ ඒ වෙනුවට පෑඩින් සජීවිකරණය කිරීමයි.

ඔබට සම්පූර්ණ පිසදැමීමේ බලපෑම ලැබෙන්නේ නැත, නමුත් සංක්‍රාන්ති-කාලසීමාව සහ පෑඩින් අගයන් සමඟ සෙල්ලම් කිරීමෙන් ඔබට ප්‍රමාණවත් තරම් සමීප විය යුතුය. ඔබට උස / උපරිම උස පැහැදිලිව සැකසීමට අවශ්‍ය නැතිනම්, ඔබ සොයන දේ මෙය විය යුතුය.

div {
    height: 0;
    overflow: hidden;
    padding: 0 18px;
    -webkit-transition: all .5s ease;
       -moz-transition: all .5s ease;
            transition: all .5s ease;
}
div.animated {
    height: auto;
    padding: 24px 18px;
}

http://jsfiddle.net/catharsis/n5XfG/17/ (ස්ටෙප්බෑන්ඩ් හි ඉහත jsFiddle ඉවත් කර ඇත)


3
මම හිතන්නේ මෙය හොඳම පිළිතුරයි. මෙම තාක්ෂණය ළමයින්ට පෑඩින් සකස් කිරීම දක්වා විහිදිය හැකිය. මගේ නඩුවේදී, අනාවරණය වන සමහර අන්තර්ගතයන් පිළිබඳ පැහැදිලි උස සංක්‍රාන්ති සමඟ එය ඒකාබද්ධ කිරීමට මට හැකි වූ අතර, සම්පූර්ණ බලපෑම උපරිම උස වැඩ කිරීමට වඩා සාර්ථක වන අතර, එය හෙළිදරව් කිරීම සඳහා කදිම නමුත් අමුතු මොහොතක් හඳුන්වා දෙයි සැඟවීමට ප්‍රමාද වීම. මගේ යෙදුම ප්‍රතිචාර නොදක්වන බවක් පෙන්වන අර්ථ විරහිත ප්‍රමාදයක් හඳුන්වා දීමට වඩා මම ඉක්මනින් සජීවීකරණය නොකරමි. බොහෝ අය එය පිළිගත හැකි යැයි සිතන බව මට පුදුමයි.
අර්ධ සළකුණ

18
මෙහි හැර ඔබ මෙහි කිසිසේත්ම උස සජීවීකරණය නොකරයි. ඔබ පෑඩින් සජීවිකරණය කරමින් සිටී ... එය වර්තමාන තත්වයේ සිට 0 දක්වා සජීවීකරණය කළ හැකි නිසා එය හොඳින් අතුරුදහන් විය හැකිය, නමුත් එය පුළුල් වන විට ඔබ සමීපව බැලුවහොත් එය පෙළ සමඟ විවෘත වන අතර පසුව පෑඩින් පමණක් සජීවීකරණය කරයි .. 0 සිට ස්වයංක්‍රීයව සජීවීකරණය කරන්නේ කෙසේදැයි නොදනී .... එයට සංඛ්‍යාත්මක පරාසයක් අවශ්‍යය ... එයයි.
රොබ් ආර්

මෙය හොඳ වැඩක් නොවේ. එය මෙම ප්‍රශ්නයට හොඳම පිළිතුර නොවේ , නමුත් එය මට වැඩ කළ විකල්පයකි. සමහර විට ඔබට අවශ්‍ය වන්නේ උස සජීවිකරණයේ බලපෑම මිස සම්පූර්ණ සජීවිකරණය නොවේ :)
අයිවන් ඩර්ස්ට්

සංක්‍රාන්ති ප්‍රමාදයක් භාවිතා කිරීමේදී මෙම විසඳුම ද අසමත් වේ.
මයිකල් ජොනීස්

මෙම විසඳුම ඔබේ සජීවිකරණය ප්‍රමාණවත් තරම් වේගවත් නම් තරල සංක්‍රාන්තියක් ලබා දෙන පිරිසිදු විසඳුමක් බව මම එකඟ වෙමි (මගේ නඩුවේ 0.1s සංක්‍රාන්තිය සමඟ ඇකෝනියන් සඳහා එය පරිපූර්ණයි!). එය බොහෝ යෙදුම් වලට ගැලපෙන්නේ නැත, නමුත් අනෙක් අයද මෙම ප්‍රශ්නයට පිළිතුරු සපයන්නේ නැත!
රෙමී ඩී

46

මගේ කාර්යය වන්නේ හොඳ සුමට සජීවීකරණයක් සඳහා උපරිම උස නිශ්චිත අන්තර්ගත උසකට මාරුවීමයි, ඉන්පසු සංක්‍රාන්ති සහ ඇමතුමක් භාවිතා කර උපරිම උස 9999px ලෙස සැකසීම මඟින් අන්තර්ගතයට නිදහසේ ප්‍රමාණය වෙනස් කළ හැකිය.

var content = $('#content');
content.inner = $('#content .inner'); // inner div needed to get size of content when closed

// css transition callback
content.on('transitionEnd webkitTransitionEnd transitionend oTransitionEnd msTransitionEnd', function(e){
    if(content.hasClass('open')){
        content.css('max-height', 9999); // try setting this to 'none'... I dare you!
    }
});

$('#toggle').on('click', function(e){
    content.toggleClass('open closed');
    content.contentHeight = content.outerHeight();
    
    if(content.hasClass('closed')){
        
        // disable transitions & set max-height to content height
        content.removeClass('transitions').css('max-height', content.contentHeight);
        setTimeout(function(){
            
            // enable & start transition
            content.addClass('transitions').css({
                'max-height': 0,
                'opacity': 0
            });
            
        }, 10); // 10ms timeout is the secret ingredient for disabling/enabling transitions
        // chrome only needs 1ms but FF needs ~10ms or it chokes on the first animation for some reason
        
    }else if(content.hasClass('open')){  
        
        content.contentHeight += content.inner.outerHeight(); // if closed, add inner height to content height
        content.css({
            'max-height': content.contentHeight,
            'opacity': 1
        });
        
    }
});
.transitions {
    transition: all 0.5s ease-in-out;
    -webkit-transition: all 0.5s ease-in-out;
    -moz-transition: all 0.5s ease-in-out;
}

body {
    font-family:Arial;
    line-height: 3ex;
}
code {
    display: inline-block;
    background: #fafafa;
    padding: 0 1ex;
}
#toggle {
    display:block;
    padding:10px;
    margin:10px auto;
    text-align:center;
    width:30ex;
}
#content {
    overflow:hidden;
    margin:10px;
    border:1px solid #666;
    background:#efefef;
    opacity:1;
}
#content .inner {
    padding:10px;
    overflow:auto;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<div id="content" class="open">
    <div class="inner">
        <h3>Smooth CSS Transitions Between <code>height: 0</code> and <code>height: auto</code></h3>
        <p>A clever workaround is to use <code>max-height</code> instead of <code>height</code>, and set it to something bigger than your content. Problem is the browser uses this value to calculate transition duration. So if you set it to <code>max-height: 1000px</code> but the content is only 100px high, the animation will be 10x too fast.</p>
        <p>Another option is to measure the content height with JS and transition to that fixed value, but then you have to keep track of the content and manually resize it if it changes.</p>
        <p>This solution is a hybrid of the two - transition to the measured content height, then set it to <code>max-height: 9999px</code> after the transition for fluid content sizing.</p>
    </div>
</div>

<br />

<button id="toggle">Challenge Accepted!</button>


14
@ Derija93 එය භාවිතා කරන්නේ සරල පැරණි ජාවාස්ක්‍රිප්ට් කල් ඉකුත් වූ සජීවිකරණයි. අභියෝගය වන්නේ ඒ වෙනුවට CSS3 සංක්‍රාන්ති භාවිතා කිරීමයි.
ඇඩම්

3
ඔව් හොදයි. ඔබේ උදාහරණයේ දී, දැනටමත් jQuery, පුස්තකාලයක් භාවිතා කරන්නේ නම්, "අඩුවෙන් ලිවීමට, වැඩි යමක් කරන්න" කේතයක් ලබා දෙන්නේ නම්, "ඒ වෙනුවට CSS3 සංක්‍රාන්ති" භාවිතා කරන්නේ ඇයි? ඔබේ අනුවාදය වඩා සංකීර්ණ වුවත්, එය jQuery භාවිතා නොකරන්නේ නම් එය ඕනෑම වෙබ් අඩවියක පාහේ ක්‍රියාත්මක විය හැකි බව පෙන්වා දීමට මට අවශ්‍ය විය. මම හිතන්නේ මම එය තදින්ම වැරදියි. කණගාටුයි. ;)
කිරූස්

27
Er Derija93 සමහර විට CSS3 සංක්‍රාන්ති වලට (සියලු ප්‍රභවයන්ට අනුව) jQuery සජීවිකරණවලට වඩා හොඳ කාර්ය සාධනයක් ඇති නිසා විය හැකිය. (ඇත්තටම මට මෙහි ගෙන එන මගේ දැනට භාවිතා නඩුව සඳහා දැවැන්ත වැදගත්.)
මාර්ක් එමරි

4
@ Derija93 'Cass3 සංක්‍රාන්ති සහෝදරයන්ට සාපේක්ෂව ජාවාස්ක්‍රිප්ට් සජීවිකරණ සෙමින් ක්‍රියාත්මක වන අතර jQuery සජීවිකරණ සමඟ සජීවිකරණ ලූපය ගැන කරදර විය යුතුය. ක්ලික් කිරීම මත යමක් සජීවීකරණය කරන්න, පසුව වේගයෙන් ක්ලික් කර සජීවිකරණ නැවත නැවත සිදුවන විට නරඹන්න. මෙය CSS3 සමඟ හසුරුවනු ලැබේ.
ඇල්බට් එන්ගල්බී

2
Rop Dropped.on.Caprica මෙය දැන් ටිකක් පරණයි. ඔහු නිරූපණය කිරීමට උත්සාහ කරන සංකල්පය මම වරදවා වටහාගෙන ඇති බව මම දැනටමත් කීවෙමි. කෙසේ වෙතත්, සරල සජීවිකරණ .stopසඳහා, තරමක් සංකීර්ණ සජීවිකරණ ලූප් ගැටළුව සඳහා උපක්‍රමය කරයි. දැන් ඔබ උස හා වර්ණය සජීවිකරණය කළ නමුත් උස සජීවිකරණයට පමණක් බාධා කිරීමට කැමති විට, දේවල් ටිකක් උපක්‍රමශීලී වේ ... මට ඔබේ අදහස වැටහේ.
කිරූස්

44

පිළිගත් පිළිතුර බොහෝ අවස්ථාවන් සඳහා ක්‍රියා කරයි, නමුත් ඔබේ divඋසෙහි විශාල වශයෙන් වෙනස් විය හැකි විට එය හොඳින් ක්‍රියා නොකරයි - සජීවිකරණ වේගය අන්තර්ගතයේ සැබෑ උස මත රඳා නොපවතින අතර එය චොප්සි ලෙස පෙනේ.

ඔබට තවමත් CSS සමඟ සත්‍ය සජීවිකරණය කළ හැකිය, නමුත් භාවිතා කිරීමට උත්සාහ කරනවා වෙනුවට අයිතමවල උස ගණනය කිරීමට ඔබට JavaScript භාවිතා කළ autoයුතුය. ඔබට අනුකූලතාවයක් අවශ්‍ය නම් මෙය ටිකක් වෙනස් කිරීමට සිදු වුවද, jQuery අවශ්‍ය නොවේ (Chrome හි නවතම අනුවාදයේ ක්‍රියා කරයි :)).

window.toggleExpand = function(element) {
    if (!element.style.height || element.style.height == '0px') { 
        element.style.height = Array.prototype.reduce.call(element.childNodes, function(p, c) {return p + (c.offsetHeight || 0);}, 0) + 'px';
    } else {
        element.style.height = '0px';
    }
}
#menu #list {
    height: 0px;
    transition: height 0.3s ease;
    background: #d5d5d5;
    overflow: hidden;
}
<div id="menu">
    <input value="Toggle list" type="button" onclick="toggleExpand(document.getElementById('list'));">
    <ul id="list">
        <!-- Works well with dynamically-sized content. -->
        <li>item</li>
        <li><div style="height: 100px; width: 100px; background: red;"></div></li>
        <li>item</li>
        <li>item</li>
        <li>item</li>
    </ul>
</div>


මෙය ප්‍රයෝජනවත් විය හැකි නමුත් වඩා හොඳ උදාහරණයකින් තොරව එය භාවිතා කරන්නේ කෙසේදැයි මා නොදන්නා නිසා මට කිව නොහැක.
අයිවන් ඩර්ස්ට්

1
ඔබ ඕනෑම DOM මූලද්‍රව්‍යයකින් සමත් වේ (නිදසුනක් ලෙස, සිට document.getElementById('mydiv')හෝ $('#mydiv').get()), සහ ශ්‍රිතය එය සැඟවීම / පෙන්වීම අතර ටොගල් කරයි. ඔබ CSS සංක්‍රාන්ති සකසන්නේ නම්, මූලද්‍රව්‍යය ස්වයංක්‍රීයව සජීවීකරණය වේ.
ඔලෙග් වස්කෙවිච්

මම ස්නිපටයක් එකතු කළා. ගතික ප්‍රමාණයේ අන්තර්ගතයන් සඳහා හොඳින් වැඩ කිරීමේ වාසිය මෙයයි.
ඔලෙග් වස්කෙවිච්

3
-1, මෙය "CSS භාවිතා කිරීම" නොවන නිසා. ප්රශ්නයේ කාරණය JS රහිත විසඳුමක් සඳහා ය. මම හිතන්නේ "නිවැරදි" පිළිතුර, එය
කඩුල්ලක් නොවේ

18
JS භාවිතා කිරීම සඳහා පහත හෙලීම - බැරෑරුම් ලෙස? මෙහි පිළිතුරු වලින් අඩක් JS භාවිතා කරයි, එබැවින් ඔබගේ පහත් අගය සාධාරණ හෝ අවශ්‍ය නොවන බව පෙනේ. මීට අමතරව, මෙම පිළිතුර තථ්‍ය සජීවිකරණය සිදු කිරීම සඳහා තවමත් CSS භාවිතා කරයි. JS සඳහා භාවිතා කරන එකම දෙය වන්නේ නියම උස ගණනය කිරීමයි, මන්ද පිරිසිදු CSS සමඟ එය කළ නොහැකි බැවිනි (සහ min-heightඅපේක්ෂිත පිළිතුරෙහි සැකසීම ලැයිස්තුවේ ප්‍රමාණය විශාල ලෙස වෙනස් විය හැකි විට සජීවිකරණ වේගය සමඟ ගැටලු ඇති කරයි).
ඔලෙග් වස්කෙවිච්

30

දෘඩ කේත කළ අගයන් නොමැත.

JavaScript නැත.

ආසන්න කිරීම් නොමැත.

උපක්‍රමය නම් div100% යන්නෙන් අදහස් කරන්නේ කුමක්ද යන්න බ්‍රව්සරයට අවබෝධ කර ගැනීම සඳහා සැඟවුණු හා අනුපිටපත් භාවිතා කිරීමයි.

ඔබ සජීවිකරණය කිරීමට බලාපොරොත්තු වන මූලද්‍රව්‍යයේ DOM අනුපිටපත් කිරීමට ඔබට හැකි සෑම විටම මෙම ක්‍රමය සුදුසු වේ.

.outer {
  border: dashed red 1px;
  position: relative;
}

.dummy {
  visibility: hidden;
}

.real {
  position: absolute;
  background: yellow;
  height: 0;
  transition: height 0.5s;
  overflow: hidden;
}

.outer:hover>.real {
  height: 100%;
}
Hover over the box below:
<div class="outer">
  <!-- The actual element that you'd like to animate -->
  <div class="real">
unpredictable content unpredictable content unpredictable content unpredictable content unpredictable content unpredictable content unpredictable content unpredictable content unpredictable content unpredictable content unpredictable content unpredictable
content unpredictable content unpredictable content unpredictable content
  </div>
  <!-- An exact copy of the element you'd like to animate. -->
  <div class="dummy" aria-hidden="true">
unpredictable content unpredictable content unpredictable content unpredictable content unpredictable content unpredictable content unpredictable content unpredictable content unpredictable content unpredictable content unpredictable content unpredictable
content unpredictable content unpredictable content unpredictable content
  </div>
</div>


හොඳින් සිදු කර ඇත - මෙය සැබවින්ම නොපවතින ගැටලුවකට වලංගු විසඳුමකි. සංක්‍රාන්තිය “රේඛීය” ලෙස සකසා නොමැති නම් උපරිම උස සජිවිකරණය කිරීම මූලික වේ, උස විචල්‍ය වන CMS අන්තර්ගතය සජීවිකරණය කිරීම සඳහා ද එය පැහැදිලිවම නරක ය.
M_Willett

මෙය දක්ෂයි, නමුත් මේ සඳහා DOM මූලද්‍රව්‍ය සහ අන්තර්ගතය අනුපිටපත් කිරීම මට පහසු නොවනු ඇත.
ඇන්ඩ්‍රේ ෆිගියිරෙඩෝ

ඔබට මෙම භාජනයකින් තොරව කළ හැකි අතර සජීවිකරණය කිරීමෙන් වඩාත් ක්‍රියාකාරී වේ transform: scaleY(1), මන්ද මෙම සංක්‍රාන්තිය අවකාශය ඉවත් නොකරයි.
ෆේබියන් වොන් එලර්ට්ස්

30

මෙහි Element.scrollHeightප්‍රයෝජනවත් විය හැකි දේපල ගැන එතරම් සඳහනක් නොතිබූ අතර තවමත් පිරිසිදු CSS සංක්‍රාන්තියක් සමඟ භාවිතා කළ හැකිය. බිඳ වැටුණු උසක ප්‍රති (ලයක් ලෙස (උදා height: 0) එහි අන්තර්ගතය පිටාර ගැලන්නේද සහ කෙසේද යන්න නොසලකා දේපලෙහි සෑම විටම මූලද්‍රව්‍යයක “සම්පූර්ණ” උස අඩංගු වේ .

එනිසා height: 0(effectively ලදායී ලෙස සම්පූර්ණයෙන්ම බිඳ වැටුණු) මූලද්‍රව්‍යයක් සඳහා, එහි “සාමාන්‍ය” හෝ “පූර්ණ” උස තවමත් එහි scrollHeightවටිනාකම හරහා පහසුවෙන් ලබාගත හැකිය (නොවරදවාම පික්සල් දිග).

එවැනි මූලද්‍රව්‍යයක් සඳහා, එය දැනටමත් සංක්‍රාන්තිය උදා ulලෙස සකසා ඇති බව උපකල්පනය කිරීම ( මුල් ප්‍රශ්නයට අනුව භාවිතා කිරීම ):

ul {
    height: 0;
    transition: height 1s; /* An example transition. */
}

පහත දැක්වෙන දේ වැනි දෙයක් සමඟ අපට CSS පමණක් භාවිතා කරමින් අපේක්ෂිත සජීවිකරණ "ප්‍රසාරණය" අවුලුවාලිය හැකිය (මෙහි ulවිචල්‍යය උපකල්පනය කරන්නේ ලැයිස්තුවට යැයි සිතමු):

ul.style.height = ul.scrollHeight + "px";

ඒක තමයි. ඔබට ලැයිස්තුව බිඳ දැමීමට අවශ්‍ය නම්, පහත සඳහන් ප්‍රකාශ දෙකෙන් එකක් හෝ කරනු ඇත:

ul.style.height = "0";
ul.style.removeProperty("height");

මගේ විශේෂිත භාවිත නඩුව නොදන්නා සහ බොහෝ විට සැලකිය යුතු දිගකින් යුත් සජීවීකරණ ලැයිස්තු වටා කැරකෙන අතර, ඒ නිසා අත්තනෝමතික “ප්‍රමාණවත් තරම් විශාල” heightහෝ max-heightපිරිවිතරයන් මත නිරවුල් කිරීම සහ ඔබට හදිසියේ අනුචලනය කිරීමට අවශ්‍ය වන කපා හැරීමේ අන්තර්ගතය හෝ අන්තර්ගතය අවදානමට ලක් කිරීම මට පහසු නොවීය ( overflow: autoඋදාහරණයක් ලෙස නම්) . මීට අමතරව, ලිහිල් කිරීම සහ වේලාව max-heightපදනම් කරගත් විසඳුම් සමඟ කැඩී ඇත , මන්ද භාවිතා කළ උස එහි උපරිම අගය කරා ළඟා වීමට වඩා ඉක්මනින් max-heightළඟා විය හැකි 9999pxබැවිනි. තිර විභේදනය වැඩි වන විට පික්සල් දිග 9999pxමගේ මුඛයේ නරක රසයක් ඉතිරි කරයි. මෙම විශේෂිත විසඳුම ගැටළුව අලංකාර ලෙස විසඳන බව මගේ මතයයි.

අවසාන වශයෙන්, සීඑස්එස් ලිපින කතුවරුන්ගේ අනාගත සංශෝධනයන් මෙවැනි දේ වඩාත් අලංකාර ලෙස කළ යුතු යැයි මෙහිදී බලාපොරොත්තු වේ - “ගණනය කළ” එදිරිව ”භාවිතා කළ” සහ “විසඳූ” අගයන් පිළිබඳ සංකල්පය නැවත සලකා බලන්න, සහ සංක්‍රාන්තිය ගණනය කළ යුතුද යන්න සලකා බලන්න. widthසහ සමඟ සංක්‍රාන්ති ඇතුළුව අගයන් height(දැනට විශේෂ ප්‍රතිකාරයක් ලබා ගනී).


6
Element.scrollHeightදේපල භාවිතා කරමින් DOM සමඟ අන්තර් ක්‍රියා කිරීමට ජාවාස්ක්‍රිප්ට් අවශ්‍ය වන නිසාත්, ප්‍රශ්නයේ පැහැදිලිව සඳහන් වන පරිදි ඔවුන්ට ජාවාස්ක්‍රිප්ට් නොමැතිව මෙය කිරීමට අවශ්‍ය නිසාත් මෙහි වෙනත් පිළිතුරු වලින් ඔබ එය සොයා ගත්තේ නැත .
ටයිලර් එච්

3
මෙම ගැටළුව විසඳිය හැකි ව්‍යාජ පංති දෙක හැරුණු විට CSS හි තවත් කොටස් රාශියක් ඇත, 1 වන පිටුවේ ඉහළින්ම උත්තර දුන් පිළිතුරු පෙන්නුම් කරයි. ජාවාස්ක්‍රිප්ට් හි ශෛලියක් සැකසීම "පිරිසිදු CSS" නොවේ, මන්ද එයට JS මුලින් සැකසිය යුතුය. බොහෝ විට පුද්ගලයෙකු CSS පමණක් විසඳුමක් ඉල්ලා සිටින විට, එයට හේතුව ඔවුන්ට කිසිදු ජාවාස්ක්‍රිප්ට් එකක් එන්නත් කිරීමට නොහැකි වීම හෝ ඔවුන්ගේ වර්තමාන ව්‍යාපෘතිය හෝ භූමිකාව අනුව එයට ඉඩ නොදීමයි.
ටයිලර් එච්

29

max-heightඑක් එක් රාජ්ය සඳහා විවිධ සංක්රමණ ලිහිල් කිරීම සහ ප්රමාදය සමඟ භාවිතා කරන්න .

HTML:

<a href="#" id="trigger">Hover</a>
<ul id="toggled">
    <li>One</li>
    <li>Two</li>
    <li>Three</li>
<ul>

CSS:

#toggled{
    max-height: 0px;
    transition: max-height .8s cubic-bezier(0, 1, 0, 1) -.1s;
}

#trigger:hover + #toggled{
    max-height: 9999px;
    transition-timing-function: cubic-bezier(0.5, 0, 1, 0); 
    transition-delay: 0s;
}

උදාහරණය බලන්න: http://jsfiddle.net/0hnjehjc/1/


12
මෙහි ඇති ගැටළුව නම්, ඔබට ගතික පරිසරයක ප්‍රමාණවත් ඉඩ ප්‍රමාණයක් ඇති බව සහතික කිරීම සඳහා, ඔබ වැනි හාස්‍යජනක උපරිම උස භාවිතා කළ 999999pxයුතුය. මෙය අනෙක් අතට, ඔබේ සජීවිකරණය වෙනස් කරනු ඇත, මන්ද රාමු මෙම අගයෙන් ගණනය කරනු ලැබේ. එබැවින් ඔබට එක් දිශාවකට සජීවීකරණ "ප්‍රමාදය" සහ අනෙක් දිශාවට ඉතා වේගවත් අවසානයක් ලබා දිය හැකිය (corr: time-functions)
ජූලියන් එෆ්. වයිනර්ට්

21

මා මෙය පළ කරන විට දැනටමත් පිළිතුරු 30 කට වඩා ඇත, නමුත් ජේක් විසින් දැනටමත් පිළිගත් පිළිතුර මත මගේ පිළිතුර වැඩිදියුණු වන බව මට හැඟේ .

මම හුදෙක් භාවිතා පැන නගින ප්රශ්නය සෑහීමට නොවන max-heightබොහෝ commenters සඳහන් කර ඇති පරිදි, ඔබ ඔබේ නියම කිරීමට ඇති බැවින්, සංක්රමණයන් සහ CSS3 max-heightඉතා සමීප සැබෑ උස අගය හෝ ඔබ ප්රමාද කරන්නම්. එම ගැටලුවට උදාහරණයක් සඳහා මෙම JSFiddle බලන්න .

මෙය වළක්වා ගැනීම සඳහා (තවමත් ජාවාස්ක්‍රිප්ට් භාවිතා නොකරන අතර), මම transform: translateYCSS අගය සංක්‍රමණය කරන තවත් HTML අංගයක් එක් කළෙමි .

මෙම අදහස් දෙක max-heightහා translateYභාවිතා වේ: max-heightඅතර, එම මූලද්රව්යය එය පහත අංග පහලට තල්ලු කිරීමට ඉඩ translateYඅපි අවශ්ය "ක්ෂණික" බලපෑමක් ලබා දෙයි. ගැටලුව max-heightතවමත් පවතී, නමුත් එහි බලපෑම අඩු වේ. මෙයින් අදහස් කරන්නේ ඔබට ඔබේ max-heightවටිනාකමට වඩා විශාල උසක් සැකසිය හැකි අතර ඒ ගැන අඩුවෙන් කරදර වන්න.

සමස්ත වාසිය නම්, නැවත මාරුවීමේදී (බිඳවැටීම), පරිශීලකයා translateYසජීවිකරණය වහාම දකින නිසා , කොපමණ කාලයක් ගතවේද යන්න ගැටළුවක් නොවේ max-height.

ෆිදෙල් ලෙස විසඳුම

body {
  font-family: sans-serif;
}

.toggle {
  position: relative;
  border: 2px solid #333;
  border-radius: 3px;
  margin: 5px;
  width: 200px;
}

.toggle-header {
  margin: 0;
  padding: 10px;
  background-color: #333;
  color: white;
  text-align: center;
  cursor: pointer;
}

.toggle-height {
  background-color: tomato;
  overflow: hidden;
  transition: max-height .6s ease;
  max-height: 0;
}

.toggle:hover .toggle-height {
  max-height: 1000px;
}

.toggle-transform {
  padding: 5px;
  color: white;
  transition: transform .4s ease;
  transform: translateY(-100%);
}

.toggle:hover .toggle-transform {
  transform: translateY(0);
}
<div class="toggle">
  <div class="toggle-header">
    Toggle!
  </div>
  <div class="toggle-height">
    <div class="toggle-transform">
      <p>Content!</p>
      <p>Content!</p>
      <p>Content!</p>
      <p>Content!</p>
    </div>
  </div>
</div>

<div class="toggle">
  <div class="toggle-header">
    Toggle!
  </div>
  <div class="toggle-height">
    <div class="toggle-transform">
      <p>Content!</p>
      <p>Content!</p>
      <p>Content!</p>
      <p>Content!</p>
    </div>
  </div>
</div>


සැසඳීම av ඩේවිඩ්ටබ්මන්, ඔබේ පෑනෙහි වෙනස්කම් ඉතා හොඳින් විදහා දක්වයි! මම සමඟ ගොස් translateYකට scaleමම කොහොමද කැමති වුණේ නැහැ නිසා scaleබව සම්පීඩන ක්රියාත්මක දුන්නේය.
මෙසියර්

ස්තූතියි @ ඇන්ඩ rew-මෙසියර්, වැරැද්දක් ඇති නිසා මම එම අදහස මකා දැමුවෙමි, පරිවර්තනය කරන්න codepen.io/davidtaubmann/pen/zKZvGP හි කැපී පෙනෙන්නේ නැත (එම පියවර ගැනීමට දරුවෙකු නොමැති නිසා, නිවැරදි කිරීමක් අවශ්‍යයි) ... නමුත් මෙහි එකක් පමණක් මැක්ස්-හයිට් වෙතින් සංසන්දනය කර එය පරිමාණයෙන් මිශ්‍ර කිරීම (වෙනත් පිළිතුරු වල සඳහන් පරිදි): codepen.io/davidtaubmann/pen/jrdPER . මේ සියල්ල මා භාවිතා කරන ඉලක්ක ක්‍රමවේදය සමඟ බොහෝ සෙයින් උපකාරී විය
ඩේවිඩ් ටෝබ්මන්

18

හරි, ඉතින් මම හිතන්නේ මම ඉතා සරල පිළිතුරක් ඉදිරිපත් කළා ... නැත max-height, relativeස්ථානගත කිරීම භාවිතා කරයි , liමූලද්‍රව්‍ය මත ක්‍රියා කරයි , සහ පිරිසිදු CSS වේ. මම ෆයර්ෆොක්ස් හැර වෙනත් කිසිවක් අත්හදා බලා නැත, CSS විසින් විනිශ්චය කළද, එය සියලු බ්‍රව්සර් මත ක්‍රියා කළ යුතුය.

FIDDLE: http://jsfiddle.net/n5XfG/2596/

CSS

.wrap { overflow:hidden; }

.inner {
            margin-top:-100%;
    -webkit-transition:margin-top 500ms;
            transition:margin-top 500ms;
}

.inner.open { margin-top:0px; }

HTML

<div class="wrap">
    <div class="inner">Some Cool Content</div>
</div>

13
මූලද්රව්යයේ උස එහි පළල ඉක්මවන තෙක් මෙය ක්රියා කරයි. ප්‍රතිශත භාවිතා කරමින් ආන්තිකයන් ගණනය කරන ආකාරයෙහි පදනම එයයි: ඒවා ගණනය කරනු ලබන්නේ මූලද්‍රව්‍යයේ පළල අනුව ය. එබැවින් ඔබට 1000 px පළල මූලද්‍රව්‍යයක් තිබේ නම්, 1100 px හි මූලද්‍රව්‍යයක් මෙම විසඳුම වැඩ කිරීමට නොහැකි තරම් විශාල වනු ඇත, එයින් අදහස් වන්නේ ඔබට එම negative ණ ඉහළ ආන්තිකය වැඩි කළ යුතු බවයි. මූලික වශයෙන්, උස හෝ උපරිම උස භාවිතා කිරීම හරියටම එකම ගැටළුවයි.
dudewad

15

සංස්කරණය කරන්න: යාවත්කාලීන කළ පිළිතුර සඳහා පහළට අනුචලනය කරන්න
මම පතන ලැයිස්තුවක් සාදා මෙම පෝස්ට් එක දුටුවෙමි ... විවිධ පිළිතුරු නමුත් මගේ පතන ලැයිස්තුවද බෙදා ගැනීමට මම තීරණය කරමි, ... එය පරිපූර්ණ නොවේ නමුත් අවම වශයෙන් එය භාවිතා කරන්නේ css සඳහා පමණි පතන! ලැයිස්තුව පරිවර්තනයට පරිවර්තනය කිරීම සඳහා මම ට්‍රාන්ස්ෆෝමර්: ට්‍රාන්ස්ලේට් වයි (වයි) භාවිතා කර ඇත ...
ඔබට පරීක්ෂණයෙන් තවත් දැක ගත හැකිය
http://jsfiddle.net/BVEpc/4/
මම සෑම ලයි එකකටම පිටුපසින් සිටින්නේ මගේ නිසා පතන ලැයිස්තුව ඉහළ සිට එන අතර ඒවා නිසි ලෙස පෙන්වීමට මෙය අවශ්‍ය විය, මගේ div කේතය:

#menu div {
    transition: 0.5s 1s;
    z-index:-1;
    -webkit-transform:translateY(-100%);
    -webkit-transform-origin: top;
}

සහ හොවර් යනු:

#menu > li:hover div {
    transition: 0.5s;
    -webkit-transform:translateY(0);
}

සහ උල් උස අන්තර්ගතයට සකසා ඇති නිසා එයට ඔබේ ශරීර අන්තර්ගතය ඉක්මවා යා හැක.

 #menu ul {
    transition: 0s 1.5s;
    visibility:hidden;
    overflow:hidden;
}

සහ සැරිසරන්න:

#menu > li:hover ul {
     transition:none;
     visibility:visible;
}

සංක්‍රාන්තියෙන් පසු දෙවන වතාව ප්‍රමාද වන අතර මගේ පතන ලැයිස්තුව සජීවීව වසා දැමීමෙන් පසු එය සැඟවී යනු ඇත ...
පසුව යමෙකුට මෙයින් ප්‍රතිලාභ ලැබෙනු ඇතැයි බලාපොරොත්තු වෙමි .

සංස්කරණය කරන්න: මට විශ්වාස කළ නොහැක ppl ඇත්ත වශයෙන්ම මෙම මූලාකෘතිය භාවිතා කරයි! මෙම පතන මෙනුව එක් උප මෙනුවක් සඳහා පමණක් වන අතර එපමණයි !! IE 8 සහය ඇතිව ltr සහ rtl දිශාව සඳහා උප මෙනුවක් දෙකක් තිබිය හැකි වඩා හොඳ එකක් මම යාවත්කාලීන කර ඇත්තෙමි. RTL
සඳහා LTR
Fiddle සඳහා Fiddle
අනාගතයේදී යමෙකුට මෙය ප්‍රයෝජනවත් වේ යැයි බලාපොරොත්තු වෙමු.


11

ඔබට උස: 0 සිට උස දක්වා මාරුවිය හැකිය: ස්වයංක්‍රීයව ඔබ අවම උස සහ උපරිම උස ලබා දෙයි.

div.stretchy{
    transition: 1s linear;
}

div.stretchy.hidden{
    height: 0;
}

div.stretchy.visible{
    height: auto;
    min-height:40px;
    max-height:400px;
}

U ස්ටුවර්ට් බැඩ්මින්ටන් ඔබට වැඩ කරන ආදර්ශයක් සැපයිය හැකිද? මම මෙය එකට තබා ඇති නමුත් එය කොතැනකවත් වැඩ කරන බවක් නොපෙනේ :( jsfiddle.net/gryzzly/n5XfG
මිෂා රයිස්ලින්

5
ගැටලුව වන්නේ ඔබේ සංක්‍රාන්ති රීතියයි. එය වැඩ කිරීමට නම් මිනිත්තුව සහ උපරිම උස දක්වා සංක්‍රාන්තිය යෙදිය යුතුය. සංක්‍රාන්තිය: උස .5s රේඛීය, අවම උස .5s රේඛීය, උපරිම උස .5s රේඛීය
ස්ටුවර්ට් බැඩ්මින්ටන්

2
මෙන්න මම පසුව ලබා ගත් දෙය, ඔබ පැවසූ පරිදි, උපරිම උස සජීවිකරණය
මිෂා රයිස්ලින්

11
ඇත්ත වශයෙන්ම, මේ සමඟ ගැටළුවක් තිබේ. උපරිම උස සජීවිකරණය කිරීමට ගතවන කාලය කොටුවේ ස්වයංක්‍රීය උසකට මාරුවීමට ගතවන කාලය නොවේ: එය උසකට පැමිණේ: ස්වයංක්‍රීයව පළමුව, උපරිම උස සජීවිකරණය අවසන් වීමට පෙර. ඒ හා සමානව, 0 වෙත සංක්‍රමණය වන විට, සංක්‍රාන්තිය වහාම ආරම්භ නොවේ, උපරිම උස ආරම්භයට වඩා උසින් උසින් ආරම්භ වේ: ස්වයංක්‍රීය. උපරිම උසකට මාරුවීම: 1000px මෙය පැහැදිලි කරයි: jsfiddle.net/n5XfG/11
stephband

ඔබ හරි, වැඩිදුර පරීක්ෂණයේදී මම මෙය දුටුවෙමි. සම්පූර්ණ උස: 0 සිට උස: ස්වයංක්‍රීයව කවදා හෝ ක්‍රියාත්මක වේදැයි මම නොදනිමි, නමුත් සමහර අවස්ථාවන්හි උපරිම උස භාවිතා කිරීම CSS පමණක් භාවිතා කිරීමෙන් කළ නොහැකි වෙනත් තත්වයක් විසඳයි.
ස්ටුවර්ට් බැඩ්මින්ටන්

10

Flexbox විසඳුම

වාසි:

  • සරල
  • ජේ
  • සුමට සංක්‍රමණය

අවාසි:

  • මූලද්රව්යය ස්ථාවර උස නම්යශීලී භාජනයක තැබිය යුතුය

එය ක්‍රියා කරන ආකාරය වන්නේ සෑම විටම නම්‍යශීලී පදනමක් තිබීමයි: අන්තර්ගතය සහිත මූලද්‍රව්‍යය මත ස්වයංක්‍රීයව ක්‍රියා කිරීම සහ ඒ වෙනුවට නම්‍ය-වර්ධනය සහ නම්‍ය-හැකිලීම සංක්‍රමණය කිරීම.

සංස්කරණය කරන්න: එක්ස්බොක්ස් වන් අතුරුමුහුණතෙන් දේවානුභාවයෙන් වැඩි දියුණු කරන ලද ජේ.එස්.

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
  transition: 0.25s;
  font-family: monospace;
}

body {
  margin: 10px 0 0 10px;
}

.box {
  width: 150px;
  height: 150px;
  margin: 0 2px 10px 0;
  background: #2d333b;
  border: solid 10px #20262e;
  overflow: hidden;
  display: inline-flex;
  flex-direction: column;
}

.space {
  flex-basis: 100%;
  flex-grow: 1;
  flex-shrink: 0;    
}

p {
  flex-basis: auto;
  flex-grow: 0;
  flex-shrink: 1;
  background: #20262e;
  padding: 10px;
  width: 100%;
  text-align: left;
  color: white;
}

.box:hover .space {
  flex-grow: 0;
  flex-shrink: 1;
}
  
.box:hover p {
  flex-grow: 1;
  flex-shrink: 0;    
}
<div class="box">
  <div class="space"></div>
  <p>
    Super Metroid Prime Fusion
  </p>
</div>
<div class="box">
  <div class="space"></div>
  <p>
    Resident Evil 2 Remake
  </p>
</div>
<div class="box">
  <div class="space"></div>
  <p>
    Yolo The Game
  </p>
</div>
<div class="box">
  <div class="space"></div>
  <p>
    Final Fantasy 7 Remake + All Additional DLC + Golden Tophat
  </p>
</div>
<div class="box">
  <div class="space"></div>
  <p>
    DerpVille
  </p>
</div>

ජේ.එස්


7

Ake ජේක්ගේ පිළිතුර පුළුල් කරමින්, සංක්‍රාන්තිය උපරිම උස අගයට යන අතර එය අතිශය වේගවත් සජීවීකරණයක් ඇති කරයි - ඔබ දෙකටම සංක්‍රාන්ති සකසන්නේ නම්: සැරිසැරීම සහ අක්‍රිය කිරීම ඔබට පිස්සු වේගය තව ටිකක් පාලනය කළ හැකිය.

එබැවින් li: hover යනු මූසිකය තත්වයට ඇතුළු වන විට වන අතර පසුව නොකැඩූ දේපලෙහි මාරුව මූසික නිවාඩු වේ.

මෙය කිසියම් උපකාරයක් වනු ඇතැයි අපේක්‍ෂා කරමු.

උදා:

.sidemenu li ul {
   max-height: 0px;
   -webkit-transition: all .3s ease;
   -moz-transition: all .3s ease;
   -o-transition: all .3s ease;
   -ms-transition: all .3s ease;
   transition: all .3s ease;
}
.sidemenu li:hover ul {
    max-height: 500px;
    -webkit-transition: all 1s ease;
   -moz-transition: all 1s ease;
   -o-transition: all 1s ease;
   -ms-transition: all 1s ease;
   transition: all 1s ease;
}
/* Adjust speeds to the possible height of the list */

මෙන්න ප්‍රහේලිකාවක්: http://jsfiddle.net/BukwJ/


1
මම දන්නේ නැහැ ඇයි මේකට -1 ලැබුණේ කියලා. මම ඇත්ත වශයෙන්ම සිතන්නේ මෙය සමහර පුද්ගලයින් ජාවාස්ක්‍රිප්ට් එකතු කිරීමට වඩා හොඳ උත්සාහයක් බවයි. එය පරිපූර්ණ විසඳුමක් නොවේ, නමුත් සමහර කරකැවීම් සමඟ එය හොඳ කාර්යයක් කරයි, මෙය ප්‍රතිලාභ වටිනාකම සඳහා වැඩ කිරීමට මට හැකි විය. සංක්‍රාන්තිය: සියලුම මීටර් 500 cub න-බෙසියර් (0.000, 1.225, 0.085, 0.385); මෙය පදනම් වූයේ විවෘත කිරීමේදී 2s සංක්‍රාන්තියක් මත වන අතර පසුව ආරම්භක කේතය වෙත ආපසු යාමට ඉහත කේතය. ස්තූතියි ... මෙය ඉහත සියල්ලටම වඩා මට උදව් විය. +1 මම මෙම වෙබ් අඩවිය භාවිතා කළේ bezier matthewlein.com/ceaser
gcoulby

හරි, එය තව ටිකක් වෙනස් කිරීම අවශ්‍ය විය. සංක්‍රාන්තිය: සියලුම මීටර් 500 cub න-බෙසියර් (0.000, 1.390, 0.000, 0.635); මගේ සංක්‍රාන්තිය 5% -100% සිට සිදුවන බව මා විසින් සඳහන් කළ යුතුය (නමුත් යථාර්ථයේ අවසාන අගය 28% ක් පමණ වේ) එබැවින් එය ව්‍යාපෘතිය මත රඳා පවතී.
gcoulby

නියත වශයෙන්ම, එය පරමාදර්ශී නොවේ, නමුත් සාමාන්‍ය උස කුමක් දැයි ඔබ වටහා ගන්නේ නම් එය ඉක්මන් විසඳුමක් වේ.
ජමී

7

මම හිතන්නේ මම ඇත්තටම ස්ථිර විසඳුමක් ඉදිරිපත් කළා

හරි! මෙම ගැටළුව අන්තර්ජාලය තරම් පැරණි බව මම දනිමි, නමුත් විකෘති-සංක්‍රාන්තිය නම් ප්ලගිනයක් බවට පත් කළ විසඳුමක් මා සතුව ඇතැයි මම සිතමි . මගේ විසඳුම style=""DOM හි වෙනසක් සිදු වූ සෑම අවස්ථාවකම ලුහුබැඳ ගිය මූලද්‍රව්‍ය සඳහා ගුණාංග සකසයි . අවසාන ප්‍රති result ලය වනුයේ ඔබේ සංක්‍රාන්ති සඳහා හොඳ ඔලේ CSS භාවිතා කළ හැකි අතර අනවසර විසඳුම් හෝ විශේෂ ජාවාස්ක්‍රිප්ට් භාවිතා නොකිරීමයි. ඔබට කළ යුතු එකම දෙය වන්නේ ප්‍රශ්නාර්ථයේ ඇති මූලද්‍රව්‍යය සොයා ගැනීමට ඔබට අවශ්‍ය දේ සැකසීමයි data-mutant-attributes="X".

<div data-mutant-attributes="height">                                                                      
        This is an example with mutant-transition                                                                                                          
    </div>

ඒක තමයි! මෙම විසඳුම DOM හි වෙනස්කම් අනුගමනය කිරීමට MutationObserver භාවිතා කරයි . මේ නිසා, ඔබට සැබවින්ම කිසිවක් සැකසීමට හෝ දේවල් අතින් සජීවීකරණය කිරීමට ජාවාස්ක්‍රිප්ට් භාවිතා කිරීමට අවශ්‍ය නැත. වෙනස්කම් ස්වයංක්‍රීයව නිරීක්ෂණය කෙරේ. කෙසේ වෙතත්, එය MutationObserver භාවිතා කරන නිසා, මෙය සංක්‍රමණය වන්නේ IE11 + තුළ පමණි.

ෆිද්ල්ස්!


12
සාමාන්‍යයෙන්, කවුරුහරි "ජාවාස්ක්‍රිප්ට් නොමැතිව" යමක් කරන්නේ කෙසේදැයි ඇසූ විට, එයින් අදහස් වන්නේ විසඳුම ජාවාස්ක්‍රිප්ට් අක්‍රීය කර ඇති බ්‍රව්සර් මත ක්‍රියා කළ යුතු බවයි. එහි තේරුම "මගේම පිටපත් ලිවීමකින් තොරව" යන්නයි. එබැවින් ජාවාස්ක්‍රිප්ට් භාවිතා නොකර ඔබේ ප්ලගිනය භාවිතා කළ හැකි යැයි පැවසීම නොමඟ යවන සුළුය - එය ජාවාස්ක්‍රිප්ට් ප්ලගිනයක් ලෙස සලකයි.
බෝල්ට් ක්ලොක්

මම පැහැදිලි කළ යුතුයි, ඔබ විශේෂ ජාවාස්ක්‍රිප්ට් එකක් භාවිතා කළ යුතු නැතැයි මා කී විට, මම අදහස් කළේ ඔබට කිසිදු ජාවාස්ක්‍රිප්ට් ලිවිය යුතු නැති බවයි . JS පුස්තකාලය ඇතුළත් කර ඔබට HTML හි නැරඹිය යුතු ගුණාංග සඳහන් කරන්න. ඔබට ස්ථාවර උස css භාවිතා කිරීමට අවශ්‍ය නැත, නැතහොත් කිසිවක් සොයා ගන්න. විලාසිතාව සහ යන්න.
JonTroncoso

"(...) ඔබට සැබවින්ම කිසිවක් සැකසීමට හෝ දේවල් අතින් සජීවීකරණය කිරීමට ජාවාස්ක්‍රිප්ට් භාවිතා කිරීමට අවශ්‍ය නැත (...)" එබැවින් ඔබ විනෝදය සඳහා ජාවාස්ක්‍රිප්ට් භාවිතා කරයි
රොකෝ සී. බුල්ජන්

6

ආරම්භ කිරීම සඳහා එක් නෝඩ් පදනමක් මත හෝ ඕනෑම පරිශීලක කේතයක් අවශ්‍ය නොවී 0 ඇතුළුව ඕනෑම ආරම්භක උසකින් ස්වයංක්‍රීයව (සම්පූර්ණ ප්‍රමාණයෙන් හා නම්‍යශීලී) මාරුවීමේ ක්‍රමයක් මෙන්න: https://github.com/csuwildcat / සංක්‍රාන්ති-ස්වයංක්‍රීය . මෙය මූලික වශයෙන් ඔබට අවශ්‍ය දේ සඳහා ශුද්ධ ග්‍රිල් ය, මම විශ්වාස කරමි -> http://codepen.io/csuwldcat/pen/kwsdF . පහත දැක්වෙන JS ගොනුව ඔබේ පිටුවට තල්ලු කරන්න, ඉන්පසු ඔබ කළ යුත්තේ එක් බූලියන් ලක්ෂණයක් එක් කිරීම / ඉවත් කිරීම පමණි reveal=""- ඔබට පුළුල් කිරීමට හා හැකිලීමට අවශ්‍ය නෝඩ් වලින්.

උදාහරණ කේතයට පහළින් ඇති කේත වාරණය ඇතුළත් කළ පසු පරිශීලකයා ලෙස ඔබ කළ යුතු සියල්ල මෙන්න:

/*** Nothing out of the ordinary in your styles ***/
<style>
    div {
        height: 0;
        overflow: hidden;
        transition: height 1s;
    }
</style>

/*** Just add and remove one attribute and transition to/from auto! ***/

<div>
    I have tons of content and I am 0px in height you can't see me...
</div>

<div reveal>
     I have tons of content and I am 0px in height you can't see me...
     but now that you added the 'reveal' attribute, 
     I magically transitioned to full height!...
</div>

ඔබේ පිටුවට ඇතුළත් කළ යුතු කේත වාරණය මෙන්න, ඊට පසු, එය සියල්ලම රසවත් ය:

මෙම JS ගොනුව ඔබේ පිටුවට දමන්න - ඒ සියල්ල ක්‍රියාත්මක වේ

/ * උස සඳහා කේතය: ස්වයංක්‍රීය; සංක්‍රමණය * /

(function(doc){

/* feature detection for browsers that report different values for scrollHeight when an element's overflow is hidden vs visible (Firefox, IE) */
var test = doc.documentElement.appendChild(doc.createElement('x-reveal-test'));
    test.innerHTML = '-';
    test.style.cssText = 'display: block !important; height: 0px !important; padding: 0px !important; font-size: 0px !important; border-width: 0px !important; line-height: 1px !important; overflow: hidden !important;';
var scroll = test.scrollHeight || 2;
doc.documentElement.removeChild(test);

var loading = true,
    numReg = /^([0-9]*\.?[0-9]*)(.*)/,
    skipFrame = function(fn){
      requestAnimationFrame(function(){
        requestAnimationFrame(fn);
      });
    },
    /* 2 out of 3 uses of this function are purely to work around Chrome's catastrophically busted implementation of auto value CSS transitioning */
    revealFrame = function(el, state, height){
        el.setAttribute('reveal-transition', 'frame');
        el.style.height = height;
        skipFrame(function(){
            el.setAttribute('reveal-transition', state);
            el.style.height = '';
        });
    },
    transitionend = function(e){
      var node = e.target;
      if (node.hasAttribute('reveal')) {
        if (node.getAttribute('reveal-transition') == 'running') revealFrame(node, 'complete', '');
      } 
      else {
        node.removeAttribute('reveal-transition');
        node.style.height = '';
      }
    },
    animationstart = function(e){
      var node = e.target,
          name = e.animationName;   
      if (name == 'reveal' || name == 'unreveal') {

        if (loading) return revealFrame(node, 'complete', 'auto');

        var style = getComputedStyle(node),
            offset = (Number(style.paddingTop.match(numReg)[1])) +
                     (Number(style.paddingBottom.match(numReg)[1])) +
                     (Number(style.borderTopWidth.match(numReg)[1])) +
                     (Number(style.borderBottomWidth.match(numReg)[1]));

        if (name == 'reveal'){
          node.setAttribute('reveal-transition', 'running');
          node.style.height = node.scrollHeight - (offset / scroll) + 'px';
        }
        else {
            if (node.getAttribute('reveal-transition') == 'running') node.style.height = '';
            else revealFrame(node, 'running', node.scrollHeight - offset + 'px');
        }
      }
    };

doc.addEventListener('animationstart', animationstart, false);
doc.addEventListener('MSAnimationStart', animationstart, false);
doc.addEventListener('webkitAnimationStart', animationstart, false);
doc.addEventListener('transitionend', transitionend, false);
doc.addEventListener('MSTransitionEnd', transitionend, false);
doc.addEventListener('webkitTransitionEnd', transitionend, false);

/*
    Batshit readyState/DOMContentLoaded code to dance around Webkit/Chrome animation auto-run weirdness on initial page load.
    If they fixed their code, you could just check for if(doc.readyState != 'complete') in animationstart's if(loading) check
*/
if (document.readyState == 'complete') {
    skipFrame(function(){
        loading = false;
    });
}
else document.addEventListener('DOMContentLoaded', function(e){
    skipFrame(function(){
        loading = false;
    });
}, false);

/* Styles that allow for 'reveal' attribute triggers */
var styles = doc.createElement('style'),
    t = 'transition: none; ',
    au = 'animation: reveal 0.001s; ',
    ar = 'animation: unreveal 0.001s; ',
    clip = ' { from { opacity: 0; } to { opacity: 1; } }',
    r = 'keyframes reveal' + clip,
    u = 'keyframes unreveal' + clip;

styles.textContent = '[reveal] { -ms-'+ au + '-webkit-'+ au +'-moz-'+ au + au +'}' +
    '[reveal-transition="frame"] { -ms-' + t + '-webkit-' + t + '-moz-' + t + t + 'height: auto; }' +
    '[reveal-transition="complete"] { height: auto; }' +
    '[reveal-transition]:not([reveal]) { -webkit-'+ ar +'-moz-'+ ar + ar +'}' +
    '@-ms-' + r + '@-webkit-' + r + '@-moz-' + r + r +
    '@-ms-' + u +'@-webkit-' + u + '@-moz-' + u + u;

doc.querySelector('head').appendChild(styles);

})(document);

/ * ඩෙමෝ සඳහා කේතය * /

    document.addEventListener('click', function(e){
      if (e.target.nodeName == 'BUTTON') {
        var next = e.target.nextElementSibling;
        next.hasAttribute('reveal') ? next.removeAttribute('reveal') : next.setAttribute('reveal', '');
      }
    }, false);

9
මෙය යෝජනා කර ඇති අනෙක් ඒවාට වඩා පිරිසිදු හා නම්‍යශීලී විසඳුමක් වන අතර, මම පෞද්ගලිකව විශ්වාස කරන්නේ මෙය ජේඑස් කිසිසේත් ස්පර්ශ කළ යුතු දෙයක් නොවිය යුතු බවයි. ඔබ වැරදියි කියා නොකියයි, එය සුසුම්ලෑමකි.
mystrdat

stmystrdat පැහැදිලිව කිවහොත්, JS භාවිතා කරනුයේ යම් යම් කොන්දේසි සඳහා නැරඹීමට සහ එය නරඹන සිදුවීම් / කොන්දේසි මත පදනම්ව ගුණාංග / තාවකාලික CSS අගයන් කිහිපයක් එක් කිරීමට පමණි. සංක්‍රාන්තිය තවමත් සියල්ලම CSS තුළ සිදු කෙරේ. මා එකඟ වුවද, සරල භාවිතයක් ලෙස පෙනෙන පරිදි සැබවින්ම තෘප්තිමත් කිරීම සඳහා මෙම මට්ටමේ සැකසුම සහ අත් තබා ගැනීම අවශ්‍ය වීම කනගාටුවට කරුණකි! : /
csuwldcat

1
A කැරොලිස් රාමනාස්කාස් එය ගැටළුවක් නොවේ - අයිඑස් CSS යතුරු රාමු සහ ඉල්ලීම් ඇනිමේෂන් ෆ්‍රේම් යන දෙකටම සහය දක්වයි. මම clipමගේ ව්‍යාජ දේපල ප්‍රේරකය ලෙස භාවිතා කළ අතර, කිසියම් හේතුවක් නිසා IE ක්ලිප් සජීවිකරණය කිරීමට ඉඩ දීම නැවැත්වීය. මම පාරාන්ධතාවයට මාරු වූ අතර ඒ සියල්ල නැවත ක්‍රියාත්මක වේ: codepen.io/csuwldcat/pen/FpzGa . ගැලපෙන පරිදි පිළිතුරේ කේතය යාවත්කාලීන කර ඇත.
csuwldcat

1
scsuwldcat ඉතා හොඳ විසඳුමක්, අන්තර්ගතය කුඩා කොටසකට දර්ශනය වී අතුරුදහන් වන බව මම දුටුවෙමි, මෙය සිදුවන්නේ ඇයි? එය වළක්වා ගත හැකිද?
බීටෝ අවීගා

12
මට මෙය ඉහළ නැංවීමට අවශ්‍යයි, නමුත් එය ක්‍රියාත්මක කරන්නේ කෙසේද යන ප්‍රශ්නයට පිළිතුරු දෙනවා වෙනුවට, ඔබ එය ලියූ ප්ලගිනයක් බෙදාගෙන එය ක්‍රියාත්මක කිරීමට සමත් විය. කුතුහලය දනවන අපට ඔබගේ ප්ලගිනය ආපසු හැරවීමට ඉතිරිව ඇත, එය එතරම් විනෝදයක් නොවේ. ඔබගේ ප්ලගිනය කරන්නේ කුමක්ද සහ ඇයි යන්න පිළිබඳ වැඩි විස්තරයක් අඩංගු කිරීම සඳහා ඔබේ පිළිතුර යාවත්කාලීන කරනු ඇතැයි මම ප්‍රාර්ථනා කරමි. වඩාත් පැහැදිලි කිරීම සඳහා කේතය වෙනස් කරන්න. උදාහරණයක් ලෙස, ඔබට ස්ථිතික CSS ලියන කේතයේ සම්පූර්ණ කොටසක් තිබේ. CSS එය ජනනය කරන කේතයට වඩා මම දකිමි. සියලුම බ්‍රව්සර් උපසර්ග සඳහා පුනරාවර්තනය කිරීම වැනි කම්මැලි කොටස් ඔබට අතහැර දැමිය හැකිය.
gilly3

6

උපරිම උස සජීවිකරණය කිරීමට ජේක් දුන් පිළිතුර විශිෂ්ටයි, නමුත් විශාල උස උස කරදරයක් ලෙස සැකසීම නිසා ඇති වූ ප්‍රමාදය මට පෙනී ගියේය.

යමෙකුට කඩාවැටෙන අන්තර්ගතය අභ්‍යන්තර බෙදීමකට ගෙන යා හැකි අතර අභ්‍යන්තර කොට් of ාශයේ උස ලබා ගැනීමෙන් උපරිම උස ගණනය කළ හැකිය (JQuery හරහා එය පිටත උස ()).

$('button').bind('click', function(e) { 
  e.preventDefault();
  w = $('#outer');
  if (w.hasClass('collapsed')) {
    w.css({ "max-height": $('#inner').outerHeight() + 'px' });
  } else {
    w.css({ "max-height": "0px" });
  }
  w.toggleClass('collapsed');
});

මෙන්න jsfiddle සබැඳියක්: http://jsfiddle.net/pbatey/duZpT

අවශ්‍ය නිරපේක්ෂ අවම කේතය සහිත jsfiddle මෙන්න: http://jsfiddle.net/8ncjjxh8/


5

මෙම ත්‍රෙඩ් එක පරණ වෙමින් පවතින බව මට වැටහී ඇත, නමුත් එය සමහර ගූගල් සෙවුම් වල ඉහළ මට්ටමක පවතින බැවින් එය යාවත්කාලීන කිරීම වටී යැයි මම සිතමි.

ඔබ ද මූලද්‍රව්‍යයේ උස ලබා ගන්න / සකසන්න:

var load_height = document.getElementById('target_box').clientHeight;
document.getElementById('target_box').style.height = load_height + 'px';

Target_box වසා දැමූ ටැගය ඉන්ලයින් ස්ක්‍රිප්ට් ටැගයකට දැමූ වහාම ඔබ මෙම ජාවාස්ක්‍රිප්ට් දැමිය යුතුය.


document.getElementById ('target_box'). getBoundingClientRect (). උස උපරිමයෙන් කළ යුතුය.
වෙනස් කරන්න

5

මට මෙය කිරීමට හැකි විය. මට .child& .parentdiv එකක් තියෙනවා. ළමා බෙදීම දෙමව්පියන්ගේ පළල / උස absoluteස්ථානගත කිරීම සමඟ හොඳින් ගැලපේ . මම translateදේපල සජීවිකරණය කරන්නේ එහි Yවටිනාකම පහත හෙලීමටයි 100%. එහි ඉතා සුමට සජීවිකරණය, මෙහි වෙනත් විසඳුමක් මෙන් අඩුපාඩු හෝ පහළ පැති නොමැත.

මේ වගේ දෙයක්, ව්‍යාජ කේතය

.parent{ position:relative; overflow:hidden; } 
/** shown state */
.child {
  position:absolute;top:0;:left:0;right:0;bottom:0;
  height: 100%;
  transition: transform @overlay-animation-duration ease-in-out;
  .translate(0, 0);
}

/** Animate to hidden by sliding down: */
.child.slidedown {
  .translate(0, 100%); /** Translate the element "out" the bottom of it's .scene container "mask" so its hidden */
}

ඔබ නියම කරන heightමත .parentදී, px, %ලෙස, හෝ නිවාඩු auto. මෙම කොට් div ාශය .childපහළට ලිස්සා යන විට එය ආවරණය කරයි.


මේ සඳහා වැඩ කරන උදාහරණය බෙහෙවින් අගය කරනු ඇත.
ස්නායු සම්ප්‍රේෂකය

5

මම සමහර ජාවාස්ක්‍රිප්ට් සමඟ පිළිතුරක් පළ කර පහත් කොට සැලකූ නිසා කෝපයට පත් වී නැවත උත්සාහ කළෙමි.

මෙම විසඳුම 'ශිල්පීය ක්‍රම' කිහිපයක් භාවිතා කරයි:

  • padding-bottom:100%මූලද්‍රව්‍යයේ වත්මන් පළල අනුව ප්‍රතිශත නිර්වචනය කර ඇති 'හැක්'. මෙම තාක්ෂණය පිළිබඳ වැඩි විස්තර.
  • float හැකිලීම-එතීම, (පාවෙන නිශ්කාෂණ හැක් කිරීම සඳහා අමතර අංශයක් අවශ්‍ය වේ)
  • https://caniuse.com/#feat=css-writing-mode හි අනවශ්‍ය ලෙස භාවිතා කිරීම සහ එය අහෝසි කිරීම සඳහා සමහර පරිවර්තනයන් (මෙය සිරස් සන්දර්භයක් තුළ ඉහත පැඩින් හැක් භාවිතා කිරීමට ඉඩ දෙයි)

මෙහි ප්‍රති shot ලය වනුයේ අපට කාර්ය සාධන සංක්‍රාන්තිය ලැබෙන්නේ CSS පමණක් භාවිතා කිරීම සහ සංක්‍රාන්තිය සුමටව ළඟා කර ගැනීම සඳහා තනි සංක්‍රාන්ති ශ්‍රිතයක්; ශුද්ධ ග්‍රේලය!

ඇත්ත වශයෙන්ම, අවාසියක් තිබේ! අන්තර්ගතය කපා හරින පළල පාලනය කරන්නේ කෙසේදැයි මට වැඩ කළ නොහැක ( overflow:hidden); පෑඩින්-පහළ හැක් නිසා, පළල සහ උස එකිනෙකට සමීපව සම්බන්ධ වේ. කෙසේ වෙතත් ක්‍රමයක් තිබිය හැකි බැවින් නැවත එය වෙත පැමිණෙනු ඇත.

https://jsfiddle.net/EoghanM/n1rp3zb4/28/

body {
  padding: 1em;
}

.trigger {
  font-weight: bold;
}

/* .expander is there for float clearing purposes only */
.expander::after {
  content: '';
  display: table;
  clear: both;
}

.outer {
  float: left; /* purpose: shrink to fit content */
  border: 1px solid green;
  overflow: hidden;
}

.inner {
  transition: padding-bottom 0.3s ease-in-out;  /* or whatever crazy transition function you can come up with! */
  padding-bottom: 0%;  /* percentage padding is defined in terms of width. The width at this level is equal to the height of the content */
  height: 0;

  /* unfortunately, change of writing mode has other bad effects like orientation of cursor */
  writing-mode: vertical-rl;
  cursor: default; /* don't want the vertical-text (sideways I-beam) */
  transform: rotate(-90deg) translateX(-100%);  /* undo writing mode */
  transform-origin: 0 0;
  margin: 0;  /* left/right margins here will add to height */
}

.inner > div { white-space: nowrap; }

.expander:hover .inner,  /* to keep open when expanded */
.trigger:hover+.expander .inner {
  padding-bottom: 100%;
}
<div class="trigger">HoverMe</div>
<div class="expander">
  <div class="outer">
    <div class="inner">
      <div>First Item</div>
      <div>Content</div>
      <div>Content</div>
      <div>Content</div>
      <div>Long Content can't be wider than outer height unfortunately</div>
      <div>Last Item</div>
    </div>
  </div>
</div>
<div>
  after content</div>
</div>


මෙහි ඇති අනෙක් අවාසිය නම්, ඔබට කර්සරය "හෝවර්ම්" අංශයෙන් අයිතම ලැයිස්තුවට ගෙන යා නොහැකි අතර ඒවා සමඟ අන්තර් ක්‍රියා කිරීම සඳහා (OP ඉල්ලීමට හේතුව පෙනෙන පරිදි), එබැවින් එය ප්‍රයෝජනවත් වන්නේ මෙවලම් ක්‍රියාකාරීත්වයක් ලෙස නොව , කියන්න, කැදැලි උප මෙනුව සහිත මෙනුවක්.
ටයිලර් එච්

එය තනිකරම ප්‍රශ්නය සැකසූ ආකාරය හා තාක්‍ෂණයට සම්බන්ධ නොවන ආකාරයෙහි ප්‍රති ence ලයකි. ඔබ විය කොකා වෙනස් විය හැකි input[type="checkbox"]:checkedවෙනුවට :hoverඔබ (එනම් ඔබ යම් පන්ති එකතු කිරීමට JavaScript භාවිතා කිරීමට අවශ්ය නැහැ) කැමති නම්
EoghanM

මා අදහස් කළේ, ප්‍රශ්නය සකස් කරන ආකාරය කුමක් වුවත්, විසඳුමක් ක්‍රියාත්මක කිරීම එතරම් සීමිත නම්, එය බොහෝ විට එම විසඳුමේ පිළිතුරෙහි සඳහන් කළ යුතුය (හෝ ඊට වඩා වගකියනු ලැබේ ). මෙම විසඳුම 'ශුද්ධ ග්‍රේල්' එකක් බව ඔබ සඳහන් කළ නමුත් සංක්‍රාන්ති වූ ඩිව් එක පවා සඟවා තැබිය නොහැක ... මට එවැනි අවසාන විසඳුමක් සේ නොපෙනේ.
ටයිලර් එච්

හායි y ටයිලර් එච්, සමාව ඉල්ලන්න, මුල් ප්‍රශ්නයේ ප්‍රේරකය පුළුල් කරන ලද ලැයිස්තුව වටා ඇති බව මට මග හැරුණි, එම නිසා ලැයිස්තුව විවෘතව තිබිය යුතුය. මෙය පිළිබිඹු කිරීම සඳහා මම මගේ පිළිතුර යාවත්කාලීන කර ඇත. මා සඳහන් කළ පරිදි, එය අවුලුවන ආකාරය එතරම්ම ජර්මානු නොවේ, මන්ද මා ඉදිරිපත් කරන්නේ සීඑස්එස් තුළ පමණක් කළ නොහැකි යැයි කලින් නොසිතූ නව තාක්‍ෂණයක් (මම වසර කිහිපයක් තිස්සේ විසඳුමක් සොයමින් සිටිමි).
EoghanM

4

මෙන්න මම jQuery සමඟ ඒකාබද්ධව භාවිතා කළ විසඳුමක්. මෙය පහත දැක්වෙන HTML ව්‍යුහය සඳහා ක්‍රියා කරයි:

<nav id="main-nav">
    <ul>
        <li>
            <a class="main-link" href="yourlink.html">Link</a>
            <ul>
                <li><a href="yourlink.html">Sub Link</a></li>
            </ul>
        </li>
    </ul>
</nav>

සහ ශ්‍රිතය:

    $('#main-nav li ul').each(function(){
        $me = $(this);

        //Count the number of li elements in this UL
        var liCount = $me.find('li').size(),
        //Multiply the liCount by the height + the margin on each li
            ulHeight = liCount * 28;

        //Store height in the data-height attribute in the UL
        $me.attr("data-height", ulHeight);
    });

එවිට ඔබට උස සැකසීමට සහ ඉවත් කිරීමට ක්ලික් කිරීමේ ශ්‍රිතයක් භාවිතා කළ හැකිය css()

$('#main-nav li a.main-link').click(function(){
    //Collapse all submenus back to 0
    $('#main-nav li ul').removeAttr('style');

    $(this).parent().addClass('current');

    //Set height on current submenu to it's height
    var $currentUl = $('li.current ul'),
        currentUlHeight = $currentUl.attr('data-height');
})

CSS:

#main-nav li ul { 
    height: 0;
    position: relative;
    overflow: hidden;
    opacity: 0; 
    filter: alpha(opacity=0); 
    -ms-filter: "alpha(opacity=0)";
    -khtml-opacity: 0; 
    -moz-opacity: 0;
    -webkit-transition: all .6s ease-in-out;
    -moz-transition: all .6s ease-in-out;
    -o-transition: all .6s ease-in-out;
    -ms-transition: all .6s ease-in-out;
    transition: all .6s ease-in-out;
}

#main-nav li.current ul {
    opacity: 1.0; 
    filter: alpha(opacity=100); 
    -ms-filter: "alpha(opacity=100)";
    -khtml-opacity: 1.0; 
    -moz-opacity: 1.0;
}

.ie #main-nav li.current ul { height: auto !important }

#main-nav li { height: 25px; display: block; margin-bottom: 3px }

මෙය නවතම jquery අනුවාදය සමඟ නිසි ලෙස නොපෙන්වයි
ඔලිවර්බැක්මන්

4

මම මෑතකදී එතීමට වඩා මූලද්‍රව්‍ය max-heightමත සංක්‍රමණය වෙමින් සිටිමි .liul

මෙම තර්ක කුඩා සඳහා ප්රමාදය සිදුවන max-heightsවිශාල සාපේක්ෂව (සියලු දී නම්), බොහෝ දුරට අඩු පෙනේ max-heights, මම ද මගේ සැකසිය හැක max-heightවටිනාකමක් සාපේක්ෂ font-sizeපිළිබඳ liභාවිතා කරනවාට වඩා යම් අත්තනෝමතික විශාල සංඛ්යාවක් emsහෝ rems.

මගේ අකුරු ප්‍රමාණය නම් 1rem, මම මගේ (ඔතා ඇති පෙළට අනුගත වීමට) max-heightවැනි දෙයකට 3remසකසමි. ඔබට මෙහි උදාහරණයක් දැකිය හැකිය:

http://codepen.io/mindfullsilence/pen/DtzjE


3

මම සෑම දෙයක්ම විස්තරාත්මකව කියවා නැති නමුත් මෑතකදී මට මෙම ගැටලුව ඇති වූ අතර පහත සඳහන් දේ මම කළෙමි:

div.class{
   min-height:1%;
   max-height:200px;
   -webkit-transition: all 0.5s ease;
   -moz-transition: all 0.5s ease;
   -o-transition: all 0.5s ease;
   -webkit-transition: all 0.5s ease;
   transition: all 0.5s ease;
   overflow:hidden;
}

div.class:hover{
   min-height:100%;
   max-height:3000px;
}

මුලදී 200px උස දක්වා අන්තර්ගතය පෙන්වන ඩී.වී. එකක් තබා ගැනීමට මෙය ඔබට ඉඩ සලසයි. Div 3ppx බවට පත් නොවන නමුත් 3000px යනු මා විසින් පනවනු ලබන සීමාවයි. නොවරදවාම මාරුවීමට වග බලා ගන්න, එසේ නොමැතිනම් ඔබට අමුතු විදැහුම්කරණය ලැබෙනු ඇත. මේ ආකාරයට: හොවර් උරුම නොවන්නේ:

සංක්‍රාන්තිය px ආකාරයෙන්% හෝ ස්වයංක්‍රීයව ක්‍රියා නොකරයි. ඔබ එකම මිනුම් ඒකකයක් භාවිතා කළ යුතුය. මෙය මට හොඳින් ක්‍රියාත්මක වේ. HTML5 භාවිතා කිරීමෙන් එය පරිපූර්ණ වේ ....

සෑම විටම කාර්යයක් ඇති බව මතක තබා ගන්න ...; )

යමෙකුට මෙය ප්‍රයෝජනවත් වේ යැයි සිතමි


3

දෘඩ කේත කරන ලද උපරිම උස අගය සැබෑ උසට වඩා විශාල නොවේ නම් (වෙනත් ආකාරයකින් අනවශ්‍ය ප්‍රමාදයන් සහ කාල ගැටලු ඇති බැවින්) ජේක් වෙතින් උපරිම උස විසඳුම හොඳින් ක්‍රියාත්මක වේ. අනෙක් අතට, දෘඩ කේත කළ අගය අහම්බෙන් සැබෑ උසට වඩා විශාල නොවේ නම් මූලද්‍රව්‍යය සම්පූර්ණයෙන්ම විවෘත නොවේ.

පහත දැක්වෙන CSS පමණක් විසඳුම සඳහා දෘඩ කේත කරන ලද ප්‍රමාණයක් අවශ්‍ය වන අතර එය බොහෝ සැබෑ ප්‍රමාණවලට වඩා විශාල විය යුතුය. කෙසේ වෙතත් සැබෑ ප්‍රමාණය සමහර අවස්ථාවල දෘඩ කේත කළ ප්‍රමාණයට වඩා විශාල නම් මෙම විසඳුම ද ක්‍රියාත්මක වේ. එවැනි අවස්ථාවක සංක්‍රාන්තිය මඳක් ඉහළට යා හැකි නමුත් එය කිසි විටෙකත් අර්ධ වශයෙන් දෘශ්‍යමාන මූලද්‍රව්‍යයක් ඉතිරි නොකරනු ඇත. එබැවින් මෙම විසඳුම නොදන්නා අන්තර්ගතයන් සඳහාද භාවිතා කළ හැකිය, උදා: දත්ත සමුදායකින්, අන්තර්ගතය සාමාන්‍යයෙන් x පික්සල් වලට වඩා විශාල නොවන බව ඔබ දන්නා නමුත් ව්‍යතිරේක පවතී.

අදහස නම් ආන්තික-පහළ (හෝ තරමක් වෙනස් සජීවිකරණයක් සඳහා ආන්තික-ඉහළ) සඳහා negative ණ අගයක් භාවිතා කිරීම සහ අන්තර්ගත මූලද්‍රව්‍යය පිටාර ගැලීම සහිත මැද මූලද්‍රව්‍යයකට තැබීමයි: සැඟවී ඇත. අන්තර්ගත මූලද්‍රව්‍යයේ ආන්තික ආන්තිකය නිසා මැද මූලද්‍රව්‍යයේ උස අඩු කරයි.

පහත කේතය ආන්තික පතුලේ -150px සිට 0px දක්වා සංක්‍රාන්තියක් භාවිතා කරයි. අන්තර්ගත මූලද්‍රව්‍යය 150px ට වඩා වැඩි නොවන තාක් කල් මෙය පමණක් ක්‍රියාත්මක වේ. ඊට අමතරව එය මධ්‍යම මූලද්‍රව්‍යය සඳහා උපරිම උස 0px සිට 100% දක්වා සංක්‍රාන්තියක් භාවිතා කරයි. අන්තර්ගත මූලද්‍රව්‍යය 150px ට වඩා වැඩි නම් මෙය අවසානයේ මැද මූලද්‍රව්‍යය සඟවයි. උපරිම උස සඳහා සංක්‍රාන්තිය භාවිතා කරනුයේ වසා දැමීමේදී එහි යෙදුම තත්පරයකින් ප්‍රමාද කිරීමට මිස සුමට දෘශ්‍ය ආචරණයක් සඳහා නොවේ (එබැවින් එය 0px සිට 100% දක්වා ධාවනය කළ හැකිය).

CSS:

.content {
  transition: margin-bottom 1s ease-in;
  margin-bottom: -150px;
}
.outer:hover .middle .content {
  transition: margin-bottom 1s ease-out;
  margin-bottom: 0px
}
.middle {
  overflow: hidden;
  transition: max-height .1s ease 1s;
  max-height: 0px
}
.outer:hover .middle {
  transition: max-height .1s ease 0s;
  max-height: 100%
}

HTML:

<div class="outer">
  <div class="middle">
    <div class="content">
      Sample Text
      <br> Sample Text
      <br> Sample Text
      <div style="height:150px">Sample Test of height 150px</div>
      Sample Text
    </div>
  </div>
  Hover Here
</div>

ආන්තික පතුලේ වටිනාකම negative ණ විය යුතු අතර අන්තර්ගත මූලද්‍රව්‍යයේ සැබෑ උසට හැකි තරම් සමීප විය යුතුය. එය (නිරපේක්ෂ වටිනාකම) විශාල නම්, උපරිම උස විසඳුම් සමඟ සමාන ප්‍රමාදයන් සහ කාල ගැටලු ඇත, කෙසේ වෙතත් දෘඩ කේත කළ ප්‍රමාණය සැබෑ එකට වඩා විශාල නොවන තාක් කල් ඒවා සීමා කළ හැකිය. ආන්තික-පහළ සඳහා නිරපේක්ෂ අගය තාත්වික උසට වඩා කුඩා නම්, ආතතිය ටිකක් පනිනවා. සංක්‍රාන්තියෙන් පසු ඕනෑම අවස්ථාවක අන්තර්ගත අංගය සම්පූර්ණයෙන් දර්ශනය වේ හෝ සම්පූර්ණයෙන් ඉවත් කරනු ලැබේ.

වැඩි විස්තර සඳහා මගේ බ්ලොග් සටහන http://www.taccgl.org/blog/css_transition_display.html#combined_height බලන්න


3

ක්ලිප්-පථය සමඟ ප්‍රතිලෝම (බිඳවැටීමේ) සජීවිකරණයක් නිර්මාණය කිරීමෙන් ඔබට මෙය කළ හැකිය.

#child0 {
    display: none;
}
#parent0:hover #child0 {
    display: block;
    animation: height-animation;
    animation-duration: 200ms;
    animation-timing-function: linear;
    animation-fill-mode: backwards;
    animation-iteration-count: 1;
    animation-delay: 200ms;
}
@keyframes height-animation {
    0% {
        clip-path: polygon(0% 0%, 100% 0.00%, 100% 0%, 0% 0%);
    }
    100% {
        clip-path: polygon(0% 0%, 100% 0.00%, 100% 100%, 0% 100%);
    }
}
<div id="parent0">
    <h1>Hover me (height: 0)</h1>
    <div id="child0">Some content
        <br>Some content
        <br>Some content
        <br>Some content
        <br>Some content
        <br>Some content
        <br>
    </div>
</div>


2

මෙය හරියටම ගැටලුවට “විසඳුමක්” නොවේ, නමුත් වැඩිපුර ක්‍රියාමාර්ගයකි. එය ක්‍රියාත්මක වන්නේ පෙළ සමඟ ලියා ඇති ආකාරයට පමණි, නමුත් අවශ්‍ය පරිදි වෙනත් අංග සමඟ වැඩ කිරීමට වෙනස් කළ හැකි බව මට විශ්වාසයි.

.originalContent {
    font-size:0px;
    transition:font-size .2s ease-in-out;
}
.show { /* class to add to content */
    font-size:14px;
}

මෙන්න උදාහරණයක්: http://codepen.io/overthemike/pen/wzjRKa

අත්යවශ්යයෙන්ම, ඔබ අකුරු ප්රමාණය 0 ලෙස සකසා උස, හෝ උපරිම-උස, හෝ පරිමාණ Y () යනාදිය වෙනුවට ඔබට අවශ්‍ය දේට පරිවර්තනය කිරීම සඳහා උස ලබා ගැනීම සඳහා ඉක්මන් වේගයකින් මාරු කරන්න. CSS සමඟ සත්‍ය උස ස්වයංක්‍රීයව පරිවර්තනය කිරීම දැනට කළ නොහැකි නමුත් අන්තර්ගතය පරිවර්තනය කිරීම යනු අකුරු ප්‍රමාණයේ සංක්‍රාන්තියයි.

  • සටහන - කේතපදයේ ජාවාස්ක්‍රිප්ට් ඇත, නමුත් එහි එකම අරමුණ වන්නේ ඇකෝනියන් සඳහා ක්ලික් කිරීම මත CSS පන්ති එකතු කිරීම / ඉවත් කිරීමයි. සැඟවුණු ගුවන්විදුලි බොත්තම් සමඟ මෙය කළ හැකිය, නමුත් මම ඒ කෙරෙහි අවධානය යොමු කළේ නැත, උස පරිවර්තනය පමණි.

1
මෙම පිළිතුර effectively ලදායී ලෙස අනුපිටපත් කරයි, නමුත් පාරාන්ධතාව-ෆේඩ් ආචරණය මඟ හැරේ.
SeldomNeedy

එකඟ විය. වඩා හොඳ ප්රවේශය.
මයික් එස්.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.