Приложения 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 использует несколько из них. - Правило
@media
at. 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
правила, указанные браузером.