আমি কীভাবে উচ্চতা স্থানান্তর করতে পারি: 0; উচ্চতা: অটো; সিএসএস ব্যবহার করছেন?


2130

আমি <ul>সিএসএস রূপান্তরগুলি ব্যবহার করে একটি স্লাইড ডাউন করার চেষ্টা করছি ।

<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, কিন্তু একটি কম্বো বাক্স ড্রপডাউন, যা আসতে পারেন 50px, তাহলে max-heightআপনাকে সাহায্য করবে না, 50pxউপাদান সংখ্যার উপর নির্ভর করে পরিবর্তনশীল, আপনি একটি অসম্ভব অবস্থা যেখানে আমি এটা ঠিক করতে পারবেন না পৌঁছা যাবে না কারণ heightনয় স্থির, height:autoসমাধান ছিল, কিন্তু আমি এটি দিয়ে ট্রানজিশন ব্যবহার করতে পারি না।
ক্রিস্টোফার থমাস

51
ওপি সিএস সমাধানের জন্য চেষ্টা করছে, জেএস নয়, অন্যথায় তারা কেবল ওভারফ্লো এবং অ্যানিমেট ব্যবহার করতে পারে
টনি লেই

5
@ ভিডিজাইনজ: তবে অভ্যন্তরীণ ডিভের -১০% মার্জিন-শীর্ষটি উচ্চতা নয় , মোড়ক ডিভের প্রস্থ অর্জন করে সুতরাং এই সমাধানটিতে একই ধরণের সমস্যা রয়েছে, এটি সর্বোচ্চ-উচ্চতার সমাধান। তদুপরি যখন প্রস্থটি সামগ্রীর উচ্চতার চেয়ে ছোট হয়, সমস্ত সামগ্রী -100% মার্জিন-শীর্ষ দ্বারা লুকানো থাকে না। সুতরাং এটি একটি ভুল সমাধান।
গ্রেগটম

1
একটি সঠিক সমাধানের অনুমান এবং প্রয়োগের চারপাশে আলোচনার জন্য github.com/w3c/csswg-drafts/issues/626 দেখুন
বেন ক্র্যাসি

উত্তর:


2743

max-heightরূপান্তর ব্যবহার করুন এবং না height। এবং max-heightআপনার বাক্সটি এর চেয়ে বড় কিছুতে একটি মান সেট করুন ।

দেখুন JSFiddle ডেমো অন্য ক্রিস জর্ডান দ্বারা উপলব্ধ উত্তর এখানে।

#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>


323
এটি দুর্দান্ত কাজ করে! এটি শুরু হওয়ার পরে আর কোনও বিলম্ব নেই, কারণ এটি সর্বোচ্চ-উচ্চতার জন্য শুরু হয় যা প্রাথমিকভাবে খুব বেশি..হুম, আমি মনে করি এটি কিছুটা বিরক্তিকর
vsync

175
+1 দুর্দান্ত সমাধান! রূপান্তরের গতি গণনা করা হয় আপনি সর্বোচ্চ-উচ্চতার মানকে রূপান্তর করার সময়টি হিসাবে গণনা করেন ... তবে যেহেতু উচ্চতা সর্বোচ্চ-উচ্চতার চেয়ে কম হবে, তাই প্রকৃত উচ্চতায় স্থানান্তরটি দ্রুত (প্রায়শই উল্লেখযোগ্যভাবে) এর চেয়ে দ্রুত ঘটবে সময় নির্দিষ্ট
কিংজেফ্রে

50
মনে রাখবেন যে আপনাকে যখন প্রকৃত গণনা করা মানের থেকে অনেক বড় মান ব্যবহার করতে হয় তখন এটি কুশ্রী রূপান্তর শেষ হতে পারে। আমি 0 টি উচ্চতা থেকে কন্টেন্টের উচ্চতায় একটি ডিভ বাড়ানোর চেষ্টা করার সময় এটি লক্ষ্য করেছি যা বিভিন্ন স্ক্রিনের আকারের কারণে (আমার 2560x1440 মনিটরে বনাম> স্মার্টফোনে 10 লাইনগুলিতে 2 লাইন) আলাদা হয়। এই জন্য আমি জেএস দিয়ে শেষ।
jpeltoniemi

44
এটি খুব কুরুচিপূর্ণ সমাধান যেহেতু এটি এক দিকে বিলম্ব সৃষ্টি করে তবে অন্য দিকে নয়।
টিম

84
এটি একটি সুন্দর অলস সমাধান। আমি ধরে নিচ্ছি ওপি উচ্চতা: অটো ব্যবহার করতে চায় কারণ কনটেইনারটির প্রসারিত উচ্চতা কিছুটা অনাকাঙ্ক্ষিত। অ্যানিমেশনটি দৃশ্যমান হওয়ার আগে এই সমাধানটি বিলম্বের কারণ ঘটবে। অতিরিক্তভাবে অ্যানিমেশনের দৃশ্যমান সময়কাল অনাকাঙ্ক্ষিত হবে। আপনি প্রতিটি ধারক শিশু নোডের সম্মিলিত উচ্চতা গণনা করে এবং তারপরে একটি সঠিক উচ্চতার মান ধরে আরও অনেক অনুমানযোগ্য (এবং সম্ভবত মসৃণ) ফলাফল পাবেন।
শন হুইনারি

314

পরিবর্তে আপনার স্কেলওয়াই ব্যবহার করা উচিত।

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 এ তৈরি করেছি এবং আপনার jsfiddle পরিবর্তন করেছি উচ্চতার পরিবর্তে স্কেলওয়াই ব্যবহার করতে।


6
আমি এই উত্তর upvoting করছি কারণ এটি CSS3-রূপান্তরটি সক্ষম ব্রাউজারে ভাল কাজ করে, কিন্তু এটা উল্লেখ করা উচিত যে, এই ইন্টারনেট <9 এ সব কাজ করবে না , এবং (এটা শুধু তিড়িং লাফ হবে) প্রাণবন্ত হতে অভ্যস্ত IE তে <10
হাইলউড

215
এই পদ্ধতিটি কেবল আংশিকভাবে পছন্দসই প্রভাব অর্জন করে তবে স্থানটি সরিয়ে দেয় না । রুপান্তরিত বাক্স তুলনামূলকভাবে অবস্থানযুক্ত উপাদানের মতো কাজ করে - স্থানটি এটি কীভাবে স্কেল করা যায় না কেন তা গ্রহণ করা হয়। পরীক্ষা করে দেখুন এই jsFiddle যা আপনার প্রথম এক লাগে এবং মাত্র নীচে কিছু বাজে টেক্সট যোগ করে। নোটটি যখন বাক্সের উচ্চতা শূন্যের আকারে বাড়ানো হয় তখন কীভাবে নীচের দিকে লেখা যায় না তা নোট করুন।
animuson

9
এখন এটি করে: jsfiddle.net/gNDX3/1 মূলত আপনার প্রয়োজন অনুযায়ী আপনার উপাদানগুলি স্টাইল করা উচিত। সিএসএস / এইচটিএমএলে আচরণের মতো রূপালী বুলেট বা উইজেট নেই।
dotnetCarpenter

70
আমি কাউকে বিভিন্ন পদ্ধতির চেষ্টা করে প্রশংসা করার সময়, এই সমাধানটি নিয়ে আসল-বাস্তব প্রভাব এবং জটিলতাগুলি ইতিমধ্যে ভয়ঙ্কর সর্বোচ্চ-উচ্চতার হ্যাকের চেয়েও খারাপ। দয়া করে ব্যবহার করবেন না।
mystrdat

2
@ স্কয়ারগ্যাট ঠিক আছে ঠিক আছে। এখানে এমন আরও একটি ড্রয়ারের মতো: jsfiddle.net/dotnetCarpenter/WTL2r
dotnetCarpenter

202

জড়িত উচ্চতাগুলির মধ্যে একটি যখন আপনি বর্তমানে উচ্চতায় সঞ্চার করতে পারবেন না auto, আপনাকে দুটি সুস্পষ্ট উচ্চতা নির্ধারণ করতে হবে।


12
সমস্যা সমাধানের জন্য সাধারণত একাধিক উপায় রয়েছে এবং সেগুলি সবই উপযুক্ত বা সম্ভব নয় are আমি জানি না কেন @ জেদিদিয়াহুর্ট এবং রায়ান অরে কোনও প্রশ্নোত্তর সাইটে সম্ভাব্য উত্তরগুলি সীমাবদ্ধ করার চেষ্টা করছে। বিশেষত এই উত্তরটি বিবেচনা করে প্রথমে এখানে ছিল। সন্দেহজনক কারণ যেহেতু স্বীকৃত উত্তরটি একান্তই কার্যকর নয়।
হুরয় আই এম

5
@ জেকের উত্তরটি মার্জিত বা সঠিক নয়। এখানে লিঙ্কযুক্ত উত্তর আরও ভাল। এটি সঠিকভাবে কাজ করে এবং সমস্ত আকারের কেস পরিচালনা করে - গৃহীত উত্তর সম্পর্কেও বলা যায় না।
গ্রাফিক্সমুনচার

5
হ্যাঁ: এটি করেthis.$element[dimension](this.$element[dimension]())[0].offsetHeight
অ্যান্ডি

4
এটি কি কোনওভাবে ঠিক করার পরিকল্পনা করা হচ্ছে? আমি বলতে চাইছি, 0 উচ্চতা থেকে রূপান্তর করতে সক্ষম হবেন আশা করা খুব প্রাকৃতিক auto...
অগাস্টিন রিডিংগার

6
@ মেলোডাস "না / আপনি পারবেন না" স্ট্যাক ওভারফ্লো সম্পর্কিত প্রশ্নের একটি বৈধ এবং গ্রহণযোগ্য উত্তর।
টাইলারহ

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 স্লাইডআপ / ডাউন এর মতো নয় like আপনি কেবল পুরানো কম্পিউটার বা মোবাইলের মতো দুর্বল সিপিইউতে এবং একই সাথে তাদের অনেকগুলি খুলতে এবং বন্ধ করার সাথে একটি পার্থক্য দেখতে পাবেন।
ক্রুজ নুনেজ

3
আপনার যদি বাটন বা অন্য কোনও পাঠ্যবিহীন উপাদান রয়েছে তবে আপনি ঘোরাফেরা না করার সময় অযাচিত সাদা বাক্সে শেষ করবেন।
ডেনিস ডাব্লু

3
আপনি *অন্যান্য পরিবর্তনগুলির সাথে সমস্ত শিশু উপাদান নির্বাচন করে এটি আরও পরিমার্জন করতে পারেন । বাটনগুলি আমার উপরের কোড দ্বারা প্রভাবিত হওয়া উচিত, তবে যদি সেগুলি সঠিকভাবে স্টাইল করা হয় em
স্টিভেন ওয়াচন 21

1
আমার ক্ষেত্রে, আমারও যুক্ত করা দরকার ছিল line-height: 0;এবংborder-width: 0;
আন্দ্রে শ্যাটিলভ

1
আপনি line-heightমানটির সঠিকভাবে ইউনিটগুলি এড়িয়ে চললে আপনার সামঞ্জস্য করার প্রয়োজন হবে না : বিকাশকারী.মোজিলা.আর.ইন-
স্টিভেন ওয়াচন

93

আমি জানি এটি এই প্রশ্নের ত্রিশতম উত্তর, তবে আমি মনে করি এটি মূল্যবান, সুতরাং এখানে চলে যায় goes এটি নিম্নলিখিত বৈশিষ্ট্যগুলির সাথে একটি সিএসএস-কেবল সমাধান:

  • শুরুতে কোনও বিলম্ব নেই, এবং রূপান্তরটি প্রথম দিকে থামবে না। উভয় দিকনির্দেশে (প্রসারণ এবং ধসে পড়া), আপনি যদি নিজের সিএসএসে 300 মাইলের একটি রূপান্তর সময় নির্দিষ্ট করে থাকেন, তবে স্থানান্তরটি 300 মিমি, সময়কাল গ্রহণ করে।
  • এটি প্রকৃত উচ্চতাকে রূপান্তরিত করছে (বিপরীতে transform: scaleY(0) ), তাই সংযোগযোগ্য উপাদানগুলির পরে সামগ্রী থাকলে সঠিক কাজটি করে।
  • যদিও (অন্যান্য সমাধান মত) সেখানে আছে যাদু সংখ্যা (মত "দৈর্ঘ্য বেশী আপনার বাক্স কি কখনো হতে যাচ্ছে যে বাছাই"), তাই না মারাত্মক যদি আপ ভুল হচ্ছে আপনার ধৃষ্টতা প্রান্ত। সেক্ষেত্রে রূপান্তরটি আশ্চর্যজনক নাও লাগতে পারে, তবে সংক্রমণের আগে এবং পরে, এটি কোনও সমস্যা নয়: প্রসারিত ( height: auto) অবস্থায়, পুরো সামগ্রীতে সর্বদা সঠিক উচ্চতা থাকে (উদাহরণস্বরূপ, যদি আপনি কোনওটিকে বেছে max-heightনেন তবে অনেক কম). এবং ধসে পড়া অবস্থায়, উচ্চতাটি শূন্যের মতো হওয়া উচিত।

ডেমো

এখানে তিনটি সঙ্কুচিত উপাদানগুলির সাথে একটি ডেমো রয়েছে যা বিভিন্ন উচ্চতা সমস্তই একই সিএসএস ব্যবহার করে। আপনি "স্নিপেট চালান" ক্লিক করার পরে "পুরো পৃষ্ঠাতে" ক্লিক করতে চাইতে পারেন। নোট করুন যে জাভাস্ক্রিপ্টটি কেবল collapsedCSS ক্লাসকে টোগল করে , এতে কোনও পরিমাপ জড়িত থাকে না। (আপনি কোনও চেকবক্স ব্যবহার করে বা কোনও জাভাস্ক্রিপ্ট ছাড়াই এই সঠিক ডেমোটি করতে পারেন :target)) এছাড়াও লক্ষ করুন যে সিএসএসের যে অংশটি রূপান্তরটির জন্য দায়ী তা বেশ সংক্ষিপ্ত এবং এইচটিএমএলকে কেবলমাত্র একটি অতিরিক্ত অতিরিক্ত মোড়কের উপাদান প্রয়োজন।

$(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জন্য সম্পত্তি ব্যবহার করছি না ; তারপরে আরও)।

এখানে একটি অ্যানিমেশন যা দেখায় যে নীচের মার্জিন রূপান্তরকে ন্যূনতম উচ্চতা ট্রানজিশনের সাথে কীভাবে সংযুক্ত করা হয়, উভয় সমতুল্য সময়কালই আমাদের পূর্ণ উচ্চতা থেকে শূন্য উচ্চতায় একত্রিত রূপান্তর দেয় যা একই সময়কালে রয়েছে।

উপরে বর্ণিত হিসাবে অ্যানিমেশন

বাম বারটি দেখায় যে নেতিবাচক নীচের মার্জিনটি দৃশ্যমান উচ্চতা হ্রাস করে নীচে উপরের দিকে কীভাবে চাপ দেয়। মাঝের বারটি দেখায় যে ন্যূনতম উচ্চতা কীভাবে নিশ্চিত হয় যে সংঘর্ষের ক্ষেত্রে, সংক্রমণটি খুব শীঘ্রই শেষ হয় না এবং প্রসারণের ক্ষেত্রে, স্থানান্তর দেরিতে শুরু হয় না। ডান দণ্ডটি দেখায় যে কীভাবে দুটির সংমিশ্রণটি বক্সকে সঠিক উচ্চতায় পুরো উচ্চতা থেকে শূন্য উচ্চতায় স্থানান্তরিত করে।

আমার ডেমোর জন্য আমি উপরের সর্বনিম্ন উচ্চতার মান হিসাবে 50px এ স্থির হয়েছি। এটি দ্বিতীয় যাদু নম্বর, এবং এটি বাক্সের উচ্চতার চেয়ে কম হওয়া উচিত। 50px পাশাপাশি যুক্তিসঙ্গত বলে মনে হয়; এটি অসম্ভব বলে মনে হয় যে আপনি প্রায়শই এমন একটি উপাদানকে সংযোগযোগ্য করে তুলতে চান যা প্রথম স্থানের চেয়ে 50 পিক্সেল বেশি নয়।

অ্যানিমেশনটিতে আপনি দেখতে পাচ্ছেন, ফলস্বরূপ পরিবর্তনটি অবিচ্ছিন্ন, তবে এটি পৃথক নয় - এই মুহুর্তে যখন ন্যূনতম উচ্চতা নীচের মার্জিনের সাথে সামঞ্জস্য করা পূর্ণ উচ্চতার সমান হয় তখন গতিতে হঠাৎ পরিবর্তন ঘটে। এটি অ্যানিমেশনটিতে খুব লক্ষণীয় কারণ এটি উভয় ট্রানজিশনের জন্য লিনিয়ার টাইমিং ফাংশন ব্যবহার করে এবং পুরো রূপান্তরটি খুব ধীর গতির কারণে। প্রকৃত ক্ষেত্রে (শীর্ষে আমার ডেমো), রূপান্তরটি কেবল 300 মিমি নেয় এবং নীচের প্রান্তিক রূপান্তরটি লিনিয়ার নয়। আমি উভয় স্থানান্তরের জন্য বিভিন্ন সময়সীমার সাথে প্রচুর পরিমাণে খেলা করেছি এবং যেগুলি আমি শেষ করেছিলাম তারা মনে করেছিল যে তারা বিস্তৃত বিভিন্ন ক্ষেত্রে সবচেয়ে ভাল কাজ করেছে।

দুটি সমস্যার সমাধান করতে বাকি রয়েছে:

  1. উপরের দিকটি, যেখানে ২০০০ পিক্সেলের বেশি উচ্চতার বাক্সগুলি ধসে পড়া অবস্থায় পুরোপুরি গোপন নেই,
  2. এবং বিপরীত সমস্যা যেখানে অ গোপনীয় ক্ষেত্রে, 50 পিক্সেলের চেয়ে কম উচ্চতার বাক্সগুলি ট্রানজিশনটি চলমান না হওয়া সত্ত্বেও খুব বেশি হয়, কারণ সর্বনিম্ন উচ্চতা তাদের 50 পিক্সেলে রাখে।

আমরা প্রথমে সমস্যার সমাধান করে কনটেইনার উপাদানটিকে max-height: 0ধসে পড়ার ক্ষেত্রে একটি 0s 0.3sরূপান্তর দিয়ে the এর অর্থ এটি সত্যই কোনও রূপান্তর নয়, তবে max-heightবিলম্বের সাথে প্রয়োগ করা হয়; রূপান্তরটি শেষ হয়ে গেলেই এটি প্রয়োগ হয়। এটি সঠিকভাবে কাজ করার max-heightজন্য, আমাদের বিপরীত, নষ্ট না হওয়া, রাষ্ট্রের জন্য একটি সংখ্যাও বাছাই করতে হবে । তবে 2000px ক্ষেত্রে বিপরীতে, যেখানে সংখ্যার বেশি সংখ্যক বাছাই করা স্থানান্তরের মানকে প্রভাবিত করে, এক্ষেত্রে, এটি সত্যিই কিছু যায় আসে না। সুতরাং আমরা কেবল এমন একটি সংখ্যা বাছাই করতে পারি যা এত বেশি যে আমরা জানি যে কোনও উচ্চতা এর কাছাকাছি আসতে পারবে না। আমি এক মিলিয়ন পিক্সেল বাছাই করেছি। আপনি যদি মনে করেন আপনার মিলিয়ন পিক্সেলের বেশি উচ্চতার সামগ্রীর সমর্থন করতে পারে তবে 1) আমি দুঃখিত, এবং 2) কেবল কয়েক শূন্য যোগ করুন।

দ্বিতীয় সমস্যা হ'ল কারণ আমরা আসলে ব্যবহার করছি না min-height ন্যূনতম উচ্চতার রূপান্তরের জন্য । পরিবর্তে, ::afterধারকটিতে একটি সিউডো-উপাদান রয়েছে যা height50px থেকে শূন্যে রূপান্তর করে। এটির মতো একই প্রভাব রয়েছে min-height: এটি সিউডো-এলিমেন্টের বর্তমানে যে উচ্চতার নীচে কন্টেইনারটি সঙ্কুচিত হতে দেবে না। তবে যেহেতু আমরা ব্যবহার করছি height, তা নয় min-height, আমরা এখন max-heightসিউডো-এলিমেন্টের আসল উচ্চতা শূন্যে সেট করার জন্য সিউডো-এলিমেন্টের প্রকৃত উচ্চতা শূন্যে সেট করতে ব্যবহার করতে পারি , অন্তত রূপান্তরের বাইরে এমনকি ছোট উপাদানগুলিরও নিশ্চিত হয়ে থাকে সঠিক উচ্চতা কারণ min-heightহল শক্তিশালী চেয়ে max-height, এই যদি আমরা ধারক এর ব্যবহৃত কাজ করবে না । ঠিক যেমনmin-height পরিবর্তে সিউডো-উপাদান এরheightmax-heightপূর্ববর্তী অনুচ্ছেদে, max-heightএর উত্তরণের বিপরীত প্রান্তের জন্যও একটি মান প্রয়োজন। তবে এই ক্ষেত্রে আমরা কেবল 50px বাছাই করতে পারি।

ক্রোমে পরীক্ষিত (উইন, ম্যাক, অ্যান্ড্রয়েড, আইওএস), ফায়ারফক্স (উইন, ম্যাক, অ্যান্ড্রয়েড), এজ, আইই ১১ (আমার ডেমোতে একটি ফ্লেক্সবক্স লেআউট ইস্যু ছাড়া যে আমি ডিবাগিংয়ে বিরক্ত করি নি), এবং সাফারি (ম্যাক, আইওএস) )। ফ্লেক্সবক্সের কথা বলতে গেলে কোনও ফ্লেক্সবক্স ব্যবহার না করেই এই কাজটি করা সম্ভব হওয়া উচিত; আসলে আমি মনে করি আপনি প্রায় সবই আই 7 তে কাজ করতে পারবেন - আপনার সিএসএস রূপান্তর হবে না তা বাদ দিয়ে একে একে অর্থহীন অনুশীলন করে তোলা।


35
আমি আশা করি আপনি নিজের সমাধানটি কমিয়ে (সহজতর) করতে পারলেন বা কোড উদাহরণটি কমপক্ষে - দেখে মনে হচ্ছে কোডের 90% উদাহরণটি আপনার উত্তরের সাথে প্রাসঙ্গিক নয়।
গিল এপশেটেন

যদি এই collapsible-wrapperঅবস্থানের পরম হয় তবে এই রূপান্তরগুলিও কার্যকর করার কোনও উপায় আছে ? overflow: hiddenপিতা বা মাতা এই অবস্থান্তরটি কিন্তু পরিপূর্ণভাবে পজিশন করা বিষয়গুলি হস্তক্ষেপ প্রয়োজন।
pmkro

1
@ পিএমক্রো হ্যাঁ, আমারও সমস্যা ছিল। আমি এটির clip-path: polygon(...)পরিবর্তে এর পরিবর্তে এটি ব্যবহার করে সমাধান করেছি overflow: hiddenকারণ পরবর্তীকালের বিপরীতে, আপনি পূর্ববর্তীটিকে স্থানান্তর করতে পারেন। পুরানো ব্রাউজারগুলির ফ্যালব্যাক হিসাবে আমি একটি অতিরিক্ত স্কেলিং রূপান্তর ব্যবহার করেছি used Github.com/StackExchange/Stacks/blob/develop/lib/css/compferences/…
বলফা

2
খুশী হলাম। এটি সত্যিই ভাল কাজ করে। গ্রহণযোগ্য উত্তর হওয়া উচিত
হেনরি ইন-সিমন্স

83

আপনি কিছুটা অ-শব্দার্থিক জিগ্রি-পোকারি সহ করতে পারেন। আমার স্বাভাবিক পদ্ধতির বহিরাগত ডিআইভির উচ্চতা অ্যানিমেট করা যা একটি একক শিশু রয়েছে যা কেবল স্টাইল-কম ডিআইভি যা কেবলমাত্র সামগ্রীর উচ্চতা মাপার জন্য ব্যবহৃত হয়।

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
যেহেতু এটি জাভাস্ক্রিপ্টের উপর নির্ভর করে, আপনি খুব সহজেই জাভাস্ক্রিপ্ট ব্যবহার করে পরিমাপের র্যাপার যুক্ত করতে পারেন!
কুইক্রেডফক্স

18
আপনি মোড়ক ছাড়া এটি করতে পারেন। জাস্ট: ফাংশন গ্রোডিভ () {var গ্রোডাভ = ডকুমেন্ট.জেট এলিমেন্টবাইআইডি ('বৃদ্ধি'); if (বৃদ্ধিDiv.clientHeight) {বৃদ্ধিDiv.style.height = 0; } অন্য {গ্রোডিভ.স্টাইল.হাইট = গ্রেডডিভ.স্ক্রোলহাইট + 'পিক্স'; }}
user1742529

8
এটি পরীক্ষা করে দেখুন ... একটি সহজ উত্তর সম্পর্কে কথা বলুন jsfiddle.net/n5XfG/2596 ... আপনার উত্তরটি কোনও অকারণে উন্মত্তভাবে জটিল। জন্য কোন প্রয়োজন নেই max-height, প্রয়োজন নেই auto, বিশেষ করে জাভাস্ক্রিপ্ট জন্য কোন প্রয়োজন !! মাত্র দুটি সাধারণ ঘোষণা
3

12
@ ভিডি ডিজাইনজ আপনি মার্জিনের চেয়ে বেশি অ্যানিমেট: 100%। এটি উপাদানটির প্রস্থের 100% নয়, উচ্চতা নয়! এর অর্থ হ'ল যদি আপনার প্রস্থের চেয়ে প্রস্থের চেয়ে উচ্চতাযুক্ত কোনও উপাদান থাকে তবে এটি এটি আড়াল করে না। এছাড়াও, প্রকৃত অ্যানিমেশনের গতি নির্ধারিতের চেয়ে সম্পূর্ণ আলাদা।
টিমো টারশম্যান

3
টিমোর মন্তব্য সম্পর্কে আরও পড়ার আগে পর্যন্ত আমি ভিআইডি ডিজাইনজের উত্তরটি সম্পর্কে উত্তেজিত ছিলাম। হ্যাঁ, 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/ (স্টেপব্যান্ডের উপরের জেএসফিডেলটি ছড়িয়ে দেওয়া)


3
আমি মনে করি এটিই সেরা উত্তর। এই কৌশলটি বাচ্চাদের মধ্যে প্যাডিং সামঞ্জস্য করতেও প্রসারিত করতে পারে। আমার ক্ষেত্রে আমি প্রকাশিত কিছু সামগ্রীর উপর সুস্পষ্ট উচ্চতা ট্রানজিশনের সাথে এটি একত্রিত করতে সক্ষম হয়েছি এবং মোট প্রভাবটি সর্বোচ্চ-উচ্চতার কাজের চেয়ে অনেক বেশি সফল, যা প্রকাশের পক্ষে ঠিক আছে তবে একটি বিশ্রী মুহুর্তের পরিচয় দেয় আড়াল হতে দেরি আমার অ্যাপটি প্রতিক্রিয়াহীন বলে মনে হচ্ছে এমন অর্থহীন বিলম্বের পরিবর্তে আমি খুব শীঘ্রই প্রাণবন্ত হইনি। আমি অবাক হয়েছি তাই অনেকের মনে হয় এটি গ্রহণযোগ্য।
সেমিকোলন

17
এখানে বাদে আপনি উচ্চতাটি মোটেও অ্যানিমেট করছেন না। আপনি প্যাডিংটি অ্যানিমেট করছেন ... এটি ঠিকই অদৃশ্য হয়ে যেতে পারে কারণ এটি বর্তমান অবস্থা থেকে 0 এনিমেট করতে পারে তবে এটি প্রসারিত হওয়ার সাথে যদি আপনি ঘনিষ্ঠভাবে লক্ষ্য করেন তবে এটি পাঠ্যের সাথে খোলা হবে এবং প্যাডিংটি কেবল অ্যানিমেটস .. কারণ এটি না 0 থেকে অটোতে কীভাবে অ্যানিমেট করা যায় তা জানেন না .... এটির জন্য একটি সংখ্যার পরিসীমা দরকার ... এভাবেই টিউনিং কাজ করে।
রব আর

এটি একটি ভাল কাজ যা হ্যাকি নয়। এটি এই প্রশ্নের সেরা উত্তর নয় , তবে এটি একটি বিকল্প যা আমার পক্ষে কাজ করেছে। কখনও কখনও আপনার কিছু উচ্চতা অ্যানিমেশনের প্রভাব প্রয়োজন, সম্পূর্ণ অ্যানিমেশন নয় :)
ইভান ডার্স্ট

এই সমাধানটি স্থানান্তর দেরি করার সময়ও ব্যর্থ হয়।
মিশেল জোয়ানিসে

আমি এও সম্মত হই যে এই সমাধানটি একটি পরিচ্ছন্ন কর্মরূপ যা আপনার অ্যানিমেশনটি দ্রুত পর্যাপ্ত হলে (আমার ক্ষেত্রে এটি 0.1 এর ট্রানজিশনের সাথে চুক্তির জন্য উপযুক্ত)! যদিও এটি প্রচুর অ্যাপ্লিকেশন স্যুট করবে না, তবে অন্যরাও এই প্রশ্নের উত্তর দেবে না!
রেমি ডি

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
@ ডেরিজা ৯৩ এটি প্লেইন পুরানো জাভাস্ক্রিপ্ট টাইমআউট অ্যানিমেশন ব্যবহার করছে। পরিবর্তে CSS3 রূপান্তরগুলি ব্যবহার করা চ্যালেঞ্জ।
আদম

3
হ্যাঁ ঠিক. তবে আপনি যদি তার পরিবর্তে "সিএসএস 3 ট্রানজিশনগুলি" কেন ব্যবহার করেন, যদি আপনি উদাহরণস্বরূপ, ইতিমধ্যে jQuery, একটি লাইব্রেরি ব্যবহার করে যা প্রচুর পরিমাণে "কম লেখেন, আরও কিছু করুন" যেভাবেই কোড সরবরাহ করে? আমি এটি উল্লেখ করতে চেয়েছিলাম যে আপনার সংস্করণটি আরও জটিল দেখায়, আরও জটিল হলেও, যদি এটি jQuery ব্যবহার না করে থাকে তবে এটি কার্যত কোনও ওয়েবসাইটে চালিত হতে পারে। আমার ধারণা আমি এটিকে ভারী ভুল বলেছি। সেটার জন্য দুঃখিত. ;)
কিউরুস

27
@ ডেরিজা 93 সম্ভবত কারণ CSS3 রূপান্তরগুলি (সমস্ত উত্স অনুসারে আমি খুঁজে পেতে পারি) jQuery অ্যানিমেশনগুলির চেয়ে অনেক বেশি ভাল পারফরম্যান্স করেছে। (প্রকৃতপক্ষে আমার বর্তমান ব্যবহারের ক্ষেত্রে আমি এখানে এনেছি, তার জন্য বিশাল বিষয়গুলি রয়েছে))
মার্ক অ্যামেরি

4
@ ডেরিজা 93 'জাভাস্ক্রিপ্ট অ্যানিমেশনগুলি CSS3 স্থানান্তর ব্রের তুলনায় ধীরে ধীরে সঞ্চালিত হয় এবং jQuery অ্যানিমেশনগুলির সাথে আপনাকে অ্যানিমেশন লুপ সম্পর্কে চিন্তা করতে হবে। ক্লিকে কিছু অ্যানিমেট করুন, তারপরে দ্রুত ক্লিক করুন এবং অ্যানিমেশনগুলি পুনরাবৃত্তি করার সাথে সাথে দেখুন। এটি CSS3 দিয়ে পরিচালিত হয়।
AlbertEngelB

2
@ Dropped.on.Caprica এটি এখন একটু পুরাতন। আমি ইতিমধ্যে বলেছি যে ধারণাটি তিনি প্রদর্শনের চেষ্টা করছেন আমি ভুল বুঝেছি। যাইহোক, সাধারণ অ্যানিমেশনের .stopজন্য, জটিল অ্যানিমেশন লুপ সমস্যার জন্য কৌশলটি করে। এখন আপনি যখন উচ্চতা এবং রঙ অ্যানিমেট করেন তবে কেবল উচ্চতা অ্যানিমেশনটি ব্যাহত করতে চান, জিনিসগুলি একটু কৌশলযুক্ত হয়ে যায় ... আমি আপনার বক্তব্যটি পাই।
কিরুস

43

গৃহীত উত্তর বেশিরভাগ ক্ষেত্রেই কাজ করে, তবে যখন আপনার divউচ্চতার পরিমাণে বিস্তৃত হতে পারে তখন এটি ভাল কাজ করে না - অ্যানিমেশন গতি সামগ্রীর প্রকৃত উচ্চতার উপর নির্ভর করে না এবং এটি চপ্পল দেখতে পারে।

আপনি এখনও সিএসএসের সাহায্যে প্রকৃত অ্যানিমেশনটি সম্পাদন করতে পারেন, তবে আইটেমগুলির উচ্চতা গণনা করার জন্য আপনাকে জাভাস্ক্রিপ্ট ব্যবহার করতে হবে, ব্যবহারের চেষ্টা না করে auto। কোনও জিকিউরির প্রয়োজন নেই, যদিও আপনি সামঞ্জস্যতা চাইলে এটি আপনাকে কিছুটা সংশোধন করতে হতে পারে (ক্রোমের সর্বশেষ সংস্করণে কাজ করে :))।

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
আপনি কেবল কোনও ডিওএম উপাদান (উদাহরণস্বরূপ, থেকে document.getElementById('mydiv')বা $('#mydiv').get()) পাস করেছেন এবং ফাংশনটি এটি লুকিয়ে রাখা / দেখানোর মধ্যে টগল করে। আপনি যদি সিএসএস স্থানান্তরগুলি সেট আপ করেন তবে উপাদানটি স্বয়ংক্রিয়ভাবে অ্যানিমেট হবে।
ওলেগ ভাস্কেভিচ

আমি একটি স্নিপেট যোগ করেছি। গতিশীল আকারের সামগ্রীর জন্য ভালভাবে কাজ করার সুবিধা রয়েছে।
ওলেগ ভাস্কেভিচ

3
-1, যেহেতু এটি "সিএসএস ব্যবহার" নয়। প্রশ্নের মূল বিষয়টি জেএস-মুক্ত সমাধানের জন্য। আমি মনে করি "সঠিক" উত্তরটি, এটি হ্যাক নয়, যদিও এটি
হ'ল

16
জেএস ব্যবহারের জন্য ডাউনভোট - সিরিয়াসলি? এখানে অর্ধেক উত্তর জেএস ব্যবহার করে, সুতরাং আপনার ডাউনভোটটি সুষ্ঠু বা প্রয়োজনীয় বলে মনে হচ্ছে না। এছাড়াও, এই উত্তরটি এখনও সত্যিকারের অ্যানিমেশন সম্পাদন করতে সিএসএস ব্যবহার করছে যা আইএমও ওপির মূল বিষয় ছিল। শুধু জাতীয় জন্য ব্যবহার করা হয় প্রকৃত উচ্চতা গনা, যেমন হয় অসম্ভব বিশুদ্ধ CSS এর সঙ্গে তা করতে (এবং সেটিং min-heightহিসেবে প্রত্যাশিত উত্তর অ্যানিমেশনের গতি সমস্যা যখন তালিকার আকার ব্যাপকভাবে পরিবর্তিত হতে পারে কারণ)।
ওলেগ ভাস্কেভিচ

30

Element.scrollHeightসম্পত্তিটির খুব কম উল্লেখ ছিল যা এখানে কার্যকর হতে পারে এবং এখনও একটি খাঁটি সিএসএস রূপান্তর ব্যবহার করা যেতে পারে। ধীরে ধীরে উচ্চতা (উদাঃ height: 0) এর ফলস্বরূপ এর সামগ্রীটি কীভাবে ও কীভাবে প্রবাহিত হবে তা নির্বিশেষে সম্পত্তিটিতে সর্বদা একটি উপাদানের "পূর্ণ" উচ্চতা থাকে ।

যেমন, height: 0(কার্যকরভাবে সম্পূর্ণরূপে ধসে) উপাদানগুলির জন্য, এর "স্বাভাবিক" বা "পূর্ণ" উচ্চতা এখনও তার scrollHeightমান (অবিচ্ছিন্নভাবে একটি পিক্সেল দৈর্ঘ্য) এর মাধ্যমে সহজেই উপলব্ধ ।

এই জাতীয় উপাদানটির জন্য, ধরে নিই এর ইতিমধ্যে যেমন রূপান্তর সেট আপ হয়েছে ( ulমূল প্রশ্ন অনুসারে ব্যবহার করা):

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

আমরা নিম্নলিখিতগুলির মতো কিছু ব্যবহার করে কেবল সিএসএস ব্যবহার করে উচ্চতার কাঙ্ক্ষিত অ্যানিমেটেড "সম্প্রসারণ" ট্রিগার করতে পারি (এখানে ধরে নেওয়া যায় যে 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
সিএসএসের অন্যান্য দুটি সিউডো-ক্লাস বাদে প্রচুর অন্যান্য অংশ রয়েছে যা এই সমস্যাটিকে সমাধান করতে পারে, পৃষ্ঠা 1 এর শো-তে সর্বোচ্চ-আপোভিত উত্তর হিসাবে। জাভাস্ক্রিপ্টে একটি স্টাইল সেট করা "খাঁটি সিএসএস" নয় কারণ এটির জন্য প্রথম স্থানে জেএস প্রয়োজন। প্রায়শই যখন কোনও ব্যক্তি সিএসএস-কেবল সমাধানের জন্য জিজ্ঞাসা করেন, কারণ এটি কোনও জাভাস্ক্রিপ্ট ইনজেক্ট করতে সক্ষম হয় না, বা তাদের বর্তমান প্রকল্প বা ভূমিকা দ্বারা অনুমোদিত হয় না।
টাইলারএইচ

29

ব্যবহারের max-heightবিভিন্ন রূপান্তরটি ঢিলা এবং প্রতিটি রাষ্ট্রের জন্য বিলম্ব হয়।

এইচটিএমএল:

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

সিএসএস:

#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। এটি, অন্যদিকে, আপনার অ্যানিমেশনটি স্থানান্তর করবে, কারণ ফ্রেমগুলি এই মান থেকে গণনা করা হয়। সুতরাং আপনি অ্যানিমেশনটি "দেরি" সহ এক দিকে এবং অন্য দিকে সত্যিই দ্রুত শেষের সাথে শেষ করতে পারেন (কর্নার: সময়জ্ঞান)
জুলিয়ান এফ ওয়েইনার্ট

29

কোনও হার্ড কোডিং মান নেই।

জাভাস্ক্রিপ্ট নেই।

কোন অনুমান।

কৌতুকটি হ'ল একটি লুকানো এবং সদৃশ ব্যবহার divকরার জন্য ব্রাউজারটি 100% এর অর্থ বুঝতে।

আপনি যখনই প্রাণবন্ত করতে চান এমন উপাদানটির 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>


সুন্দরভাবে সম্পন্ন - এটি এমন কোনও সমস্যার বৈধ সমাধান যা সত্যই বিদ্যমান থাকতে পারে না। সীমাবদ্ধতাটি "রৈখিক" এ সেট না করা সর্বাধিক উচ্চতা অ্যানিমেট করা বেস, এটি সিএমএস বিষয়বস্তু যেখানে উচ্চতা পরিবর্তনশীল সেখানে অ্যানিমেট করার জন্য এটি (স্পষ্টতই) খুব খারাপ।
এম_ওয়িলিট

এটি চতুর, তবে আমি এর জন্য ডিওএম উপাদান এবং বিষয়বস্তু সদৃশ করতে স্বাচ্ছন্দ্যবোধ করব না।
আন্দ্রে ফিগুয়েরেদো

আপনি এটি কোনও ধারক ছাড়াই এবং অ্যানিমেট করে আরও পারফরম্যান্ট transform: scaleY(1)করতে পারেন, কারণ এই রূপান্তরটি স্থানটি সরিয়ে দেয় না।
ফ্যাবিয়ান ভন এলার্টস

21

আমি এটি পোস্ট করার সাথে সাথে ইতিমধ্যে 30 টিরও বেশি উত্তর রয়েছে তবে আমি মনে করি জ্যাকের দ্বারা ইতিমধ্যে স্বীকৃত উত্তরের উপর আমার উত্তরটি উন্নত ।

কেবল এই max-heightমন্তব্য এবং CSS3 রূপান্তরগুলি থেকে উদ্ভূত সমস্যাটি নিয়ে আমি সন্তুষ্ট ছিলাম না , যেহেতু অনেক মন্তব্যকারী উল্লেখ করেছেন যে আপনাকে নিজের max-heightমানটি প্রকৃত উচ্চতার খুব কাছাকাছি সেট করতে হবে অথবা আপনি বিলম্ব পাবেন। এই জেএসফিডেলটি দেখুন জন্য ।

এটি পেতে (এখনও কোনও জাভাস্ক্রিপ্ট ব্যবহার না করার সময়), আমি আরও একটি এইচটিএমএল উপাদান যুক্ত করেছি যা transform: translateYসিএসএস মানকে রূপান্তর করে ।

এর অর্থ উভয়ই 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>


চমৎকার তুলনা @ ডেভিডটাউবমান, আপনার কলম পার্থক্যগুলি খুব ভালভাবে তুলে ধরেছে! আমি সঙ্গে গিয়েছিলাম translateYউপর scaleকারণ আমি মত কিভাবে নি scaleযে কম্প্রেশন প্রভাব দিলেন।
অ্যান্ড্রু ম্যাসিয়ের

ধন্যবাদ @ অ্যান্ড্রু-মেসিয়ার, আমি মন্তব্যটি মুছে ফেলেছি কারণ একটি ভুল আছে, অনুবাদকো কোডেপেন.আইও / ডেভিডটাউবমান্ন / স্পেন / জিজজেডভিজিপিতে উত্তেজক নয় (কারণ সরানোর কোনও বাচ্চা নেই, একটি স্থির প্রয়োজন) ... তবে এটিতে একমাত্র আমরা কেবলমাত্র সর্বোচ্চ-উচ্চতা থেকে তুলনা দেখতে পারি এবং এটি স্কেলের সাথে মিশ্রিত করতে পারি (অন্যান্য উত্তরে বলা আছে): কোডেপেন.আইও / ডেভিডটব্বমন / ওপেন / জর্পপিআর । আমি যে লক্ষ্যবস্তু পদ্ধতিটি ব্যবহার করছি তা দিয়ে এই সমস্তই আমাকে অনেক সহায়তা করেছে
ডেভিডটবম্যান

18

ঠিক আছে, তাই আমি মনে করি আমি একটি দুর্দান্ত সহজ উত্তর নিয়ে এসেছি ... না max-height, relativeঅবস্থান ব্যবহার করে , কাজ করেli উপাদানগুলিতে , এবং খাঁটি সিএসএস। আমি ফায়ারফক্স ব্যতীত অন্য কোনও ক্ষেত্রে পরীক্ষা করিনি, যদিও সিএসএস বিচার করে এটি সমস্ত ব্রাউজারে কাজ করা উচিত।

সংক্ষিপ্ত বিবরণ: http://jsfiddle.net/n5XfG/2596/

সিএসএস

.wrap { overflow:hidden; }

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

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

এইচটিএমএল

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

13
উপাদানটির উচ্চতা তার প্রস্থের অতিক্রম না করা পর্যন্ত এটি কাজ করবে। এটি কীভাবে শতাংশ ব্যবহার করে মার্জিন গণনা করা হয় তার ভিত্তি: এগুলি উপাদানটির প্রস্থের ভিত্তিতে গণনা করা হয়। সুতরাং আপনার যদি 1000 পিক্সো প্রশস্ত উপাদান থাকে তবে এই সমাধানটি কাজ করার জন্য 1100 পিক্সেলের একটি উপাদান খুব বড় হবে, যার অর্থ আপনাকে সেই নেতিবাচক শীর্ষের প্রান্তিকতা বাড়িয়ে তুলতে হবে। মূলত, এটি উচ্চতা বা সর্বোচ্চ-উচ্চতা ব্যবহার করার মতো হুবহু একই সমস্যা।
দুদেওয়াদ

15

সম্পাদনা: আপডেট করা উত্তরের জন্য নীচে স্ক্রোল করুন
আমি একটি ড্রপ ডাউন তালিকা তৈরি করছিলাম এবং এই পোস্টটি দেখেছি ... অনেকগুলি ভিন্ন উত্তর তবে আমি আমার ড্রপ ডাউন তালিকাটিও ভাগ করে নেওয়ার সিদ্ধান্ত নিয়েছি, ... এটি নিখুঁত নয় তবে কমপক্ষে এটি কেবল সিএসএস ব্যবহার করবে নামিয়ে দিন! আমি রূপান্তরটি ব্যবহার করছি: অনুবাদকে (y) তালিকাকে দর্শনে রূপান্তর
করতে ... আপনি পরীক্ষায় আরও দেখতে পারেন
http://jsfiddle.net/BVEpc/4/
আমি প্রতিটি লি এর পিছনে ডিভ রেখেছি কারণ আমার ড্রপ ডাউন তালিকা আসছে এবং তাদের সঠিকভাবে দেখাতে এটির প্রয়োজন ছিল, আমার ডিভি কোডটি হ'ল:

#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;
}

স্থানান্তরের পরে দ্বিতীয়বার দেরি হয়ে গেছে এবং আমার ড্রপ ডাউন তালিকাটি অ্যানিমেটে বন্ধ হয়ে যাওয়ার
পরে এটি লুকিয়ে যাবে ... আশা করি পরে কেউ এইটির উপকার পাবেন।

সম্পাদনা: আমি কেবলমাত্র এই প্রোটোটাইপ ব্যবহার করে পিপিএলকে বিশ্বাস করতে পারি না! এই ড্রপ ডাউন মেনুটি কেবল একটি সাব মেনুতে এবং এগুলিই !! আমি একটি উন্নততর আপডেট করেছি যা আইটি 8 সমর্থন সহ ltr এবং rtl উভয় দিকের জন্য দুটি উপ মেনু থাকতে পারে।
এলটিআর জন্য ফিডাল
আরটিএল এর জন্য ফিডল
আশা করি কেউ ভবিষ্যতে এই দরকারী খুঁজে পেতে।


11

আপনি উচ্চতা: 0 থেকে উচ্চতায় স্থানান্তর করতে পারেন: স্বয়ংক্রিয়ভাবে সরবরাহ করে যে আপনি ন্যূনতম উচ্চতা এবং সর্বোচ্চ-উচ্চতাও সরবরাহ করেন provide

div.stretchy{
    transition: 1s linear;
}

div.stretchy.hidden{
    height: 0;
}

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

@ স্টুয়ার্ট ব্যাডমিন্টন আপনি কি কাজের উদাহরণ প্রদান করতে পারেন? আমি এটি একসাথে রেখেছি তবে এটি কোথাও কাজ করবে বলে মনে হচ্ছে না :( jsfiddle.net/gryzzly/n5XfG
মিশা রেজলিন

5
সমস্যাটি আপনার রূপান্তর নিয়মের সাথে। এটি কাজ করতে আপনাকে ন্যূনতম এবং সর্বোচ্চ উচ্চতায়ও স্থানান্তর প্রয়োগ করতে হবে। রূপান্তর: উচ্চতা .5s রৈখিক, ন্যূনতম উচ্চতা .5s রৈখিক, সর্বাধিক উচ্চতা .5 এস লিনিয়ার
স্টুয়ার্ট ব্যাডমিন্টন

2
আপনি যা বলেছিলেন ঠিক তেমনই
মিশা রেজলিন

11
অবশ্যই, এটির সাথে একটি সমস্যা আছে। সর্বোচ্চ-উচ্চতা অ্যানিমেটেড করার সময়টি বাক্সের অটো উচ্চতায় স্থানান্তরিত হওয়ার সময় নয়: এটি উচ্চতায় আসে: সর্বোচ্চ-উচ্চতা অ্যানিমেটিং শেষ হওয়ার আগে প্রথমে স্বয়ংক্রিয়ভাবে। একইভাবে, 0 এ রূপান্তর করার সময়, রূপান্তরটি তত্ক্ষণাত্ শুরু হয় না, কারণ সর্বোচ্চ-উচ্চতা উচ্চতার চেয়ে বড় উচ্চতায় শুরু হয়: স্বয়ংক্রিয়ভাবে। সর্বাধিক উচ্চতায় স্থানান্তরিত করা: 1000px এটি পরিষ্কার করে দেয়: jsfiddle.net/n5XfG/11
স্টেপব্যান্ড

আপনি ঠিক বলেছেন, আরও পরীক্ষার সময় আমি এটি লক্ষ্য করেছি। আমি জানি না একটি পূর্ণ উচ্চতা: 0 থেকে উচ্চতা: অটো কখনই বাস্তবায়িত হবে তবে কিছু পরিস্থিতিতে সর্বাধিক উচ্চতা ব্যবহার করা কেবল সিএসএস ব্যবহার করে অন্যথায় অসম্ভব পরিস্থিতি সমাধান করে।
স্টুয়ার্ট ব্যাডমিন্টন

10

ফ্লেক্সবক্স সমাধান

পেশাদাররা:

  • সহজ
  • কোন জেএস
  • মসৃণ পরিবর্তন

কনস:

  • উপাদান একটি নির্দিষ্ট উচ্চতার ফ্লেক্স ধারক মধ্যে রাখা প্রয়োজন

এটি যেভাবে কাজ করে তা হ'ল সর্বদা নমনীয় ভিত্তি থাকা: সামগ্রী সহ উপাদানটিতে অটো এবং তার পরিবর্তে ফ্লেক্স-গ্রো এবং ফ্লেক্স-সঙ্কুচিত হওয়া।

সম্পাদনা করুন: এক্সবক্স ওয়ান ইন্টারফেস দ্বারা অনুপ্রাণিত জেএস ফিডল উন্নত।

* {
  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

@ জ্যাকের উত্তরে সম্প্রসারণ করা, উত্তরণটি সর্বোচ্চ উচ্চতার মান পর্যন্ত চলে যাবে, একটি অত্যন্ত দ্রুত অ্যানিমেশন তৈরি করে - যদি আপনি উভয়ের জন্য ট্রানজিশনগুলি সেট করেন: হোভার এবং অফ করুন তবে আপনি পাগলের গতিটি আরও কিছুটা নিয়ন্ত্রণ করতে পারবেন।

সুতরাং লি: হোভারটি হ'ল যখন মাউস রাজ্যে প্রবেশ করবে এবং তারপরে অনাবৃত সম্পত্তিতে রূপান্তর হবে মাউস ছুটি।

আশা করি এটি কিছুটা কাজে আসবে।

উদাহরণ:

.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 -1 পেয়েছে। আমি আসলে মনে করি জাভাস্ক্রিপ্টের বোঝা যুক্ত কিছু লোকের চেয়ে এটি একটি ভাল প্রচেষ্টা। এটি একটি নিখুঁত সমাধান নয়, তবে কিছু টুইট করে এটি একটি ভাল কাজ করে, আমি এটি রিটার্ন ভ্যালুতে কাজ করতে পেলাম। রূপান্তর: সমস্ত 500 মিমি কিউবিক-বেজিয়ার (0.000, 1.225, 0.085, 0.385); এটি প্রাথমিক অবস্থায় ফিরে যাওয়ার জন্য উপরের কোডটি খোলার আগে 2 সেকেন্ডারের উপর ভিত্তি করে তৈরি হয়েছিল। ধন্যবাদ ... এটি আমাকে উপরের সমস্তটির চেয়ে ভালভাবে সহায়তা করেছে। +1 আমি এই সাইটটি বেজিয়ার
ম্যাথিউলিন.

ঠিক আছে এটি কিছুটা বেশি টুইট করেছে। রূপান্তর: সমস্ত 500 মিমি কিউবিক-বেজিয়ার (0.000, 1.390, 0.000, 0.635); আমার ট্রানজিশনটি 5% -100% থেকে চলে যেতে হবে (তবে বাস্তবে শেষ মানটি প্রায় 28%) তাই এটি প্রকল্পের উপর নির্ভর করে।
gcoulby

অবশ্যই, এটি আদর্শ নয়, তবে এটির দ্রুত সমাধান যদি আপনি জানেন যে গড় উচ্চতা কত হবে round
জ্যামি

7

আমি মনে করি আমি সত্যিই একটি কঠিন সমাধান নিয়ে এসেছি

ঠিক আছে! আমি জানি এই সমস্যাটি ইন্টারনেটের মতোই পুরানো তবে আমি মনে করি আমার একটি সমাধান রয়েছে যা আমি মিউট্যান্ট-ট্রানজিশন নামে একটি প্লাগইনে পরিণত করেছি । আমার সমাধান style=""ট্র্যাক হওয়া উপাদানগুলির জন্য বৈশিষ্ট্যগুলি সেট করে যখনই ডিওমে কোনও পরিবর্তন আসে। শেষ ফলাফলটি হ'ল আপনি আপনার স্থানান্তরের জন্য ভাল ওলে সিএসএস ব্যবহার করতে পারেন এবং হ্যাকি ফিক্স বা বিশেষ জাভাস্ক্রিপ্ট ব্যবহার করতে পারবেন না। আপনাকে কেবলমাত্র যা করতে হবে তা হ'ল আপনি ব্যবহারের ক্ষেত্রে যে উপাদানটি ট্র্যাক করতে চান তা সেট করে data-mutant-attributes="X"

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

এটাই! এই সমাধানটি ডিওমে পরিবর্তনগুলি অনুসরণ করতে মিউটেশনঅবার্সার ব্যবহার করে। এ কারণে, আপনাকে আসলে কিছু সেট আপ করতে বা ম্যানুয়ালি জিনিসগুলিকে অ্যানিমেট করার জন্য জাভাস্ক্রিপ্ট ব্যবহার করতে হবে না। পরিবর্তনগুলি স্বয়ংক্রিয়ভাবে ট্র্যাক করা হয়। যাইহোক, এটি মিউটেশনআবার্সার ব্যবহার করে, এটি কেবল আই 1111 + এ রূপান্তরিত হবে।

Fiddles!


12
সাধারণত, যখন কেউ "জাভাস্ক্রিপ্ট ছাড়াই" কীভাবে কিছু করতে চান, তার অর্থ সমাধানটি জাভাস্ক্রিপ্ট অক্ষম করা ব্রাউজারগুলিতে কাজ করতে হবে। এর অর্থ এই নয় যে "আমার নিজের স্ক্রিপ্টগুলি না লিখে"। সুতরাং আপনার প্লাগইনটি জাভাস্ক্রিপ্ট ব্যবহার না করেই ব্যবহার করা যেতে পারে তা জাভাস্ক্রিপ্ট প্লাগইন বিবেচনা করে সবচেয়ে ভাল বিভ্রান্তিকর।
BoltClock

আমার স্পষ্ট করা উচিত, যখন আমি বলি আপনাকে কোনও বিশেষ জাভাস্ক্রিপ্ট ব্যবহার করতে হবে না, তখন আমি বোঝাতে চাইছি যে আপনাকে কোনও জাভাস্ক্রিপ্ট লিখতে হবে না । কেবল জেএস লাইব্রেরি অন্তর্ভুক্ত করুন এবং আপনি এইচটিএমএলে কোন বৈশিষ্ট্যগুলি দেখতে চান তা নির্দিষ্ট করুন। আপনাকে স্থির উচ্চতা সিএসএস ব্যবহার করতে হবে না বা কোনও কিছু বের করতে হবে না। শুধু শৈলী এবং যেতে।
জোনট্রনকসো 21

"(...) ম্যানুয়ালি জিনিসগুলিকে অ্যানিমেট করার জন্য আপনাকে আসলে কিছু সেট আপ করতে বা জাভাস্ক্রিপ্ট ব্যবহার করতে হবে না (...)" সুতরাং আপনি মজাদার জন্য জাভাস্ক্রিপ্ট ব্যবহার করছেন
রোকো সি বুলজান

6

প্রতি নোড ভিত্তিতে হার্ড-সেট কোড বা আরম্ভ করার জন্য কোনও ব্যবহারকারী-কোডের প্রয়োজন ছাড়াই 0 সহ অটোতে (পূর্ণ আকার এবং নমনীয়) সহ যে কোনও প্রারম্ভিক উচ্চতা থেকে রূপান্তর করার উপায় এখানে: https://github.com/csuwildcat / রূপান্তর-স্বয়ংক্রিয় । আপনি যা চান তার জন্য এটিই মূলত পবিত্র ক্রেইল, আমি বিশ্বাস করি -> http://codepen.io/csuwldcat/pen/kwsdF । কেবলমাত্র আপনার পৃষ্ঠায় নিম্নলিখিত জেএস ফাইলটি চড় মারুন এবং তার পরে আপনার যা করতে হবে তা হল একটি বুলিয়ান বৈশিষ্ট্য যুক্ত করুন / মুছে ফেলা - 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>

আপনার পৃষ্ঠায় অন্তর্ভুক্ত করার জন্য কোড ব্লকটি দেওয়া আছে, এর পরে, এটি সমস্ত গ্রেভী:

আপনার পৃষ্ঠায় এই জেএস ফাইলটি ফেলে দিন - এটি সব ঠিক কাজ করে ™

/ * উচ্চতার জন্য কোড: অটো; স্থানান্তরিত হচ্ছে * /

(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

@ মাইস্টার্ডাত যদিও পরিষ্কার হতে পারে, জেএস কেবলমাত্র কিছু শর্তাবলী দেখার জন্য ব্যবহৃত হয় এবং এটি যে ইভেন্টগুলি / শর্তাদি দেখছে তার উপর ভিত্তি করে কয়েকটি দাবী / অস্থায়ী সিএসএসের মান যুক্ত করতে ব্যবহৃত হয়। রূপান্তরটি এখনও সিএসএসে সম্পন্ন হয়েছে। যদিও আমি সম্মত হই না, দুঃখজনক যে এই স্তরের সেটআপটি এবং হাত ধরে রাখা একটি আপাত দৃষ্টিতে সহজ ব্যবহারের ক্ষেত্রে সন্তুষ্ট করার জন্য প্রয়োজনীয়! : /
সিসুয়েলডক্যাট

1
@ কারোলিসরামানউসকাস এটি কোনও সমস্যা নয় - আইইএস সিএসএস কীফ্রেমস এবং অনুরোধঅ্যানিমেশনফ্রেম উভয় সমর্থন করে। আমি clipআমার ডামি প্রপার্টি ট্রিগার হিসাবে ব্যবহার করছিলাম এবং কোনও কারণে IE ক্লিপটি অ্যানিমেটেড করার অনুমতি দেওয়া বন্ধ করে দিয়েছে। আমি अस्पष्टিতে স্যুইচ করেছি, এবং এটি আবার কাজ করে: codepen.io/csuwldcat/pen/FpzGa । আমি ম্যাচের উত্তরে কোড আপডেট করেছি।
csuwldcat

1
@ সিএসউউल्डক্যাট খুব সুন্দর সমাধান, আমি লক্ষ্য করেছি যে একটি ছোট ভগ্নাংশের জন্য সামগ্রীটি উপস্থিত হয় এবং অদৃশ্য হয়ে যায়, কেন এটি ঘটে? এটা কি এড়ানো যায়?
বেটো আভেগা

12
আমি এটিকে উজ্জীবিত করতে চাই, তবে কীভাবে এটি কাজ করা যায় তার প্রশ্নের উত্তর দেওয়ার পরিবর্তে, আপনি এটি তৈরি করতে একটি প্লাগইন ভাগ করেছিলেন যা আপনি লিখেছিলেন। আমরা, কৌতূহলী, আপনার প্লাগইনকে প্রকৃত বিপরীতে রেখে গেছি, যা খুব মজাদার নয়। আমি আশা করি আপনি আপনার উত্তরটি আপডেট করে আপনার প্লাগইনটি কী করে এবং কেন তার আরও বিশদ বিবরণ ধারণ করে। কোডটি আরও ব্যাখ্যামূলক হতে পরিবর্তন করুন। উদাহরণস্বরূপ, আপনার কাছে কোডের একটি সম্পূর্ণ বিভাগ রয়েছে যা কেবল স্ট্যাটিক সিএসএস লিখে রাখে। আমি বরং এটির কোড তৈরির চেয়ে সিএসএস দেখতে চাই। আপনি সমস্ত ব্রাউজার উপসর্গের জন্য পুনরাবৃত্তি করার মতো বিরক্তিকর অংশগুলি ছেড়ে দিতে পারেন।
gille3

6

সর্বোচ্চ-উচ্চতা অ্যানিমেট করার জন্য জ্যাকের উত্তর দুর্দান্ত, তবে আমি একটি বৃহত্তর সর্বোচ্চ-উচ্চতা বিরক্তিকর সেট করার কারণে বিলম্ব পেয়েছি।

কেউ সংযোগযোগ্য সামগ্রীটি একটি অভ্যন্তরীণ ডিভের মধ্যে স্থানান্তরিত করতে পারে এবং অভ্যন্তরীণ ডিভের উচ্চতা পেয়ে সর্বোচ্চ সীমাটি গণনা করতে পারে (জিকুয়ারির মাধ্যমে এটি বহির উচ্চতা () হবে)।

$('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

প্রয়োজনীয় কোডের নিখুঁত ন্যূনতম পরিমাণের সাথে এখানে একটি জাসফিডাল রয়েছে: http://jsfiddle.net/8ncjjxh8/


5

আমি বুঝতে পারি যে এই থ্রেডটি পুরানো হয়ে উঠছে, তবে এটি নির্দিষ্ট কয়েকটি গুগল অনুসন্ধানে শীর্ষে রয়েছে সুতরাং আমি এটি আপডেট করার মতো মূল্য নির্ধারণ করি।

আপনি কেবল উপাদানটির নিজস্ব উচ্চতা পেতে / সেট করতে পারেন:

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

একটি ইনলাইন স্ক্রিপ্ট ট্যাগে টার্গেট_বক্সের ক্লোজিং ট্যাগের সাথে সাথেই আপনাকে এই জাভাস্ক্রিপ্টটি ডাম্প করা উচিত।


ডকুমেন্ট.সেটিমেন্টবাইআইডি ('টার্গেট_বক্স') get
পরিবর্তন করুন

5

আমি এটি করতে সক্ষম হয়েছিল। আমার একটি .child& একটি .parentডিভ আছে সন্তানের ডিভ 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। এই ডিভটি .childযখন স্লাইড হয়ে যায় তখন ডিভটি মাস্ক করে।


এর কার্যকারী উদাহরণটি অনেক প্রশংসিত হবে।
নিউরোট্রান্সমিটার

5

আমি কিছু জাভাস্ক্রিপ্টের সাথে একটি উত্তর পোস্ট করেছি এবং ডাউনওয়েটেড হয়েছি, তাই বিরক্ত হয়ে আবার চেষ্টা করেছি, এবং এটি কেবল সিএসএস দিয়ে ক্র্যাক করেছি!

এই সমাধানটি কয়েকটি 'কৌশল' ব্যবহার করে:

  • padding-bottom:100%'হ্যাক' যেখানে শতাংশের উপাদান বর্তমান প্রস্থের নিরিখে সংজ্ঞায়িত করা হয়। এই কৌশল সম্পর্কে আরও তথ্য।
  • ফ্লোট সঙ্কুচিত-মোড়ানো, (ফ্লোট ক্লিয়ারিং হ্যাক প্রয়োগ করার জন্য একটি অতিরিক্ত ডিভ প্রয়োজন)
  • এটিকে পূর্বাবস্থায় ফেলার জন্য https://caniuse.com/#feat=css-writing- মোড এবং কিছু রূপান্তরের আনসেমেন্টিক ব্যবহার (এটি উপরে উল্লম্ব প্রসঙ্গে প্যাডিং হ্যাকের ব্যবহারের অনুমতি দেয়)

যদিও এর মূল প্রতিফলনটি হ'ল আমরা কেবল সিএসএস ব্যবহার করে পারফরম্যান্ট ট্রানজিশন পেয়েছি এবং সহজেই রূপান্তরটি অর্জন করতে একটি একক উত্তরণ ফাংশন রয়েছে; পবিত্র ঈস্পিত বস্তু!

অবশ্যই, একটি খারাপ দিক আছে! আমি যে প্রস্থে বিষয়বস্তু কেটে যায় তার নিয়ন্ত্রণ কিভাবে করব ( 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>


এর অন্য দিকটি হ'ল আপনি কার্সারটিকে "হোভারমে" ডিভের সাথে আইটেমের তালিকার দিকে স্থান দিতে পারবেন না যাতে তাদের সাথে যোগাযোগ করার জন্য (সম্ভবত ওপি জিজ্ঞাসার কারণ), সুতরাং এটি কেবলমাত্র একটি টুলটিপ ফাংশন হিসাবে দরকারী , বলুন, নেস্টেড সাবমেনাস সহ একটি মেনু।
টাইলার এইচ

প্রশ্নটি যেভাবে প্রণয়ন করা হয়েছিল এবং কৌশলটির সাথে সম্পর্কিত নয় এটির খাঁটি পরিণতি। আপনি ইচ্ছে করলে input[type="checkbox"]:checkedপরিবর্তে :hover
ট্রিগারটিকে পরিবর্তিত

আমি বলতে চাচ্ছি, কিভাবে প্রশ্ন প্রণয়ন করা হয় নির্বিশেষে, যদি একটি সমাধান একটি বাস্তবায়ন তাই সীমিত, এটি সম্ভবত যে সমাধান এর উত্তরে উল্লেখ করা উচিত (অথবা বাঞ্ছনীয় জন্য দায়ী )। আপনি উল্লেখ করেছেন যে এই সমাধানটি একটি 'পবিত্র গ্রেইল' তবে রূপান্তরিত ডিভটিও overedেকে দেওয়া যায় না ... আমার কাছে এ জাতীয় চূড়ান্ত সমাধান বলে মনে হয় না।
টাইলার এইচ

হাই @ টাইলারহহ, দুঃখিত, আমি এই সত্যটি মিস করেছি যে মূল প্রশ্নের ট্রিগারটি প্রসারিত তালিকাটিকে ঘিরে রেখেছে, তাই যখন লুকানো থাকবে তখন তালিকাটি খোলা থাকা উচিত। আমি এই প্রতিফলিত করতে আমার উত্তর আপডেট করেছি। যদিও আমি উল্লেখ করেছি, এটি কীভাবে ট্রিগার হয় তা সমস্ত জার্মান নয়, কারণ আমি এমন একটি নতুন কৌশল উপস্থাপন করছি যা আগে সিএসএসে সম্ভব হয়েছিল বলে মনে করা হয়নি (আমি কয়েক বছর ধরে সমাধান খুঁজছিলাম)।
EoghanM

4

আমি সবেমাত্র jQuery এর সংমিশ্রণে ব্যবহার করেছি এমন একটি সমাধান এখানে। এটি নিম্নলিখিত এইচটিএমএল কাঠামোর জন্য কাজ করে:

<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');
})

সিএসএস:

#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 }

এটি সর্বশেষতম
জেকারি

4

আমি সম্প্রতি রূপান্তরের করে থাকেন max-heightউপর liমোড়ানো বদলে উপাদান ul

যুক্তি ছোট জন্য বিলম্ব 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 3000px হয়ে ওঠে না তবে 3000px সীমাটি আমি চাপিয়ে দিচ্ছি। নন: হোভারটিতে স্থানান্তর রয়েছে কিনা তা নিশ্চিত করুন, অন্যথায় আপনি কিছু অদ্ভুত রেন্ডারিং পেতে পারেন। এইভাবে: নন: হোভার থেকে উত্তরাধিকার সূচনা করুন।

ট্রানজিশন px থেকে% বা স্বয়ংক্রিয় রূপে কাজ করে না। আপনাকে পরিমাপের একই ইউনিট ব্যবহার করতে হবে। এটি আমার পক্ষে ভাল কাজ করে। এইচটিএমএল 5 ব্যবহার করা একে নিখুঁত করে তোলে ....

মনে রাখবেন চারপাশে সবসময় একটি কাজ হয় ...; )

আশা করি কেউ এই কাজে লাগবে


3

জ্যাকের সর্বাধিক উচ্চতার সমাধানটি ভালভাবে কাজ করে, যদি সরবরাহিত হার্ড-কোডড সর্বোচ্চ-উচ্চতার মানটি আসল উচ্চতার চেয়ে বেশি না হয় (কারণ অন্যথায় অনাকাঙ্ক্ষিত বিলম্ব এবং সময়সীমার সমস্যা রয়েছে)। অন্যদিকে, যদি হার্ড কোডিং মানটি যথাযথভাবে উচ্চতার চেয়ে বড় না হয় তবে উপাদানটি পুরোপুরি খোলবে না।

নিম্নলিখিত সিএসএসের কেবলমাত্র সমাধানের জন্য একটি হার্ড-কোডেড আকারের প্রয়োজন যা প্রকৃত আকারের ঘটনাকারীর চেয়ে বড় হওয়া উচিত। তবে এই সমাধানটিও কার্যকর হয় যদি কিছু পরিস্থিতিতে হার্ড কোডিং আকারের চেয়ে বড় আকার থাকে। সেই পরিস্থিতিতে রূপান্তরটি কিছুটা লাফিয়ে উঠতে পারে তবে এটি কখনই আংশিক দৃশ্যমান উপাদান ছাড়বে না। সুতরাং এই সমাধানটি অজানা সামগ্রীর জন্যও ব্যবহার করা যেতে পারে, যেমন একটি ডাটাবেস থেকে, যেখানে আপনি কেবল জানেন যে সামগ্রীটি সাধারণত পিক্সেলের চেয়ে বড় হয় না, তবে ব্যতিক্রমগুলিও রয়েছে।

আইডিয়া হ'ল মার্জিন-ডাউন (অথবা কিছুটা স্বতন্ত্র অ্যানিমেশনের জন্য মার্জিন-শীর্ষ) এর জন্য একটি নেতিবাচক মান ব্যবহার করা এবং সামগ্রীর উপাদানটিকে ওভারফ্লো: লুকানো সহ একটি মাঝারি উপাদানগুলিতে স্থাপন করা। সামগ্রী উপাদানটির নেতিবাচক মার্জিন তাই মধ্য উপাদানের উচ্চতা হ্রাস করে।

নিম্নলিখিত কোডটি -150px থেকে 0px থেকে মার্জিন-নীচে স্থানান্তর ব্যবহার করে। বিষয়বস্তুর উপাদান 150px এর চেয়ে বেশি না হওয়া পর্যন্ত এটি একা কাজ করে। এছাড়াও এটি মাঝারি উপাদানটির 0px থেকে 100% এ সর্বাধিক উচ্চতায় স্থানান্তর ব্যবহার করে। বিষয়বস্তুর উপাদান 150px এর চেয়ে বেশি হলে এটি পরিশেষে মধ্যবর্তী উপাদানকে আড়াল করে। সর্বাধিক উচ্চতার জন্য ট্রান্সজিশনটি বন্ধ করার সময় কেবলমাত্র তার প্রয়োগটি বিলম্ব করার জন্য ব্যবহৃত হয়, কোনও মসৃণ ভিজ্যুয়াল এফেক্টের জন্য নয় (এবং তাই এটি 0 পিক্স থেকে 100% পর্যন্ত চলতে পারে)।

সিএসএস:

.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%
}

এইচটিএমএল:

<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>

মার্জিন তলদেশের মানটি নেতিবাচক এবং সামগ্রীর উপাদানটির আসল উচ্চতার যতটা সম্ভব কাছাকাছি হওয়া উচিত। যদি এটির (অবাস্তব মান) বড় হয় তবে সর্বাধিক উচ্চতার সমাধানগুলির মতো অনুরূপ বিলম্ব এবং সময়সীমার সমস্যা রয়েছে, তবে যতক্ষণ না হার্ড কোডিং আকার বাস্তবের চেয়ে বেশি বড় না হয় ততক্ষণ সীমাবদ্ধ থাকতে পারে। মার্জিন-নীচের জন্য নিখুঁত মান যদি বাস্তব উচ্চতার চেয়ে ছোট হয় তবে ট্যানিশনটি কিছুটা লাফিয়ে যায়। কোনও অবস্থাতেই স্থানান্তরিত হওয়ার পরে সামগ্রীর উপাদানটি পুরোপুরি প্রদর্শিত হয় বা পুরোপুরি সরানো হয়।

আরও তথ্যের জন্য আমার ব্লগ পোস্টটি দেখুন http://www.taccgl.org/blog/css_transition_display.html#compined_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

এটি সমস্যার সঠিকভাবে "সমাধান" নয়, বরং আরও অনেকগুলি কাজের সমাধান। এটি কেবল পাঠ্য সহ লিখিত হিসাবে কাজ করে তবে এটি নিশ্চিত যে প্রয়োজন হিসাবে অন্যান্য উপাদানগুলির সাথে কাজ করতে পরিবর্তিত হতে পারে sure

.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 এবং ট্রানজিশনটি স্থির করেছেন যে উচ্চতা, বা সর্বোচ্চ-উচ্চতা বা স্কেলওয়াই () ইত্যাদির পরিবর্তে দ্রুত গতিতে আপনি যা চান তা রূপান্তর করতে উচ্চতা পেতে পারেন। সিএসএসের সাথে প্রকৃত উচ্চতাটি অটোতে রূপান্তর করা বর্তমানে সম্ভব নয়, তবে সামগ্রীর মধ্যে সামগ্রীর রূপান্তরকরণ হ'ল ফন্ট-আকারের রূপান্তর।

  • দ্রষ্টব্য - কোডেপনে জাভাস্ক্রিপ্ট রয়েছে, তবে এটির উদ্দেশ্য কেবল অ্যাকর্ডিয়নের জন্য ক্লিক করে CSS ক্লাস যুক্ত করা / অপসারণ করা। এটি লুকানো রেডিও বোতামগুলির সাহায্যে করা যেতে পারে তবে আমি কেবলমাত্র উচ্চতার রূপান্তরকে কেন্দ্র করে নি।

1
কার্যকরভাবে এই উত্তরটির সদৃশ , কিন্তু অস্বচ্ছ-বিবর্ণ প্রভাব বাদ দেয়।
সেলডমনিডি

একমত। আরও ভাল পদ্ধতির।
মাইক এস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.