Блог разработчика 1С-Битрикс

Управление DOM-структурой в 1С-Битрикс: функции BX.width() и BX.height()

Работая с фронтендом на 1С-Битрикс, почти каждый проект сталкивается с задачей динамического изменения размеров элементов: подгоняем высоту карточек под самый высокий блок, анимируем раскрытие аккордеона, вычисляем ширину колонки до и после перестроения сетки.

Управление DOM-структурой. BX.width/BX.height

Всё это решается двумя лаконичными методами библиотеки Bitrix JavaScriptBX.width() и BX.height().


1. Сигнатура и поведение

BX.width(element [, value]);
BX.height(element [, value]);
Параметр Тип Описание
element HTMLElement/string DOM-узел или его идентификатор.
value (необяз.) number Новое значение в пикселях. Если не указан, метод возвращает текущее значение.

Важно: Число передаём без px, функция сама добавит необходимую единицу измерения.


2. Получаем текущие размеры

<div id="statsBox" class="box">Статистика</div>
<script>
BX.ready(() => {
    const box = BX('statsBox');
    console.log('Width:',  BX.width(box));   // -> 300 (пример)
    console.log('Height:', BX.height(box));  // -> 120 (пример)
});
</script>

Такое считывание часто используют при построении мозаичных или flex-сеток, когда важно знать реальный размер контента после рендеринга.


3. Задаём размеры интерактивно

3.1. Увеличиваем высоту по клику

<button id="growBtn" class="btn">Увеличить блок</button>
<div id="growTarget" class="panel">Контент блока</div>
<script>
BX.ready(() => {
    const btn = BX('growBtn');
    const target = BX('growTarget');
    BX.bind(btn, 'click', () => {
        const newHeight = BX.height(target) + 50; // прибавим 50 px
        BX.height(target, newHeight);
        btn.textContent = `Высота: ${newHeight}px`;
    });
});
</script>
<style>
.btn { cursor:pointer;padding:6px 12px;background:#4caf50;color:#fff;border:none;border-radius:4px; }
.panel { width:260px;height:120px;margin-top:12px;background:#f5f5f5;transition:height .3s ease; }
</style>

3.2. Изменяем ширину с анимацией

BX не содержит встроенный аниматор размеров, но можно комбинировать с CSS-transition или модулем BX.fx:

<div id="wideBox" class="stretch">Нажми меня</div>
<script>
BX.ready(() => {
    BX.bind(BX('wideBox'), 'click', function () {
        // Переключаемся между 150 и 350 px
        const targetWidth = BX.width(this) === 150 ? 350 : 150;
        BX.width(this, targetWidth);
    });
});
</script>
<style>
.stretch {
    width:150px;height:60px;line-height:60px;margin:20px auto;text-align:center;
    background:#2196f3;color:#fff;border-radius:8px;transition:width .4s ease;
}
</style>

4. Массовое выравнивание карточек

Частый кейс — сделать все карточки одинаковой высоты, равной максимальной.

<div class="card">Карточка 1<br>Короткий текст</div>
<div class="card">Карточка 2<br>Очень длинный текст<br>ещё строка</div>
<div class="card">Карточка 3</div>
<script>
BX.ready(() => {
    const cards = document.querySelectorAll('.card');
    let maxH = 0;
    cards.forEach(card => { maxH = Math.max(maxH, BX.height(card)); });
    cards.forEach(card => BX.height(card, maxH));
});
</script>
<style>
.card {
    display:inline-block;width:200px;margin:8px;padding:12px;
    background:#eee;border:1px solid #ccc;border-radius:6px;vertical-align:top;
}
</style>

5. Адаптивная подстройка при ресайзе окна

BX.ready(() => {
    const sidebar = BX('sidebar');
    const adjust = () => {
        const vw = BX.width(document.documentElement);
        BX.width(sidebar, vw < 768 ? vw : 300); // на мобилках — 100 %, иначе 300px
    };
    BX.bind(window, 'resize', BX.debounce(adjust, 150)); // защитим от частых вызовов
    adjust(); // первичный вызов
});

Здесь используется BX.debounce() (часть ядра Bitrix) для оптимизации.


6. Раскрывающееся описание (аккордеон)

<h3 class="faq__title">Что такое BX.width/BX.height?</h3>
<div class="faq__body" style="height:0;overflow:hidden;">
  Эти функции позволяют считывать и задавать размеры…
</div>
<script>
BX.ready(() => {
    const titles = document.querySelectorAll('.faq__title');
    titles.forEach(title => {
        BX.bind(title, 'click', () => {
            const body = title.nextElementSibling;
            const isOpen = BX.height(body) > 0;
            BX.height(body, isOpen ? 0 : body.scrollHeight);
            title.classList.toggle('open', !isOpen);
        });
    });
});
</script>
<style>
.faq__title { cursor:pointer;margin:12px 0;padding:8px;background:#ffeb3b; }
.faq__title.open { background:#ffe12b; }
.faq__body { transition:height .25s ease;padding:0 8px;background:#fff3cd; }
</style>

7. Подводные камни и лайфхаки

Ситуация Решение
Элемент скрыт через display:none BX.width/height() вернёт 0. Перед измерением временно установите visibility:hidden; display:block; или используйте offsetWidth напрямую.
Нужно задать проценты или auto Методы принимают только число (пиксели). Для процентов используйте CSS-классы или пропишите style.width = '50%'.
Свойства box-sizing:border-box Возвращается “контентная” ширина без padding и border. Если нужен полный блок, берите offsetWidth/offsetHeight.
Не хочется передавать DOM-узел Допускается строковый ID: BX.width('menu'). Однако при частых вызовах кешируйте ссылку на элемент, чтобы не искать его заново.

8. Лучшие практики

  1. Минимизируйте обращения. Сохраняйте вычисленные размеры в переменные, если используете их несколько раз за тик.
  2. Комбинируйте с CSS-транзишнами вместо таймеров setInterval — браузеру проще оптимизировать.
  3. Используйте debouncing для resize и scroll-событий, чтобы не плодить лишние перерисовки.
  4. Профилируйте. Chrome DevTools > Performance подскажет, нет ли лишних reflow.

9. Заключение

BX.width() и BX.height() — маленькие, но крайне полезные инструменты, без которых сложно представить динамические страницы на 1С-Битрикс. С их помощью вы:

  • считываете реальные размеры элементов после рендера,
  • программно задаёте новые значения,
  • легко строите адаптивные интерфейсы и красивые анимации.

Берите примеры из статьи за основу, адаптируйте под ваш проект и помните: правильное управление размерами — это не только визуальная гармония, но и производительность сайта.

Теги:  DOM, BX.width, BX.height, фронтенд, JavaScript, веб-разработка


Стоимость услуг по разработке и сопровождению сайтов на 1C-Битрикс

Лечение сайтов от вирусов

восстановление сайта и подъем версии PHP

от 25 000 рублей
Лечение сайтов на решениях АСПРО и прочих.

* полный комплекс лечения проекта и закрытия дыр

Аутсорсинг

готов помочь, если нет времени

договорная

Могу взять на себя работы по full-stack на основе готовой верстки

* если нет верстки, то возможность верстать с Figma в режиме редактора

Лендинг

от 3 дней

от 25 000 рублей

Разработка одностраничного сайта на платформе Битрикс

* стоимость зависит от наличия верстки, использования готового решения и т.д.