В этом материале вы разберёте, как в Dota 2 через Panorama UI создать прозрачную панель сверху экрана, чтобы она выглядела аккуратно и не мешала игре. Покажем минимальную структуру и готовый пример: XML + CSS (и при желании — небольшая логика).


Почему «прозрачная панель сверху» часто не получается

Обычно люди упираются в три проблемы:

  • Панель не появляется сверху: забывают про position и порядок значений (с X/Y/Z).
  • Прозрачность «не работает»: ставят прозрачность в CSS неправильно или используют неподходящий формат цвета.
  • Панель перекрывает всё: не управляют видимостью, анимацией и интерактивностью (например, disabled или обработчики).

Ниже вы сделаете всё «по-человечески»: интерфейс будет прозрачным, панель — аккуратно расположенной, а дизайн — понятным.


Минимум: что должно быть в проекте Panorama

Чтобы UI вообще отображался, обычно нужна структура внутри кастомки. В минимальном варианте часто хватает:

  • папка panorama/layoutXML-разметка (где лежит Panel)
  • папка panorama/scriptsLua/JS логика (связывается с UI)
  • папка panorama/stylesCSS стили
  • custom_ui_manifest.xml — конфигурация, где указан layout

В интерфейсе Dota 2 базовый элемент — Panel, по смыслу как div в HTML: любой UI-элемент строится вокруг панели-«контейнера».


XML: прозрачная верхняя панель (Panel сверху)

Создадим разметку. Идея простая: на экране будет элемент панели, а в CSS мы сделаем прозрачность и анимацию.

<root>
    <Panel>
        <Panel id="topOverlay" class="topOverlay"></Panel>
    </Panel>
</root>

Ключевые моменты:

  • id="topOverlay" — чтобы потом легко найти элемент (если нужно через скрипт).
  • class="topOverlay" — чтобы назначить стиль через CSS.
  • Сама панель — это элемент, который управляет «фоновой» областью.

CSS: как сделать именно прозрачность сверху

Готовый стиль (прозрачный фон + скругления + расположение)

.topOverlay {
    /* Размер */
    width: 100%;
    height: 80px;

    /* Цвет + прозрачность */
    /* Важно: используйте rgba, а не просто opacity */
    background-color: rgba(0, 0, 0, 0.35);

    /* Скругление, чтобы панель не выглядела «жёсткой доской» */
    border-radius: 0 0 16px 16px;

    /* Позиционирование: сверху, по ширине на весь экран */
    position: 0px 0px 0px;

    /* Чтобы было видно поверх остального */
    z-index: 50;

    /* Опционально: немного «открытия» сверху */
    opacity: 0;
    animation-name: overlayIn;
    animation-duration: 250ms;
    animation-timing-function: linear;
    animation-iteration-count: 1;
}

Почему это работает:

  • rgba(..., 0.35) даёт прозрачную заливку (самый надёжный способ).
  • position: 0px 0px 0px; ставит панель в верхнюю часть (счёт идёт от верхнего левого угла).
  • Скругления делают интерфейс аккуратнее.

Анимация появления (как «въезд» сверху)

@keyframes overlayIn {
    0% {
        opacity: 0;
        position: 0px -20px 0px;
    }
    100% {
        opacity: 1;
        position: 0px 0px 0px;
    }
}

Теперь прозрачная панель сверху будет появляться плавно — это прям то, что ищут в запросах про прозрачную панель.


Как «не сломать» интерфейс: частые ошибки

Иногда проблема не в цвете, а в настройках панели:

Что делают Почему ломается Как правильно
Пытаются «прозрачность» делать style="opacity:..." прямо в XML Легко запутаться и неудобно править, плюс это не лучший подход Держите всё в CSS через .topOverlay
Путают position и порядок значений Панель может уйти вниз/вбок Используйте position: Xpx Ypx Zpx;
Забывают про width: 100% Панель выглядит как кусок, а не «полоса сверху» Всегда задавайте width: 100% для верхней панели
Делают прозрачность через «не тот механизм» Получается не то, что ожидали Для фона используйте rgba

И да: style внутри XML лучше не использовать как основной способ оформления — когда дизайн растёт, поддерживать это становится больно.


Если нужно сделать панель «полупрозрачной», но без мерцания

Есть два распространённых подхода:

  • Прозрачность через фон: background-color: rgba(...) (рекомендуется для панелей)
  • Общая прозрачность элемента: opacity: ... (иногда мешает, потому что прозрачным становится весь интерфейс внутри)

Если у вас в панели будут Label, кнопки, аватарки или миникарта, чаще выгоднее оставить opacity для анимации (как в примере), а сам фон делать через rgba.


Дополнительно: как сделать панель «не кликабельной» (если нужно)

Если вам важно, чтобы панель не реагировала на клики, можно отключить интерактивность. Для отдельных элементов это делается через disabled.

Примерно так (если внутри будут кнопки/переключатели):

<Button disabled="true" />

В вашем случае с чисто декоративной панелью обычно достаточно просто не вешать обработчики, но disabled помогает, когда элементы внутри должны быть неактивны.


Бонус: кнопка внутри панели (если захотите)

Чтобы панель сверху была не просто фоном, внутрь можно добавить кнопку и повесить реакцию через onactivate.

<Panel id="topOverlay" class="topOverlay">
    <Button id="closeBtn" class="closeBtn" onactivate="$.Msg('click');"></Button>
</Panel>

И стиль:

.closeBtn {
    width: 32px;
    height: 32px;
    position: 20px 20px 0px;

    background-color: rgba(255, 255, 255, 0.2);
    border-radius: 8px;
}

.closeBtn:hover {
    background-color: rgba(255, 255, 255, 0.35);
}

Тут видно, как UI-элемент становится частью общего интерфейса: панель — это panel, а кнопка — интерактивный элемент.


Итог: рабочая схема для прозрачной панели сверху

Чтобы быстро получить нужный результат в игре Dota 2 через Panorama, делайте так:

  • В XML создайте Panel (например, topOverlay)
  • В CSS:
  • задайте position: 0px 0px 0px;
  • задайте width: 100%;
  • задайте прозрачность фона через background-color: rgba(...);
  • при желании добавьте @keyframes для плавного появления

После этого прозрачная верхняя панель станет выглядеть как аккуратный слой UI: ваш экран будет понятным, элементы — читаемыми, а сама панель — не будет «забирать» весь вид.