Адаптивность элементов управления
Ряд элементов в API адаптивны, то есть автоматически подстраиваются под размер карты и размер экрана. Приведенные ниже изображения иллюстрируют, как меняется внешний вид элементов управления в зависимости от размеров карты:
Карта 300x250
Карта 800x400
Состояния элементов управления
Элементы управления могут принимать одно из трех состояний: 'small', 'medium', 'large'. Для каждого состояния определено визуальное представление элемента управления:
Состояние |
Описание |
'small' |
Показывается только иконка элемента управления. |
'medium' |
Показывается только подпись. Для элементов управления «Ползунок масштаба» и «Пробки» состояния 'small' и 'medium' совпадают. |
'large' |
Показывается и подпись и иконка. |
Примечание
Элемент управления масштабом изменяет свой внешний вид следующим образом. При маленьких размерах карты элемент представляется в виде двух кнопок; при больших размерах карты помимо кнопок отображается также ползунок масштабирования.
Размер элементов управления
Информация о текущем размере элемента управления размещается в поле state
, у которого есть свойство size
. Ниже продемонстрировано, как можно определить текущий размер элемента управления.
myMap.controls.add('trafficControl');
// Определяем состояние элемента управления «Пробки».
var controlState = myMap.controls.get('trafficControl').state.get('size');
Управление размером элементов осуществляется менеджером control.Manager. При добавлении очередного элемента управления на карту или при изменении размеров карты менеджер проверяет размер элементов и при необходимости изменяет его. При этом менеджер изменяет размер у всех элементов управления, поддерживающих адаптивность.
Чтобы задать фиксированный размер элемента управления, следует задать для него опцию size
. Если в качестве значения опции указать один из трех размеров ('small', 'medium', 'large'), то элемент управления всегда будет представлен в этом размере. Если указать значение 'auto', элемент будет автоматически изменять свой внешний вид в зависимости от размеров карты.
// Фиксируем состояние элемента управления «Пробки».
// Теперь он всегда будет отображаться в большом размере.
myMap.controls.get('trafficControl').options.set('size', 'large');
Для каждого элемента управления также определена опция maxWidth
— массив чисел, в котором каждому из состояний ставится в соответствие предельная ширина, при достижении которой элемент управления переключается в более компактный вид.
Адаптивность собственных элементов управления
Чтобы сделать собственные элементы управления адаптивными, можно использовать встроенные классы API — control.Button и control.ListBox. Макеты кнопки и выпадающего списка по умолчанию реализуют адаптивность. Если в элементах управления заданы текст и картинка, они будут изменять свой внешний вид следующим образом:
Кнопка |
Выпадающий список |
'small' |
'small' |
'medium' |
'medium' |
'large' |
'large' |
Ниже приведен пример создания собственной адаптивной кнопки с использованием класса control.Button.
var myButton = new ymaps.control.Button({
data: {
// Текст кнопки.
content: "<b>Кнопка</b>",
// Изображение иконки кнопки.
image: 'my_button.png',
// Текст всплывающей подсказки, которая появляется
// при наведении на кнопку курсора мыши.
title: "Нажми меня"
},
options: {
// Пусть кнопка будет менять ширину в зависимости от размера карты.
// Зададим в опции maxWidth максимальную ширину кнопки
// для трех ее состояний: 'small', 'medium' и 'large' соответственно.
// Фактический размер кнопки будет вычисляться автоматически в зависимости
// от размеров карты и длины текста, заданного в поле content.
maxWidth: [28, 150, 178]
}
});
myMap.controls.add(myButton);
Примечание
Если в опции maxWidth
задать одно число (например, maxWidth: 100
), то это значение будет применяться ко всем трем состояниям кнопки, то есть кнопка не будет адаптивной. Если опция maxWidth
не задана, то по умолчанию для всех состояний кнопки будет использоваться значение '90'.
Обратите внимание, что опция maxWidth
задает не фактическую ширину кнопки, а границы, в которые должен вмещаться текст кнопки для разных состояний (текст задается в поле content
). Например, если для состояния 'small' текст не вмещается в указанную в опции maxWidth
ширину, кнопка переключится в следующее состояние (если это позволяют размеры карты). Если текст не вместился в границы, заданные для состояния 'large', такой текст будет отображаться не полностью.
|
|
Если для кнопки необходимо задать собственные правила изменения размеров, следует использовать фабрику templateLayoutFactory. Ниже рассмотрен пример, в котором кнопка меняет свой внешний вид в зависимости от того, нажата она или нет (по умолчанию кнопки изменяют внешний вид в зависимости от ширины карты).
var ButtonLayout = ymaps.templateLayoutFactory.createClass([
'<div alt="{{ data.title }}" class="my-button ',
'{% if state.size == "small" %}my-button_small{% endif %}',
'{% if state.size == "medium" %}my-button_medium{% endif %}',
'{% if state.size == "large" %}my-button_large{% endif %}',
'{% if state.selected %} my-button_selected{% endif %}">',
'<img class="my-button__img" src="{{ data.image }}" alt="{{ data.title }}">',
'<span class="my-button__text">{{ data.content }}</span>',
'</div>'
].join('')),
button = new ymaps.control.Button({
data: {
content: "Жмак-жмак",
image: 'examples/maps/ru/button_layout/_images/pen.gif',
title: "Жмак-жмак-жмак"
},
options: {
layout: ButtonLayout
}
});
myMap.controls.add(button, {
float: "right"
});
Поддерживающие адаптивность элементы
Чтобы поддерживать адаптивность, элементы управления должны быть расположены слева или справа (опции float: 'left' или float: 'right'). Исключением является элемент «Ползунок масштаба», который адаптивен и при выставленной опции float: «none». Следующие элементы управления адаптивны:
-
Примечание
Элемент «Ползунок масштаба» изменяет свой внешний вид в зависимости от высоты карты.
Некоторые элементы управления всегда одного размера:
Примеры
В песочнице приведены примеры, демонстрирующие поведение адаптивных элементов управления.