HTML

Cosa fa un DOCTYPE?

DOCTYPE è l'abbreviazione di Document Type. Un DOCTYPE è sempre associato a un DTD - per Document Type Definition.

Un DTD definisce come dovrebbero essere strutturati i documenti di un certo tipo (ad esempio, un button può contenere uno span ma non un div), mentre un DOCTYPE dichiara quale DTD un documento presumibilmente rispetta (ad esempio, questo documento rispetta il DTD HTML).

Per le pagine web, la dichiarazione DOCTYPE è obbligatoria. Viene utilizzata per indicare agli user agent quale versione delle specifiche HTML rispetta il tuo documento. Una volta che uno user agent ha riconosciuto un DOCTYPE corretto, attiverà la modalità no-quirks corrispondente a questo DOCTYPE per leggere il documento. Se uno user agent non riconosce un DOCTYPE corretto, attiverà la modalità quirks.

La dichiarazione DOCTYPE per gli standard HTML5 è <!DOCTYPE html>.

Come si serve una pagina con contenuti in più lingue?

Presumo che la domanda si riferisca al caso più comune, ovvero come servire una pagina con contenuti disponibili in più lingue, ma il contenuto all'interno della pagina dovrebbe essere visualizzato solo in una lingua coerente.

Quando viene effettuata una richiesta HTTP a un server, l'user agent richiedente di solito invia informazioni sulle preferenze linguistiche, come nell'intestazione Accept-Language. Il server può quindi utilizzare queste informazioni per restituire una versione del documento nella lingua appropriata, se tale alternativa è disponibile. Il documento HTML restituito dovrebbe anche dichiarare l'attributo lang nel tag <html>, come <html lang="en">...</html>.

Naturalmente questo è inutile per far sapere a un motore di ricerca che lo stesso contenuto è disponibile in diverse lingue, e quindi devi anche utilizzare l'attributo hreflang nel <head>. Ad esempio: <link rel="alternate" hreflang="de" href="http://de.example.com/page.html" />

Nel back end, il markup HTML conterrà segnaposto i18n e contenuti per la lingua specifica memorizzati in formati YML o JSON. Il server quindi genera dinamicamente la pagina HTML con il contenuto in quella particolare lingua, di solito con l'aiuto di un framework di back end.

A che tipo di cose devi prestare attenzione quando progetti o sviluppi siti multilingue?

  • Usa l'attributo lang nel tuo HTML.
  • Indirizzare gli utenti alla loro lingua madre - Consenti a un utente di cambiare facilmente e senza problemi il proprio paese/lingua.
  • Il testo nelle immagini basate su raster (ad esempio png, gif, jpg, ecc.) non è un approccio scalabile - Inserire testo in un'immagine è ancora un modo popolare per visualizzare caratteri belli e non di sistema su qualsiasi computer. Tuttavia, per tradurre il testo dell'immagine, ogni stringa di testo dovrà avere un'immagine separata creata per ogni lingua. Qualsiasi cosa in più di una manciata di sostituzioni come questa può rapidamente sfuggire di mano.
  • Lunghezza restrittiva di parole/frasi - Alcuni contenuti possono essere più lunghi se scritti in un'altra lingua. Fai attenzione ai problemi di layout o di overflow nel design. È meglio evitare di progettare dove la quantità di testo potrebbe rovinare un design. I conteggi dei caratteri entrano in gioco con elementi come titoli, etichette e pulsanti. Sono meno un problema con il testo a scorrimento libero come il testo del corpo o i commenti.
  • Fai attenzione a come vengono percepiti i colori - I colori sono percepiti in modo diverso tra lingue e culture. Il design dovrebbe usare il colore in modo appropriato.
  • Formattazione di date e valute - Le date del calendario sono talvolta presentate in modi diversi. Ad esempio, "31 maggio 2012" negli Stati Uniti vs. "31 May 2012" in alcune parti d'Europa.
  • Non concatenare stringhe tradotte - Non fare nulla come "La data di oggi è " + data. Si romperà in lingue con un ordine di parole diverso. Usa invece una stringa modello con sostituzione di parametri per ogni lingua. Ad esempio, guarda le due frasi seguenti in inglese e cinese rispettivamente: Viaggerò il {% date %} e {% date %} 我会出发. Nota che la posizione della variabile è diversa a causa delle regole grammaticali della lingua.
  • Direzione di lettura della lingua - In inglese, leggiamo da sinistra a destra, dall'alto in basso, nel giapponese tradizionale, il testo si legge dall'alto in basso, da destra a sinistra.
  • Utile - includere la locale nel percorso (ad esempio en_US, zh_CN, ecc).

A cosa servono gli attributi `data-`?

Prima che i framework JavaScript diventassero popolari, gli sviluppatori front end usavano gli attributi data- per archiviare dati aggiuntivi all'interno del DOM stesso, senza altri espedienti come attributi non standard o proprietà extra sul DOM. È destinato a memorizzare dati personalizzati privati della pagina o dell'applicazione, per i quali non esistono attributi o elementi più appropriati.

Oggi, l'uso degli attributi data- non è generalmente incoraggiato. Un motivo è che gli utenti possono modificare facilmente l'attributo data utilizzando l'elemento ispeziona nel browser. Il modello di dati è meglio memorizzato all'interno di JavaScript stesso e rimane aggiornato con il DOM tramite data binding, possibilmente tramite una libreria o un framework.

Tuttavia, un uso perfettamente valido degli attributi data è quello di aggiungere un hook per i framework di test end-to-end come Selenium e Capybara senza dover creare classi o attributi ID senza significato. L'elemento ha bisogno di un modo per essere trovato da una particolare specifica Selenium e qualcosa come data-selector='the-thing' è un modo valido per farlo senza convolvere il markup semantico.

Considera HTML5 come una piattaforma web aperta. Quali sono gli elementi costitutivi di HTML5?

  • Semantica - Ti consente di descrivere in modo più preciso il tuo contenuto.
  • Connettività - Ti consente di comunicare con il server in modi nuovi e innovativi.
  • Offline e archiviazione - Consente alle pagine web di archiviare dati lato client localmente e operare offline in modo più efficiente.
  • Multimedia - Rendere video e audio cittadini di prima classe nel Web aperto.
  • Grafica ed effetti 2D/3D - Consente una gamma molto più diversificata di opzioni di presentazione.
  • Prestazioni e integrazione - Fornisce una maggiore ottimizzazione della velocità e un migliore utilizzo dell'hardware del computer.
  • Accesso al dispositivo - Consente l'utilizzo di vari dispositivi di input e output.
  • Stile - Consente agli autori di scrivere temi più sofisticati.

Descrivi la differenza tra un `cookie`, `sessionStorage` e `localStorage`.

Tutte le tecnologie sopra menzionate sono meccanismi di archiviazione chiave-valore lato client. Sono in grado di archiviare valori solo come stringhe.

| | cookie | localStorage | sessionStorage | | --- | --- | --- | --- | | Iniziatore | Client o server. Il server può usare l'header Set-Cookie | Client | Client | | Scadenza | Impostata manualmente | Per sempre | Alla chiusura della scheda | | Persistente tra le sessioni del browser | Dipende se è impostata la scadenza | Sì | No | | Inviato al server con ogni richiesta HTTP | I cookie vengono inviati automaticamente tramite l'header Cookie | No | No | | Capacità (per dominio) | 4kb | 5MB | 5MB | | Accessibilità | Qualsiasi finestra | Qualsiasi finestra | Stessa scheda |

Nota: Se l'utente decide di cancellare i dati di navigazione tramite qualsiasi meccanismo fornito dal browser, questo cancellerà qualsiasi cookie, localStorage o sessionStorage memorizzato. È importante tenerlo presente quando si progetta per la persistenza locale, specialmente quando si confronta con alternative come l'archiviazione lato server in un database o simili (che ovviamente persisteranno nonostante le azioni dell'utente).

Descrivi la differenza tra `<script>`, `<script async>` e `<script defer>`.

  • <script> - Il parsing HTML viene bloccato, lo script viene recuperato ed eseguito immediatamente, il parsing HTML riprende dopo l'esecuzione dello script.
  • <script async> - Lo script verrà recuperato in parallelo al parsing HTML ed eseguito non appena disponibile (potenzialmente prima che il parsing HTML sia completato). Usa async quando lo script è indipendente da qualsiasi altro script sulla pagina, ad esempio, analytics.
  • <script defer> - Lo script verrà recuperato in parallelo al parsing HTML ed eseguito quando la pagina ha finito di essere analizzata. Se ce ne sono più di uno, ogni script differito viene eseguito nell'ordine in cui è stato incontrato nel documento. Se uno script si basa su un DOM completamente analizzato, l'attributo defer sarà utile per garantire che l'HTML sia completamente analizzato prima dell'esecuzione. Uno script differito non deve contenere document.write.

Nota: Gli attributi async e defer vengono ignorati per gli script che non hanno un attributo src.

Perché è generalmente una buona idea posizionare i `<link>` CSS tra `<head></head>` e gli `<script>` JS appena prima di `</body>`? Conosci qualche eccezione?

Posizionamento dei <link> nel <head>

Mettere i <link> nel <head> fa parte delle specifiche corrette per la creazione di un sito web ottimizzato. Quando una pagina viene caricata per la prima volta, HTML e CSS vengono analizzati contemporaneamente; HTML crea il DOM (Document Object Model) e CSS crea il CSSOM (CSS Object Model). Entrambi sono necessari per creare gli elementi visivi in un sito web, consentendo un rapido tempo di "prima pittura significativa". Questo rendering progressivo è una categoria di ottimizzazione in cui i siti vengono misurati nei loro punteggi di performance. Mettere i fogli di stile vicino alla fine del documento è ciò che proibisce il rendering progressivo in molti browser. Alcuni browser bloccano il rendering per evitare di dover ridipingere gli elementi della pagina se i loro stili cambiano. L'utente rimane quindi bloccato a visualizzare una pagina bianca vuota. Altre volte possono verificarsi lampeggi di contenuto non stilizzato (FOUC), che mostrano una pagina web senza stili applicati.

Posizionamento degli <script> appena prima di </body>

I tag <script> bloccano il parsing HTML mentre vengono scaricati ed eseguiti, il che può rallentare la tua pagina. Posizionare gli script in fondo consentirà all'HTML di essere analizzato e visualizzato all'utente per primo.

Un'eccezione per il posizionamento degli <script> in fondo è quando il tuo script contiene document.write(), ma al giorno d'oggi non è una buona pratica usare document.write(). Inoltre, posizionare gli <script> in fondo significa che il browser non può iniziare a scaricare gli script finché l'intero documento non è stato analizzato. Ciò garantisce che il tuo codice che deve manipolare gli elementi DOM non genererà un errore e non bloccherà l'intero script. Se devi mettere gli <script> nel <head>, usa l'attributo defer, che otterrà lo stesso effetto di eseguire lo script solo dopo che l'HTML è stato analizzato, ma il browser può scaricare lo script prima.

Tieni presente che mettere gli script appena prima del tag di chiusura </body> creerà l'illusione che la pagina si carichi più velocemente su una cache vuota (poiché gli script non bloccheranno il download del resto del documento). Tuttavia, se hai del codice che vuoi eseguire durante il caricamento della pagina, inizierà l'esecuzione solo dopo che l'intera pagina è stata caricata. Se metti questi script nel tag <head>, inizierebbero l'esecuzione prima - quindi su una cache primed la pagina sembrerebbe effettivamente caricarsi più velocemente.

I tag <head> e <body> sono ora opzionali

Secondo la specifica HTML5, alcuni tag HTML come <head> e <body> sono opzionali. La guida di stile di Google raccomanda persino di rimuoverli per risparmiare byte. Tuttavia, questa pratica non è ancora ampiamente adottata e il guadagno di prestazioni è probabilmente minimo e per la maggior parte dei siti non è probabile che faccia la differenza.

Cos'è il rendering progressivo?

Il rendering progressivo è il nome dato alle tecniche utilizzate per migliorare le prestazioni di una pagina web (in particolare, migliorare il tempo di caricamento percepito) per renderizzare il contenuto per la visualizzazione il più rapidamente possibile.

Era molto più diffuso ai tempi di internet a banda larga, ma è ancora utilizzato nello sviluppo moderno poiché le connessioni dati mobili stanno diventando sempre più popolari (e inaffidabili)!

Esempi di tali tecniche:

  • Caricamento pigro delle immagini - Le immagini sulla pagina non vengono caricate tutte in una volta. JavaScript verrà utilizzato per caricare un'immagine quando l'utente scorre nella parte della pagina che visualizza l'immagine.
  • Prioritizzazione del contenuto visibile (o rendering above-the-fold) - Includere solo il minimo CSS/contenuto/script necessari per la quantità di pagina che verrebbe renderizzata per prima nel browser dell'utente per essere visualizzata il più rapidamente possibile, è quindi possibile utilizzare script differiti o ascoltare l'evento DOMContentLoaded/load per caricare altre risorse e contenuti.
  • Frammenti HTML asincroni - Inviare parti dell'HTML al browser mentre la pagina viene costruita nel back end. Maggiori dettagli sulla tecnica possono essere trovati.

Perché useresti un attributo `srcset` in un tag immagine? Spiega il processo che il browser usa quando valuta il contenuto di questo attributo.

Utilizzeresti l'attributo srcset quando desideri servire immagini diverse agli utenti a seconda della larghezza di visualizzazione del loro dispositivo: servire immagini di qualità superiore ai dispositivi con display retina migliora l'esperienza dell'utente, mentre servire immagini a bassa risoluzione ai dispositivi di fascia bassa aumenta le prestazioni e diminuisce lo spreco di dati (perché servire un'immagine più grande non avrà alcuna differenza visibile). Ad esempio: <img srcset="small.jpg 500w, medium.jpg 1000w, large.jpg 2000w" src="..." alt=""> dice al browser di visualizzare la grafica .jpg piccola, media o grande a seconda della risoluzione del client. Il primo valore è il nome dell'immagine e il secondo è la larghezza dell'immagine in pixel. Per una larghezza del dispositivo di 320px, vengono eseguiti i seguenti calcoli:

  • 500 / 320 = 1.5625
  • 1000 / 320 = 3.125
  • 2000 / 320 = 6.25

Se la risoluzione del client è 1x, 1.5625 è il più vicino, e 500w corrispondente a small.jpg verrà selezionato dal browser.

Se la risoluzione è retina (2x), il browser utilizzerà la risoluzione più vicina al di sopra del minimo. Ciò significa che non sceglierà il 500w (1.5625) perché è maggiore di 1 e l'immagine potrebbe apparire male. Il browser sceglierebbe quindi l'immagine con un rapporto risultante più vicino a 2 che è 1000w (3.125).

Gli attributi srcset risolvono il problema per cui si desidera servire file di immagine più piccoli a dispositivi con schermo stretto, poiché non hanno bisogno di immagini enormi come i display desktop - e anche opzionalmente che si desidera servire immagini a risoluzione diversa a schermi ad alta/bassa densità.

Hai mai usato linguaggi di templating HTML diversi prima d'ora?

Sì, Pug (precedentemente Jade), ERB, Slim, Handlebars, Jinja, Liquid ed EJS solo per citarne alcuni. A mio parere, sono più o meno gli stessi e forniscono funzionalità simili di escape del contenuto e filtri utili per manipolare i dati da visualizzare. La maggior parte dei motori di templating ti consentirà anche di iniettare i tuoi filtri nel caso in cui tu abbia bisogno di un'elaborazione personalizzata prima della visualizzazione.

Qual è la differenza tra canvas e SVG?

Canvas è basato su raster, lavora con i pixel, mentre SVG è basato su vettori, impiegando descrizioni matematiche delle forme. Canvas impiega il disegno imperativo, dove ogni passaggio è specificato con JavaScript, ideale per grafici dinamici e interattivi come animazioni e giochi.

Al contrario, SVG utilizza il disegno dichiarativo, con forme e percorsi definiti direttamente in HTML, rendendolo più accessibile e SEO-friendly. Canvas è ottimale per scene complesse grazie al suo overhead inferiore, ma il ridimensionamento può portare alla perdita di qualità dell'immagine. SVG, essendo indipendente dalla risoluzione, si adatta a varie dimensioni dello schermo senza sacrificare la qualità.

In definitiva, canvas si adatta a grafici dinamici e ad alta intensità di prestazioni, mentre SVG eccelle in grafici scalabili e indipendenti dalla risoluzione, con vantaggi intrinseci di accessibilità e SEO.

Cosa sono gli elementi vuoti in HTML?

Gli elementi vuoti in HTML sono elementi che non contengono alcun contenuto tra i loro tag di apertura e chiusura. Invece, sono tag auto-chiudenti, il che significa che hanno una barra (/) prima della parentesi angolare di chiusura (>). Alcuni esempi comuni di elementi vuoti includono:

  • <img>: Utilizzato per incorporare immagini nel documento.
  • <input>: Utilizzato per accettare l'input dell'utente.
  • <br>: Utilizzato per inserire interruzioni di riga o interruzioni di riga forzate.
  • <hr>: Utilizzato per creare righe orizzontali o separatori.