هل تعرف هذا الشعور عندما تصنع جزءًا خاصًا بدلاً من تحسين جزءًا HTML الأصلي؟ فريق تصميمك قد صممت شيئًا رائعًا، ولكن المستخدمين لا يستطيعون دعمها من الغطاء، ويصبح إصلاحه في كل مكان حزنًا. بالطبع ، يمكنك الترحيل إلى أدنى وأنتظرها ، ولكن من الأفضل أن تمنحك المصمم الخاص بك لا يمكن الوصول إليك بأشياء صغيرة. لقد كنت أريد أن أتحدث اليوم عن مخطط واحد ينتظرنا خلال هذه الرحلة الهادفة: توزيع عناصر التخطيط، مثل المفاتيح المختارة أو خيارات التوقيت. الخطأ الكامل في البداية ، يبدو أن يلغي جميع مشاكلنا ، وفي بعض الأحيان. position: absolute الواقع: الكامل هذا بعيد عن الكمال - يمكننا القيام به أفضل. إصلاحها مع 'fixed' 'fixed' التقييم إذا كنت تريد عرض المحتوى على كل شيء ، فستحتاج إلى .الصعوبة الوحيدة هي أننا سيخسرون تقييمات العناصر الأساسية: العناصر الأساسية هي مستقلة تماماً عن طبيعتها.هذا يعني أن الأمر الوحيد الذي نحتاج إليه هو تحديد تقييمات دقيقة لمثل هذه الحالات: position: fixed Position: ثابت عند عرضها. عند تغيير محتوىها. عند إرسال نافذة و/أو المولود المتحرك. عند إرسال نافذة و/أو المولود المتحرك. When we display it. عندما يتم تغيير المحتوى. عندما نقوم بتحريك النافذة و/أو المولود المتحرك. عندما نقوم بتغيير حجم النوافذ و/أو المولود المتحرك. نحن بحاجة أيضًا إلى تحديد ما إذا كان يُظهر على سطح الشاشة إذا كان قريبًا من أسفل الشاشة. أنا سوف تستخدم Vue.js، ولكن يجب أن يكون سهلاً للتبعية حتى لو كنت ترغب في React أو Angular. Let’s Rock This Joint هذه هي المكونات التي سنستخدمها: export const useDropdownAttributes = () => { const dropdownWidth = ref(''); const dropdownTop = ref(''); const dropdownBottom = ref(''); const dropdownLeft = ref(''); const isDirectedUpwards = ref(false); const togglerRect = ref<DOMRect>(); const dropdownRect = ref<DOMRect>(); const autodetectPosition = ( isDropdownDisplayed: Ref<boolean>), togglerElement: HTMLE echlement null = null, dropdownElement: HTMLDivementElement null = null, dropdownContent: Ref<nunkown export const useDropdownAttributes = () => { const dropdownWidth = ref(''); const dropdownTop = ref(''); const dropdownBottom = ref(''); const dropdownLeft = ref(''); const isDirectedUpwards = ref(false); const togglerRect = ref<DOMRect>(); const dropdownRect = ref<DOMRect>(); const autodetectPosition = ( is DropdownDisplayed: Ref<boolean>;; ref(), togglerElement: HTMLE torglement null = null, dropdownElement: HTMLDivementEl torget null = null, dropdownContent: Ref< هناك أربعة متغيرات لواقع الانخفاض بالإضافة إلى علامة ومسألة تحديثها جميعًا. isDirectedUpwards isDirectedUpwards كما تقولون، علينا أيضًا أن نتعامل مع التردد والتغيير في المولود المولود المولود، لذلك دعونا نخلق وظيفة للعثور عليها: const getFirstScrollableParent = (element: HTMLElementintza null): HTMLElement => { const parentElement = element?.parentElement; if (!parentElement) return document.body; const overflowY = window.getComputedStyle(parentElement).overflowY; if (overflowY ==='scroll' Átha overflowY === 'auto') return parentElement; return getFirstScrollableParent(parentElement); }; const getFirstScrollableParent = (element: HTMLElementannoo null): HTMLElement => { const parentElement = element?.parentElement; if (!parentElement) return document.body; const overflowY = window.getComputedStyle(parentElement).overflowY; if (overflowY ==='scroll'annoo overflowY === 'auto') return parentElement; return getFirstScrollableParent(parentElement); }; بعد ذلك، دعونا نضيف الميزات الرئيسية: نقل و حتى نتمكن من التعامل مع التحديثات. isDropdownDisplayed dropdownContent isDropdownالتصوير Dropdownالمحتوى نحن نذهب أيضا و الذي نحتاج إلى حساب الوضع. togglerElement dropdownElement Togglerالتكوين Dropdownالميزة أخيرا ، هناك في حالة كنت ترغب في انخفاض أعلى toggler على الفور. isUpwardPreferred أفضل عندما تتمتع بالراحة والتمتع في المكون الخاص بك ، ستحتاج إلى شيئاً مثل هذا (أعتقد أنك قد أضفت ردوداً على التخطيط والخسارة في النماذج): const { autodetectPosition, dropdownTop, dropdownBottom, dropdownLeft, dropdownWidth, isDirectedUpwards, } = useDropdownAttributes(); const togglerRef = ref<HTMLElement>(); const dropdownRef = ref<HTMLElement>(); const isDropdownShown = ref(false); onMounted(() => { autodetectPosition(isDropdownShown, togglerRef.value.$el, dropdownRef.value.$el); } const { autodetectPosition, dropdownTop, dropdownBottom, dropdownLeft, dropdownWidth, isDirectedUpwards, } = useDropdownAttributes(); const togglerRef = ref<HTMLElement>(); const dropdownRef = ref<HTMLElement>(); const isDropdownShown = ref(false); onMounted(() => { autodetectPosition(isDropdownShown, togglerRef.value?.$el, dropdownRef.value?.$el); } و سيبدو CSS هذا: .dropdown { موقف: ثابت؛ تحت: v-bind('isDirectedUpwards? dropdownBottom : dropdownTop'); left: v-bind('dropdownLeft'); width: v-bind('dropdownWidth'); min-width: 0; } .dropdown { موقف: ثابت؛ تحت: v-bind('isDirectedUpwards? dropdownBottom : dropdownTop'); left: v-bind('dropdownLeft'); width: v-bind('dropdownWidth'); min-width: 0; } Voilà. يظهر التفريغ بشكل صحيح حتى عند التفريغ وتحرك فوق التفريغ إذا لم يكن هناك مساحة كافية تحتها. وذلك لأننا في نهاية المقال، أود أن أترك لك شيئًا سعيدًا - ولكن أنا خاسر من الأفكار. يمكنك العثور على الكود الكامل على . GitHub يمكنك العثور على الكود الكامل على . GitHub GitHub