Приложения Blockly состоят из элементов HTML и SVG. Эти элементы помечены CSS-классами, которые определяют их содержимое (например, blocklyBlock , blocklyField ), а также их состояние (например, blocklyEditing , blocklySelected ). Blockly также предоставляет набор CSS-правил по умолчанию.
Вы можете использовать CSS для стилизации своего приложения:
- Переопределите CSS-правила Blockly своими собственными правилами.
- Добавьте собственные CSS-классы к компонентам Blockly для дополнительной специфичности.
- Используйте классы и правила CSS для стилизации пользовательских компонентов.
CSS-классы
Блочные приложения используют CSS-классы для определения элементов, к которым применяется стилизация. Это обеспечивает более точный контроль, чем селекторы типов (элементов).
Блочные CSS-классы
Blockly использует классы CSS для предоставления следующих видов информации об используемых им элементах HTML и SVG.
Тип. Большинство CSS-классов Blockly определяют, что представляет элемент. Например, корневой элемент блока имеет обозначение
blocklyBlock. Некоторые элементы имеют несколько классов, каждый из которых более специфичен, чем предыдущий. Например, корневой элемент текстового поля ввода имеет обозначенияblocklyField,blocklyInputFieldиblocklyTextInputField. Классы типов остаются неизменными на протяжении всего жизненного цикла компонента.Состояние. Blockly также использует CSS-классы для определения состояния компонента. Например, когда курсор находится на поле ввода текста, его корневой элемент помечается классом
blocklyEditing. При перемещении курсора этот класс удаляется.Дополнительная информация. Blockly использует несколько CSS-классов для предоставления дополнительной информации. Например, элемент
<div>для внедрения содержит классы, которые содержат имя текущего рендерера и темы рабочей области. Эти классы, как правило, остаются неизменными на протяжении всего срока службы приложения.
Самый простой способ узнать, какие классы CSS использует Blockly, — открыть инструменты разработчика вашего браузера и просмотреть элементы, используемые вашим приложением.
Пользовательские CSS-классы
Вы можете использовать пользовательские классы CSS, чтобы придать большую специфичность компонентам Blockly.
Рабочие пространства
Чтобы добавить или удалить класс CSS из элемента <div> внедрения рабочей области, вызовите WorkspaceSvg.addClass или WorkspaceSvg.removeClass .
Ящики для инструментов
Чтобы добавить CSS-класс к кнопке или метке на панели инструментов, используйте ключ web-class в JSON-определении панели инструментов. Подробнее см. в разделе «Кнопки и метки» .
Чтобы переопределить CSS-классы, используемые для различных частей категории, используйте ключ cssConfig в JSON-определении категории. Это позволяет стилизовать отдельные категории. Подробнее см. в разделе CSS категории .
Блоки
Чтобы добавить CSS-классы в пользовательский блок, передайте строку или массив строк в ключ classes .
Blockly.common.defineBlocksWithJsonArray([{
"type": "string_length",
"message0": 'length of %1',
"args0": [
{
"type": "input_value",
"name": "VALUE",
"check": "String",
}
],
"classes": "myStringLengthBlock",
"output": "Number",
"colour": 160,
}]);
Вы также можете добавить или удалить класс CSS из элемента <g> блока, вызвав BlockSvg.addClass или BlockSvg.removeClass .
Поля меток
Чтобы добавить или удалить CSS-класс из элемента <text> , используемого полем метки или сериализуемым полем метки, вызовите метод FieldLabel.setClass . Вы также можете передать имя класса конструктору метки.
CSS-классы и пользовательские компоненты
При создании пользовательского компонента используйте один из следующих методов для добавления пользовательских классов CSS:
Если ваш компонент является подклассом
FieldилиIcon, переопределите методinitView. Например:class MyCustomField extends Blockly.FieldTextInput { ... initView() { super.initView(); // Add custom CSS class so we can style the field. if (this.fieldGroup_) { Blockly.utils.dom.addClass(this.fieldGroup_, 'myCustomField'); } } }Дополнительные сведения см. в разделе Настройка полей с помощью CSS или Создание представления значка .
При создании элемента SVG передайте свой класс в
Blockly.utils.dom.createSvgElement:this.svgRoot = Blockly.utils.dom.createSvgElement(Svg.G, {'class': 'myCustomComponent'});При создании HTML-элемента используйте
Blockly.utils.dom.addClass:const myDiv = document.createElement('div'); Blockly.utils.dom.addClass(myDiv, 'myInformation');
Чтобы добавить или удалить классы после построения, используйте Blockly.utils.dom.addClass или Blockly.utils.dom.removeClass .
setMyHighlight(highlight) {
if (highlight) {
Blockly.utils.dom.addClass(this.svgRoot, 'myHighlight');
} else {
Blockly.utils.dom.removeClass(this.svgRoot, 'myHighlight');
}
}
Фон правил CSS
Если вы понимаете свойства стилей SVG и каскадность CSS, вы можете пропустить этот раздел.
Свойства стилей SVG и свойства CSS
Элементы SVG стилизуются с помощью свойств стилей SVG . Их можно использовать в качестве атрибутов элементов SVG (также известных как атрибуты представления ) или в правилах CSS. Таким образом, все нижеперечисленные действия выполняют одно и то же.
<!-- SVG file with presentation attributes. -->
<circle fill="red" ... />
<!-- SVG file with <style> tag. -->
<style>
circle {fill:red;}
</style>
<circle ... />
/* External CSS file.*/
circle {fill:red;}
<!-- SVG file with inline style. -->
<circle style="fill:red;" ... />
Список свойств стилей SVG связан со списком свойств CSS, но отличается от него:
- Одна и та же концепция, одно и то же название. Например, и SVG, и CSS используют
directionдля указания направления письма (LTR или RTL). - Та же концепция, другое название. Например, SVG использует
fillдля указания цвета заливки; CSS используетbackground-color. - Только CSS. В CSS есть много свойств, которых нет в SVG, например,
marginиpadding. - Только SVG. У SVG есть несколько свойств, которых нет в CSS, например
xиy.
Таким образом, если вы стилизуете элемент SVG, используйте свойства стилизации SVG . Если вы стилизуете элемент HTML, используйте свойства CSS .
CSS-каскад
Каскад CSS определяет приоритеты правил CSS, которые определяют, какое правило использовать, если к данному свойству и элементу применяется более одного правила. Следующий упрощённый каскад охватывает части каскада, наиболее часто используемые в Blockly, и может помочь вам ответить на вопрос: «Почему мой CSS не работает?»
Упрощенный каскад
Чтобы определить, какое правило применяется к конкретному элементу и свойству, выполните следующие действия и остановитесь, когда останется только одно правило:
- Соберите все правила, применимые к свойству и элементу.
- Если какие-либо правила имеют аннотацию
!important, отбросьте все правила, которые не имеют аннотации!important. Выбирайте правила с наибольшей специфичностью .
- Атрибуты представления SVG имеют нулевую специфичность.
- Специфичность правил в теге
<style>или внешней таблице стилей рассчитывается обычным образом. - Встроенные стили (стили, заданные атрибутом
style) имеют более высокую специфичность, чем любой селектор.
Выберите правило, которое стоит последним в документе.
Если ни одно правило не применяется, унаследуйте значение свойства от родителя элемента.
Этот алгоритм не учитывает следующие части каскада:
- Свойство
transition, имеющее наивысший приоритет. Blockly использует несколько из них. - Правило
@mediaat. Blockly использует одно из них. - Правила, заданные браузером или пользователем.
- Правила
@scopeи@layer, а также свойствоanimation, которые не используются Blockly.
CSS-правила
Правила CSS определяют стили вашего приложения. Blockly предоставляет набор правил по умолчанию, которые вы можете переопределить своими собственными правилами.
Блочные правила CSS
Blockly предоставляет набор CSS-правил по умолчанию. Способ и место добавления этих правил влияют на их приоритет .
Теги стиля
Большинство CSS-правил Blockly задаются двумя тегами <style> . Поскольку эти теги находятся в верхней части страницы, правила в них имеют меньший приоритет, чем правила той же специфичности, расположенные далее на странице.
Правила Blockly.css.register
При внедрении Blockly добавляет тег <style> как дочерний элемент тега <head> . Правила в этом теге взяты из:
- Пространство имён
Blockly.css. Чтобы увидеть эти правила, откройте core/css.ts и найдитеlet content. - Отдельные компоненты, которые вызывают
Blockly.css.registerдля добавления CSS-правил, специфичных для компонента. Посколькуcss.registerдобавляет эти правила в конец строкиcontent, они имеют более высокий приоритет, чем правила той же специфичности, добавленные ранее. Чтобы увидеть эти правила, см. вызовыBlockly.css.register.
Если вы не хотите использовать эти правила, установите для параметра конфигурации css значение false . В этом случае вы несёте ответственность за предоставление альтернативного набора правил CSS.
Правила рендеринга
При создании экземпляра рендерера он добавляет тег <style> , содержащий CSS-правила, специфичные для рендерера, в качестве дочернего элемента тега <head> . Обратите внимание, что эти правила добавляются всегда — на них не влияет параметр конфигурации css . Чтобы увидеть эти правила, найдите метод getCss_ в вашем рендерере.
Встроенные стили
Встроенные стили задаются атрибутом style и обычно создаются при создании DOM-модели компонента. Частичный список см. в этом запросе на GitHub .
Встроенные стили применяются непосредственно к элементу, к которому они относятся, и имеют более высокую специфичность, чем любой селектор. Поэтому для их переопределения обычно требуется использовать аннотацию !important .
Атрибуты представления SVG
Атрибуты представления SVG — это свойства стилизации SVG, используемые в качестве атрибутов SVG-элементов. Они имеют нулевую специфичность и не могут содержать аннотацию !important , поэтому имеют самый низкий приоритет среди всех правил Blockly. Blockly обычно создаёт их в вызовах createSvgElement .
Добавьте свои собственные правила CSS
Вы можете добавить собственные CSS-правила, используя те же методы, что и Blockly:
- Вызовите
Blockly.css.registerперед внедрением Blockly. Ваши правила будут добавлены после правил Blockly и будут иметь более высокий приоритет, чем правила Blockly с той же специфичностью. - Добавьте тег
<style>или ссылку на внешнюю таблицу стилей в качестве дочернего элемента тега<head>. Поскольку Blockly добавляет свои правила в качестве первых двух дочерних элементов тега<head>, ваши правила будут иметь более высокий приоритет, чем правила Blockly с той же специфичностью. - Используйте встроенные стили для добавления стилей к элементам в пользовательском компоненте. Эти правила будут иметь более высокую специфичность, чем любые правила с селектором.
- Используйте атрибуты представления для элементов SVG в пользовательском компоненте. Эти правила будут иметь меньшую специфичность, чем любые правила с селектором.
Поиск неисправностей
Если ваш CSS не работает, вот несколько возможных причин:
Вы используете свойства CSS для элемента SVG или свойства стилей SVG для элемента HTML. См. раздел Сравнение свойств стилей SVG и свойств CSS .
Ваше правило имеет более низкий приоритет, чем другое правило. Обычно это связано с более низкой специфичностью . Возможные способы исправления:
- Используйте селектор класса вместо селектора типа (элемента).
- Используйте множественные селекторы.
- Если возможно, добавьте пользовательский класс к целевому элементу и используйте этот класс в своем правиле.
- В крайнем случае добавьте к правилу аннотацию
!important. Это единственный вариант, если конкурирующее правило указано с использованием встроенного стиля (атрибутаstyle).
Ваше правило имеет ту же специфичность, что и другое правило, но расположено выше на странице. Если вы не можете повысить специфичность правила, переместите его ближе к концу страницы.
Существует два типа правил CSS, которые вы не можете переопределить:
- Свойства, которые задаются внутри правила
transition. -
!importantправила, указанные браузером.