Le applicazioni Blockly sono costituite da elementi HTML e SVG. Questi elementi
sono etichettati con classi CSS che identificano ciò che rappresentano (ad es.
blocklyBlock
, blocklyField
) e il loro stato (ad es. blocklyEditing
,
blocklySelected
). Blockly fornisce anche un insieme predefinito di regole CSS.
Puoi utilizzare CSS per definire lo stile della tua applicazione:
- Esegui l'override delle regole CSS di Blockly con le tue regole.
- Aggiungi le tue classi CSS ai componenti Blockly per una maggiore specificità.
- Utilizza classi e regole CSS per applicare uno stile ai componenti personalizzati.
Classi CSS
Le applicazioni Blockly utilizzano le classi CSS per identificare gli elementi a cui applicare uno stile. Ciò fornisce un controllo più granulare rispetto ai selettori di tipo (elemento).
Classi CSS di Blockly
Blockly utilizza le classi CSS per fornire i seguenti tipi di informazioni sugli elementi HTML e SVG che utilizza.
Tipo. La maggior parte delle classi CSS di Blockly identifica ciò che rappresenta un elemento. Ad esempio, l'elemento principale di un blocco è etichettato
blocklyBlock
. Alcuni elementi sono etichettati con più classi, ognuna più specifica della precedente. Ad esempio, l'elemento principale di un campo di input di testo è etichettatoblocklyField
,blocklyInputField
eblocklyTextInputField
. I tipi di classi rimangono invariati per tutta la durata di un componente.Stato. Blockly utilizza anche le classi CSS per specificare lo stato di un componente. Ad esempio, quando il cursore si trova su un campo di input di testo, il relativo elemento radice è etichettato con la classe
blocklyEditing
. Quando il cursore viene spostato, questa classe viene rimossa.Informazioni aggiuntive. Blockly utilizza alcune classi CSS per fornire informazioni aggiuntive. Ad esempio, l'iniezione
<div>
ha classi che forniscono il nome del renderer e del tema correnti dello spazio di lavoro. Queste classi in genere rimangono invariate per tutta la durata dell'applicazione.
Il modo più semplice per scoprire quali classi CSS utilizza Blockly è aprire gli strumenti per sviluppatori del browser ed esaminare gli elementi utilizzati dall'applicazione.
Classi CSS personalizzate
Puoi utilizzare classi CSS personalizzate per fornire maggiore specificità ai componenti Blockly.
Aree di lavoro
Per aggiungere o rimuovere una classe CSS dall'inserimento <div>
di uno spazio di lavoro, chiama
WorkspaceSvg.addClass
o WorkspaceSvg.removeClass
.
Toolboxes
Per aggiungere una classe CSS a un pulsante o a un'etichetta in una casella degli strumenti, utilizza il tasto web-class
nella definizione JSON della casella degli strumenti. Per saperne di più, consulta Pulsanti ed etichette.
Per ignorare le classi CSS utilizzate per le varie parti di una categoria, utilizza la chiave
cssConfig
nella definizione JSON della categoria. In questo modo puoi
applicare uno stile alle singole categorie. Per ulteriori informazioni, vedi CSS
categoria.
Stoppate
Per aggiungere classi CSS a un blocco personalizzato, passa una stringa o un array di stringhe alla chiave
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,
}]);
Puoi anche aggiungere o rimuovere una classe CSS dall'elemento <g>
di un blocco chiamando
BlockSvg.addClass
o BlockSvg.removeClass
.
Campi delle etichette
Per aggiungere o rimuovere una classe CSS dall'elemento <text>
utilizzato da un campo etichetta o da un campo etichetta serializzabile, chiama FieldLabel.setClass
. Puoi anche passare un nome di classe al costruttore dell'etichetta.
Classi CSS e componenti personalizzati
Quando crei un componente personalizzato, utilizza uno dei seguenti metodi per aggiungere classi CSS personalizzate:
Se il componente è una sottoclasse di
Field
oIcon
, esegui l'override del metodoinitView
. Ad esempio: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'); } } }
Per saperne di più, vedi Personalizzare i campi con CSS o Creare la visualizzazione dell'icona.
Quando crei un elemento SVG, passa la classe a
Blockly.utils.dom.createSvgElement
:this.svgRoot = Blockly.utils.dom.createSvgElement(Svg.G, {'class': 'myCustomComponent'});
Quando crei un elemento HTML, utilizza
Blockly.utils.dom.addClass
:const myDiv = document.createElement('div'); Blockly.utils.dom.addClass(myDiv, 'myInformation');
Per aggiungere o rimuovere classi dopo la costruzione, utilizza Blockly.utils.dom.addClass
o
Blockly.utils.dom.removeClass
.
setMyHighlight(highlight) {
if (highlight) {
Blockly.utils.dom.addClass(this.svgRoot, 'myHighlight');
} else {
Blockly.utils.dom.removeClass(this.svgRoot, 'myHighlight');
}
}
Sfondo delle regole CSS
Se conosci le proprietà di stile SVG e la cascata CSS, puoi saltare questa sezione.
Proprietà di stile SVG e proprietà CSS
Gli elementi SVG sono stilizzati con le proprietà di stile SVG. Questi possono essere utilizzati come attributi sugli elementi SVG (ovvero attributi di presentazione) o nelle regole CSS. Pertanto, tutte le seguenti azioni hanno lo stesso effetto.
<!-- 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;" ... />
L'elenco delle proprietà di stile SVG è correlato all'elenco delle proprietà CSS, ma è diverso:
- Stesso concetto, stesso nome. Ad esempio, sia SVG che CSS utilizzano
direction
per specificare se il testo è LTR o RTL. - Stesso concetto, nome diverso. Ad esempio, SVG utilizza
fill
per specificare il colore di riempimento, mentre CSS utilizzabackground-color
. - Solo CSS. Il CSS ha molte proprietà che non sono presenti in SVG, ad esempio
margin
epadding
. - Solo SVG. SVG ha alcune proprietà che non sono in CSS, come
x
ey
.
Pertanto, se stai applicando uno stile a un elemento SVG, utilizza le proprietà di stile SVG. Se stai applicando uno stile a un elemento HTML, utilizza le proprietà CSS.
CSS a cascata
La cascata CSS determina le priorità delle regole CSS, che determinano quale regola utilizzare se più di una regola si applica a una determinata proprietà ed elemento. La seguente cascata semplificata copre le parti della cascata più comunemente utilizzate da Blockly e può aiutarti a rispondere alla domanda "Perché il mio CSS non funziona?".
Cascata semplificata
Per determinare quale regola si applica a un determinato elemento e a una determinata proprietà, segui questi passaggi e interrompiti quando rimane una sola regola:
- Raccogli tutte le regole che si applicano alla proprietà e all'elemento.
- Se una regola ha un'annotazione
!important
, ignora tutte le regole che non hanno un'annotazione!important
. Scegli le regole con la specificità più elevata.
- Gli attributi di presentazione SVG hanno una specificità pari a zero.
- Le regole in un tag
<style>
o in un foglio di stile esterno hanno la loro specificità calcolata normalmente. - Gli stili incorporati (stili impostati da un attributo
style
) hanno una specificità superiore a qualsiasi selettore.
Scegli la regola che appare per ultima nel documento.
Se non viene applicata alcuna regola, eredita il valore della proprietà dall'elemento principale.
Questo algoritmo non prende in considerazione le seguenti parti della cascata:
- La proprietà
transition
, che ha la priorità più alta. Blockly ne utilizza alcuni. - La regola
@media
. Blockly ne utilizza uno. - Regole specificate dal browser o dall'utente.
- Le regole @
@scope
e@layer
e la proprietàanimation
, che non vengono utilizzate da Blockly.
Regole CSS
Le regole CSS specificano lo stile della tua applicazione. Blockly fornisce un insieme predefinito di regole che puoi sostituire con le tue.
Regole CSS di Blockly
Blockly fornisce un insieme predefinito di regole CSS. Il modo e la posizione in cui vengono aggiunte queste regole influiscono sulla loro priorità.
Tag di stile
La maggior parte delle regole CSS di Blockly sono specificate in due tag <style>
. Poiché
questi tag si trovano nella parte superiore della pagina, le regole contenute hanno una priorità inferiore
rispetto alle regole con la stessa specificità che si trovano più in basso nella pagina.
Regole Blockly.css.register
Quando viene inserito Blockly, viene aggiunto un tag <style>
come elemento secondario del tag <head>
. Le regole in questo tag provengono da:
- Lo spazio dei nomi
Blockly.css
. Per visualizzare queste regole, apri core/css.ts e cercalet content
. - Componenti individuali, che chiamano
Blockly.css.register
per aggiungere regole CSS specifiche per i componenti. Poichécss.register
aggiunge queste regole alla fine della stringacontent
, hanno una priorità maggiore rispetto alle regole con la stessa specificità aggiunte in precedenza. Per visualizzare queste regole, consulta la sezione Chiamate aBlockly.css.register
.
Se non vuoi utilizzare queste regole, imposta l'opzione di configurazione css
su false
. In questo caso, è tua responsabilità fornire un insieme alternativo di
regole CSS.
Regole del renderer
Quando viene creata un'istanza del renderer, questo aggiunge un tag <style>
contenente
regole CSS specifiche del renderer come elemento secondario del tag <head>
. Tieni presente che queste regole vengono sempre aggiunte e non sono interessate dall'opzione di configurazione css
. Per visualizzare queste regole, cerca il metodo getCss_
nel renderer.
Stili in linea
Gli stili in linea vengono specificati con l'attributo style
e vengono generalmente creati
quando viene creato il DOM per un componente. Per un elenco parziale, consulta questa query di GitHub.
Gli stili in linea vengono applicati direttamente all'elemento in cui si verificano e hanno una
specificità superiore a qualsiasi selettore. Per questo motivo, l'override in genere
richiede l'utilizzo di un'!important
annotazione.
Attributi di presentazione SVG
Gli attributi di presentazione SVG sono proprietà di stile SVG utilizzate come
attributi degli elementi SVG. Hanno una specificità pari a zero e non possono contenere
un'annotazione !important
, pertanto hanno la priorità più bassa di tutte le regole di Blockly. Blockly in genere li crea in chiamate a
createSvgElement
.
Aggiungere regole CSS personalizzate
Puoi aggiungere le tue regole CSS utilizzando gli stessi metodi di Blockly:
- Chiama
Blockly.css.register
prima di inserire Blockly. Le tue regole verranno aggiunte dopo quelle di Blockly e avranno una priorità maggiore rispetto alle regole di Blockly con la stessa specificità. - Aggiungi un tag
<style>
o un link a un foglio di stile esterno come elemento secondario successivo del tag<head>
. Poiché Blockly aggiunge le sue regole come primi due elementi secondari del tag<head>
, le tue regole avranno una priorità maggiore rispetto alle regole di Blockly con la stessa specificità. - Utilizza gli stili in linea per aggiungere stili agli elementi in un componente personalizzato. Queste regole avranno una specificità maggiore rispetto a qualsiasi regola con un selettore.
- Utilizza gli attributi di presentazione sugli elementi SVG in un componente personalizzato. Queste regole avranno una specificità inferiore rispetto a qualsiasi regola con un selettore.
Risoluzione dei problemi
Se il tuo CSS non funziona, ecco alcune possibili cause:
Stai utilizzando proprietà CSS su un elemento SVG o proprietà di stile SVG su un elemento HTML. Consulta Proprietà di stile SVG e proprietà CSS.
La tua regola ha una priorità inferiore rispetto a un'altra regola. Di solito, questo problema è dovuto a una specificità inferiore. Ecco alcuni modi per risolvere il problema:
- Utilizza un selettore di classe anziché un selettore di tipo (elemento).
- Utilizza più selettori.
- Se possibile, aggiungi una classe personalizzata all'elemento di destinazione e utilizza questa classe nella regola.
- Come ultima risorsa, aggiungi un'annotazione
!important
alla regola. Questa è la tua unica scelta se viene specificata una regola in competizione utilizzando uno stile in linea (attributostyle
).
La tua regola ha la stessa specificità di un'altra regola, ma si verifica prima nella pagina. Se non riesci ad aumentare la specificità della regola, spostala più in basso nella pagina.
Esistono due tipi di regole CSS che non puoi sovrascrivere:
- Proprietà impostate all'interno di una regola
transition
. - Regole
!important
specificate dal browser.