Заметки
BX24.fitWindow может не уменьшить фрейм
Почему BX24.fitWindow подгоняет фрейм под контент, но не всегда корректно уменьшает его после скрытия блока.
BX24.fitWindow подгоняет фрейм под текущую высоту контента.
Если после скрытия блока фрейм не уменьшается как нужно, размер можно задать явно через
BX24.resizeWindow.
Проблема
Во фреймовом приложении Bitrix24 высота окна может увеличиться после вызова
BX24.fitWindow, но не уменьшиться обратно после скрытия части интерфейса.
BX24.fitWindow подгоняет фрейм под содержимое страницы. Это удобно после
загрузки таблицы, раскрытия блока или добавления нового контента.
Проблема появляется при обратном действии:
- в приложении был короткий интерфейс;
- пользователь раскрыл длинный блок;
- вызвали
BX24.fitWindow; - фрейм увеличился под контент;
- пользователь скрыл длинный блок;
- повторный
BX24.fitWindowможет не вернуть меньшую высоту.
В итоге на странице остаётся лишнее пустое место, хотя контента уже стало меньше.
Причина
BX24.fitWindow ориентируется на высоту содержимого, но при скрытии блоков
не всегда даёт ожидаемый результат.
По документации BX24.fitWindow использует высоту содержимого фрейма:
BX24.getScrollSize().scrollHeight.
BX24.init(function () {
BX24.fitWindow(function () {
console.log('Команда изменения размера отправлена');
});
}); Когда контент стал выше, это обычно работает нормально: фрейм увеличивается и вмещает новую разметку.
Если контент стал ниже, fitWindow лучше не воспринимать как гарантированное
уменьшение фрейма.
function collapseDetails() {
const details = document.querySelector('[data-details]');
if (!details) {
return;
}
details.hidden = true;
BX24.fitWindow(function () {
console.log('Фрейм может остаться прежней высоты');
});
} Такой код может скрыть блок, но оставить старую высоту фрейма.
Решение
BX24.fitWindow можно использовать, когда нужно автоматически подогнать фрейм
под контент. Если нужен конкретный размер, лучше вызывать BX24.resizeWindow.
Рабочий подход:
- если нужно подстроиться под текущий контент — вызывать
BX24.fitWindow; - если нужна конкретная ширина и высота — вызывать
BX24.resizeWindow; BX24.resizeWindowможно использовать и для увеличения, и для уменьшения фрейма;- не рассчитывать, что
BX24.fitWindowвсегда корректно уменьшит фрейм после скрытия блока.
Использовать resizeWindow
Если после изменения интерфейса нужна известная высота, проще передать её напрямую в
BX24.resizeWindow.
const FRAME_WIDTH = 1000;
const COLLAPSED_FRAME_HEIGHT = 420;
/**
* Раскрывает блок и подстраивает фрейм под увеличившийся контент.
*/
function expandDetails() {
const details = document.querySelector('[data-details]');
if (!details) {
return;
}
details.hidden = false;
BX24.fitWindow();
}
/**
* Скрывает блок и явно задаёт размер фрейма.
*/
function collapseDetails() {
const details = document.querySelector('[data-details]');
if (!details) {
return;
}
details.hidden = true;
BX24.resizeWindow(FRAME_WIDTH, COLLAPSED_FRAME_HEIGHT, function () {
console.log('Фрейму задан явный размер');
});
}
Если высота зависит от текущей разметки, её можно посчитать после изменения DOM и передать
в resizeWindow.
const FRAME_WIDTH = 1000;
const MIN_FRAME_HEIGHT = 320;
const FRAME_PADDING = 24;
/**
* Возвращает безопасную высоту фрейма.
*/
function calculateFrameHeight() {
const app = document.querySelector('[data-app]');
if (!app) {
return MIN_FRAME_HEIGHT;
}
const content_height = app.offsetHeight + FRAME_PADDING;
return Math.max(content_height, MIN_FRAME_HEIGHT);
}
/**
* Явно обновляет высоту фрейма.
*/
function resizeFrameToContent() {
const frame_height = calculateFrameHeight();
BX24.resizeWindow(FRAME_WIDTH, frame_height);
}
Так поведение становится предсказуемым: fitWindow автоматически подстраивает
фрейм под контент, а resizeWindow задаёт конкретный размер вручную.