Skip to content

computePlacement

یک تابلوی شناور (فهرست بازشو، پاپ‌اور، راهنمای ابزار) را نسبت به مستطیل یک لنگر می‌نشاند: اگر سمت دلخواه جا نداشته باشد و سمت مقابل جادارتر باشد، به سمت مقابل برمی‌گردد و سپس در راستای محور عرضی می‌لغزد تا درون یک کرانه بماند. همان کاری را می‌کند که میان‌افزارهای flip و shift در Floating UI، اما بی آن وابستگی.

هندسهٔ ناب: هرگز خودش به DOM دست نمی‌زند. نتیجه‌های getBoundingClientRect() را بدهید تا مختصاتی را که باید بنویسید پس بدهد.

کاربرد

ts
import { computePlacement } from 'ranuts/utils';

const anchorRect = trigger.getBoundingClientRect();
const { top, left, placement } = computePlacement({
  anchor: anchorRect,
  floating: { width: panel.offsetWidth, height: panel.offsetHeight },
  placement: 'bottom',
  offset: 4,
});

panel.style.position = 'absolute';
panel.style.top = `${top + window.scrollY}px`;
panel.style.left = `${left + window.scrollX}px`;
// `placement` همان سمتی است که پس از برگرداندن واقعاً به کار رفته — از آن برای گزینش
// کلاس پویانمایی ورود یا جهت پیکان استفاده کنید.

API

computePlacement

پارامترها

پارامترتوضیحنوعپیش‌فرض
options.anchorمستطیل لنگر (ماشه)، در مختصات دیدگاه (مثلاً getBoundingClientRect()){ top, left, width, height }الزامی
options.floatingاندازهٔ خودِ تابلوی شناور{ width, height }الزامی
options.placementسمت دلخواه. اگر جا نداشته باشد و سمت مقابل جادارتر باشد، به آن سو برمی‌گردد'top' | 'bottom' | 'left' | 'right'الزامی
options.offsetفاصله‌ای که میان لنگر و تابلوی شناور نگه داشته می‌شود (پیکسل)number0
options.boundaryناحیه‌ای که تابلو باید درونش بماند، در مختصات دیدگاه{ top, left, width, height }دیدگاه پنجره
options.paddingکمترین فاصله‌ای که هنگام لغزاندن میان تابلو و لبهٔ کرانه می‌ماند (پیکسل)number8

بازگشت

آرگومانتوضیحنوع
topمقدار topِ تعیین‌شده، در همان فضای مختصات anchornumber
leftمقدار leftِ تعیین‌شده، در همان فضای مختصات anchornumber
placementسمتی که پس از برگرداندن واقعاً به کار رفته'top' | 'bottom' | 'left' | 'right'

یادداشت‌ها

  1. مختصات سرتاسر نسبت به دیدگاه‌اند، در همان فضای anchor. اگر تابلو را با position: absolute نسبت به سند می‌نشانید، هنگام نوشتن سبک، scrollX و scrollY را خودتان بیفزایید (نمونهٔ بالا را ببینید).
  2. بی چیدمان واقعی، نه برگرداندنی هست و نه لغزاندنی. وقتی پهنا یا بلندای anchor یا floating صفر باشد (jsdom که هرگز چیدمان واقعی نمی‌کند، یا تابلویی که پیش از ته‌نشین شدن محتوایش خوانده شده)، محاسبهٔ فضا در هر فراخوانی برخوردی خیالی «کشف» می‌کند. از این رو computePlacement برگرداندن و لغزاندن را یکسره کنار می‌گذارد و همان placementِ دلخواهِ فراخواننده را دست‌نخورده برمی‌گرداند.
  3. اگر تابلو از خودِ کرانه بزرگ‌تر باشد، لغزاندن انجام نمی‌شود: مهار کردنش تنها آن را از سوی دیگر بیشتر از پرده بیرون می‌راند.
  4. r-popover و r-select در ranui در درون از آن بهره می‌برند تا فهرست بازشویی که به body منتقل شده روی پرده بماند.

منتشرشده تحت مجوز MIT.