انتقال CSS لخاصية الارتفاع من 0px إلى تلقائي

مرحبا يا هبر!

أريد مشاركة طريقة أخرى لإنشاء انتقال css لخاصية height من 0px إلى auto .

واجه هذه المشكلة عند تطوير مكونات الويب TreeView و DataGrid. في TreeView ، قررت إنشاء توسيع / ​​انهيار سلس للعقد ، وفي DataGrid - صفوف تحتوي على محتوى إضافي. بعد قراءة الإنترنت ، وجدت عدة طرق للتنفيذ ، أهمها من خلال max-height و javascript. تم استبعاد تنفيذ جافا سكريبت - هناك css مع دعم للتحولات والرسوم المتحركة. بقي max-height ، وخاصة في الأمثلة مع القوائم المنسدلة كل شيء يعمل.

في TreeView ، تحتوي كل عقدة على تداخل غير محدود ، لذا لا يمكنك تحديد الحد الأقصى لارتفاع محتوياته على الفور ، وحتى إذا قمت بتعيين max-height إلى كبير جدًا ، فستحدث مشكلات في الرسوم المتحركة الانتقالية. أيضًا ، إذا قمت بتوسيع العقد التابعة ، سيزداد ارتفاع الوالد وقد يتداخل مع max-height . شئنا أم max-height ، max-height مناسب. DataGrid لديه نفس المشكلة - يمكن أن يكون هناك أي محتوى إضافي على التوالي. تحتاج height:auto !

لذلك ، لنبدأ في تنفيذ الانتقال على خاصية height من 0px إلى auto . النظر في مثال بسيط.

السماح:

  • elBlock: HTMLDivElement - كتلة ليتم elBlock: HTMLDivElement / طيها ؛
  • elToggle: HTMLButtonElement - زر تبديل الحالة.

حدد فئة css للكتلة التي قمنا فيها بضبط تشذيب المحتوى والانتقال نفسه:

 .block { overflow: hidden; transition: height 500ms ease; } 

نحن نصف onClick الأحداث onClick لـ elToggle :

 elToggle.addEventListener("click", () => { if (elBlock.style.height === "0px") { elBlock.style.height = `${ elBlock.scrollHeight }px` } else { elBlock.style.height = `${ elBlock.scrollHeight }px`; window.getComputedStyle(elBlock, null).getPropertyValue("height"); elBlock.style.height = "0"; } }); 

يبقى لإضافة height:auto الإرجاع height:auto بعد الانتقال:

 elBlock.addEventListener("transitionend", () => { if (elBlock.style.height !== "0px") { elBlock.style.height = "auto" } }); 

حسنًا ، هذا كل شيء ، الآن يعمل توسيع / ​​انهيار الكتلة كما ينبغي ولا يعتمد على حجم المحتوى.


الشكل 1 - مثال على توسيع / ​​طي العقد في TreeView

تجدر الإشارة إلى عيوب هذا النهج:

  • باستخدام جافا سكريبت ، أود فقط المغلق.
  • أثناء الانتقال ، قد يتغير المحتوى (ارتفاعه ، scrollHeight ) وبعد اكتماله ، في حالة إرجاع auto ، سيتغير ارتفاع الكتلة بشكل كبير في اتجاه أو آخر. لتجنب هذا التأثير ، تحتاج إلى تتبع التغيير في scrollHeight وتغيير height . كما هو موضح في الممارسة العملية ، عادة ما يستغرق الانتقال / التمدد 0.5 ثانية لكل منهما ، وخلال هذا الوقت من غير المحتمل أن يكون لدى المستخدم وقت لتغيير شيء ما في الداخل ، على سبيل المثال ، في حالة TreeView ، قم بتوسيع العقدة الفرعية.

شكرا لاهتمامكم!

Source: https://habr.com/ru/post/ar475520/


All Articles