Mathieu S. and Michael V.
The account used for the slides of @work1
Browserlandschap
@Work 1
Welke browsers zijn er?
Het browserlandschap
Ecosysteem van browsers
Hoeveel verschillende browsers moet je minimaal tellen om aan 98% te geraken van globaal gebruik?
Hoeveel browsers zijn er?
17 verschillende!
Ecosysteem van browsers
Hoeveel verschillende versies zijn er in gebruik van een browser?
Welke browsers zijn er?
Er zijn ontelbaar veel versies momenteel in gebruik!
Ecosysteem van browsers
Verborgen browsers
Er zijn heel veel applicaties die met browsertechnologie gebouwd zijn!
Ecosysteem van browsers
Welke browsers zijn er
Het web is dus niet een statisch iets waar naar gekeken moet worden.
Het web wordt via een ecosysteem van browsers toegankelijk gemaakt.
Het is onze taak om rekening te houden in dit ecosysteem.
Welke browsers zijn er
Een eerste stap om in dit ecosysteem te kunnen werken is om eerst een kijkje te nemen onder de moterkap.
Layout-engines
Het browserlandschap
Layout-engines
Layout-engines zijn het mechanisme die web technologie interpreteren, niet de browser!
Browsers zijn hiervan de meest evidente toepassing van layout-engines.
Maar eigenlijk is een browser niets meer dan een omhulsel van de layout-engine
Layout-engines
Layout-engines
Layout-engines
Is het ook mogelijk om layout-engines te gaan gebruiken zonder browser?
Layout-engines
Layout-engines
Hoeveel verschillende layout-engines zijn er?
Layout-engines
Ecosysteem van browsers
Waarom is dit relevant?
Merk je bij het testen op meerdere browsers, verschillen op tussen browsers?
Dan is de eerste vraag dat je je moet stellen bij welke categorie het hoort:
- Niet-relevante browserverschillen
- Relevante browserverschillen
Minder relevante browserverschillen
Het browserlandschap
Minder relevante browserverschillen
Bepaalde formulier-elementen gaan er anders gaan uitzien als je browsers met elkaar vergelijkt. (Native form elementen overzicht)
En dat is perfect ok!
Niet-relevante browserverschillen
Minder relevante browserverschillen
Een scrollbar zal er ook anders gaan uitzien op Firefox dan op Chrome.
En dat is perfect ok!
Minder relevante browserverschillen
Indien er budget voor is, dan kan je dit zeker gaan bekijken hoe exact je deze browserverschillen wilt uniform maken voor je website.
Minder relevante browserverschillen
De prioriteit blijft eerst de relevante browserverschillen gaan wegwerken en alle courante browsers te ondersteunen!
👎
Resetting browser defaults
Het browserlandschap
Resetting browser defaults
Sommige browserdefaults verschillen in hele kleine mate.
Deze kan je resetten door een CSS file te gaan toevoegen die al deze verschillen ongedaan maken.
Resetting browser defaults
Resetting browser defaults
<head>
...
<link rel="stylesheet" href="reset.css">
<link rel="stylesheet" href="style.css">
...
</head>Resetting browser defaults
Resetting browser defaults heeft al een interessante geschiedenis.
Er is een hele selectie aan resetting CSS files daar tussen te kiezen waar je veel uit kunt leren!
Browsersupport
Het browserlandschap
Browsersupport
(Lees: Layout-engine-support)
Iedere nieuwe versie van een browser ondersteunt andere features binnen HTML, CSS en JS.
Bijvoorbeeld: het <footer> element werd voor de eerste keer geïmplementeerd op 25 mei 2010. (Reference)
Browsersupport
Maar die evolutie is nog volop aan de gang binnen de wereld van frontend.
CSS voorbeeldje: Neem nu bijvoorbeeld de :dir(ltr) CSS Pseudo class.
Die is super nieuw en kan je nog niet echt op bouwen.
Browsersupport
Browsersupport
De tekst hieronder zal enkel groen zijn voor mensen die Firefox gebruiken.
Browsersupport
Met andere woorden, er is een evoluerend landschap van browsers en een evoluerend landschap van HTML, CSS en JS specificaties.
Browsersupport
Relevantie zelf opzoeken op CanIUse.com
Mik op minimaal 95% support of Bepaal welke browsers je niet langer meer ondersteund (IE, Opera MIni, oude versies van ...)
Ecosysteem van browsers
Vervolg?
Het browserlandschap
Vervolg?
Licht meer geavanceerd (maar geen verplichting om te volgen, als je liever aan je project werkt)
Beheersing over de huidige en toekomstige ecosysteem van browsers waarin je gaat werken.
Vervolg
De volgende 50 slides leggen uit hoe HTML, CSS en JS zullen veranderen in de komende 10 jaar, en hoe je hier nu mee om kan gaan.
Als je wilt volgen, blijf je in de call zitten.
Als je wilt werken aan je project, gelieve wel de call te verlaten.
Fouttolerantie
Het browserlandschap
Fouttolerantie
Fouttolerantie
Vergevingsgezindheid kan je interpreteren als het toelaten van fouten in code.
Wat zal een browser doen?
<p>Dit is mijn paragraaf</p>
<a>Dit is mijn link
<p>Dit is mijn paragraaf</p>
<p>Dit is mijn paragraaf</p>
<p>Dit is mijn paragraaf</p>
<p>Dit is mijn paragraaf</p>
<p>Dit is mijn paragraaf</p>
<p>Dit is mijn paragraaf</p>
<p>Dit is mijn paragraaf</p>
<p>Dit is mijn paragraaf</p>
Fouttolerantie
Het is onmogelijk om HTML te schrijven die niet gerenderd kan worden.
Wat zal een browser doen?
Dit is een eerste zin
<div
Dit is een tweede zin
</div>
Dit is een derde zinFouttolerantie
Het is onmogelijk om HTML te schrijven die niet gerenderd kan worden.
Dit is een eerste zin
<div
Dit is een tweede zin
</div>
Dit is een derde zinFouttolerantie
Fouttolerantie is eigenlijk gewoon een ander woord voor vergevingsgezindheid.
Wat je ook schrijft in HTML, een browser vergeeft zoveel mogelijk fouten en probeert tot een zo goed mogelijk resultaat te komen.
Wat zal een browser doen?
.my-class {
margin: 1rem
position: absolute;
display: block;
}Fouttolerantie
CSS is ook heel vergevingsgezind, maar heeft zijn limieten.
Wat zal een browser doen?
.my-class {
position: absolute;
position: blue;
}Fouttolerantie
Wanneer een property value niet bestaat, dan slaat de browser deze regel in CSS gewoon over.
Wat zal een browser doen?
constt abc = "test";
console.log("log");Fouttolerantie
Error + verdere code wordt niet uitgevoerd!
JavaScript is helemaal niet vergevingsgezind
Conclusie
Wanneer je iets maakt, probeer dit altijd te maken in de taal met de meeste vergevingsgezindheid.
Eerst in HTML, dan pas CSS, dan pas JS.
Vergevingsgezindheid geeft ook de mogelijkheid tot Progressive enhancement!
Progressive enhancement
Het browserlandschap
Progressive enhancement
MDN: Progressive enhancement is a design philosophy that provides a baseline of essential content and functionality to as many users as possible, while delivering the best possible experience only to users of the most modern browsers that can run all the required code.
Progressive enhancement
(nl) Progressive enhancement is een design filosofie waarbij je de essentie doet voor iedereen, en pracht oplevert voor gebruikers met modernere browsers.
Progressive enhancement
Voorbeeld: de ddpx resolution unit
Dit is een nieuwe unit in CSS waarmee je de schermresolutie waarmee de layout-engine kan werken op kunt filteren:
@media(min-resolution: 2dppx) {
// Do something onlny for high density screens
}Progressive enhancement
Voorbeeld: (ref: CanIUse)
Progressive enhancement
Progressive enhancement
Ik zal de ddpx-unit pas gebruiken wanneer bijna alle browsers dit zullen ondersteunen.
Ik gebruik de ddpx-unit, maar enkel de browsers die dit ondersteunen gaan mijn optimalisatie kunnen zien.
👎
👍
Progressive enhancement
Dit heeft als effect dat je altijd de laatst
uitgevonden CSS/HTML kan schrijven!
Een design die exact hetzelfde is cross-browser hoef je dus nooit te doen.
Een klant weet dit niet, het is jouw taak om hen hier in te onderwijzen.
Progressive enhancement
Als je met progressive enhancement voorlopig 2% van je gebruikers kan een nog betere ervaring geven: is dat al meer dan genoeg.
Progressive enhancement
Een klant contacteerde me 2 jaar nadat ik het project opgeleverd had:
Mathieu, heb je nog wat gesleuteld aan het design? Het ziet er plots super modern uit.
~ Klant die net nieuwe pc gekocht had...
Progressive enhancement
Sterk gekoppeld aan vergevingsgezindheid van HTML en CSS: Want zonder die vergevingsgezindheid kan je niet aan progressive rendering gaan doen.
Binnen JS lukt dit dus niet op deze manier.
Progressive enhancement
Het omgekeerde van progressive enhancement is "Graceful degradation".
Dit is geen goeie practise, omdat dit enkel maar meer werk oplevert.
Hier ga je dus verouderde CSS schrijven, specifiek en enkel maar voor oudere browsers.
Gracefull Degradation
Gracefull degradation
Wanneer gebruik je dit?
Wanneer je aan een browsersupport wilt geraken van minimaal 95% voor CSS die essentieel is voor de integriteit van je design.
Gracefull degradation
Feature detection
Het browserlandschap
Feature detection
(2020) Er zijn wel limitaties aan de approach van Progressive Enhancement. Je kan dit enkel toepassen op niet-essentiële zaken.
Voorbeeld: the CSS "gap"-property:
.my-container {
display: flex;
flex-wrap: wrap;
gap: 1rem;
}Feature detection
.my-container {
display: flex;
flex-wrap: wrap;
gap: 1rem;
}.my-container {
display: flex;
flex-wrap: wrap;
gap: 1rem;
}Feature detection
Op safari zal dit er dus zo gaan uitzien:
.my-container {
display: flex;
flex-wrap: wrap;
gap: 1rem;
}Feature detection
Zo'n design is niet ok om te lanceren, en uit te leggen aan je klant: "In de toekomst gaat het er beter uitzien"
Feature detection
Kunnen we dan niet de nieuwste properties schrijven?
O, jawel!
Feature detection
@support () {...}
De CSS feature query!
Feature detection
1. Schrijf de CSS die de beste ondersteuning krijgt cross-browser:
.my-container {
display: flex;
flex-wrap: wrap;
width: calc(100% + 1rem);
margin-left: -0.5rem;
border: 1px solid pink;
}
.my-item {
margin: 0 0.5rem 1rem;
}<div class="my-container">
<div class="my-item"></div>
<div class="my-item"></div>
<div class="my-item"></div>
<div class="my-item"></div>
<div class="my-item"></div>
<div class="my-item"></div>
</div>.my-container {
display: flex;
flex-wrap: wrap;
width: calc(100% + 1rem);
margin-left: -0.5rem;
border: 1px solid pink;
}
.my-item {
margin: 0 0.5rem 1rem;
}<div class="my-container">
<div class="my-item"></div>
<div class="my-item"></div>
<div class="my-item"></div>
<div class="my-item"></div>
<div class="my-item"></div>
<div class="my-item"></div>
</div>2. Schrijf de cutting-edge CSS in een support media query.
.my-container {
display: flex;
flex-wrap: wrap;
width: calc(100% + 1rem);
margin-left: -0.5rem;
border: 1px solid pink;
}
@supports (gap: 1rem) {
.my-container {
margin-left: 0;
width: 100%;
gap: 1rem;
}
}
.my-item {
margin: 0 0.5rem 1rem;
}
@supports (gap: 1rem) {
.my-item {
margin: 0;
}
}3. Wacht enkele jaren en versimpel je eigen CSS door een hoop regels te verwijderen indien je nog altijd op hetzelfde project werkt.
.my-container {
display: flex;
flex-wrap: wrap;
gap: 1rem;
border: 1px solid pink;
}
Feature detection
Feature detection
Let op: De CSS feature query is ook relatief nieuw!
Feature detection
Impact: je kan de @support pas gebruiken wanneer de feature dat je wilt toepassen een slechtere ondersteuning heeft dan de @support query.
Feature detection
Ok, maar als de gap-property nieuw is, wat is er dan nog nieuw?
Feature detection
Maar weet dat dit principes ook bestaan binnen HTML:
<script>
document.write("Hello World!")
</script>
<noscript>
Your browser does not support JavaScript!
</noscript>Feature detection
Ook binnen JS worden er regelmatig nieuwe methodes / features toegevoegd.
Bv. Array.map()
Oudere browsers kennen echter de map() methode niet op een array. Die zullen daarom een error geven.
Feature detection
We kunnen daarom in code eerst controleren of een feature bestaat
var numbers = [1, 2, 3]
if ("map" in numbers) {
numbers.map((n) => n * 2);
} else {
// map does not exist
}Feature detection
Nog een voorbeeld:
navigator.geolocation om de gebruiker zijn/haar locatie op te vragen
if ("geolocation" in navigator) {
// geolocation beschikbaar
navigator.geolocation.getCurrentPosition(function(position) {
// huidige locatie
});
} else {
// browser ondersteunt geen geolocation
}Feature detection
Doordat JS niet vergevingsgezind is, is dit heel belangrijk! Zonder de check zal geolocation undefined zijn => error
navigator.geolocation.getCurrentPosition(function(position) {
}
// error indien geolocation niet bestaat! (niet ondersteund is)
Feature detection
PS: dit is al een iets ouder voorbeeld...
New CSS Specifications
Het browserlandschap
Hoeveel dagen geleden werd de laatste CSS specificatie uitgevonden?
New CSS specifications
Geen idee eigenlijk, daarvoor moet je een kijkje nemen op www.w3.org/Style/CSS/current-work.en.html
New CSS specifications
Er wordt gigantisch goed doorgewerkt aan een hele hoop specificaties met een groot team experts die zowel uit de webcommunity komt als vanuit developers die in dienst zijn in de teams van Chrome, Firefox, etc...
New CSS specifications
Zij werken allemaal ideetjes uit, en ieder idee volgt het volgende proces:
New CSS specifications
Wanneer dit in recommendation is of soms eerder, kiezen browsers ervoor om dit te gaan implementeren in nieuwere versies.
Hoe? Stapjesgewijs proberen ze nieuwe specs uit
Browser-prefixes and flags
Het browserlandschap
Browser-prefixes
Binnen CSS is het ook goed mogelijk dat sommige browsers bepaalde features voorzichtig beschikbaar maken voor developers.
Zeg maar experimenteel releasen van features. (Meer info)
Browser-prefixes
Vroeger werd dit gedaan aan de hand van browser-prefixes
Bijvoorbeeld bij de transition property
(ref: CanIuse)
Browser-prefixes
Op die manier konden developers experimentele properties reeds uittesten op websites.
.my-container {
-webkit-transition: all 4s ease;
-moz-transition: all 4s ease;
-ms-transition: all 4s ease;
-o-transition: all 4s ease;
transition: all 4s ease;
}Flags
Het principe van browser-prefixes is echter aan het afzwakken, en browsers kiezen er nu vaker voor om met features behind flags te gaan werken.
Verantwoordelijkheid ligt nu bij webgebruikers ipv bij webdevelopers!
Flags
Het principe van browser-prefixes is echter aan het afzwakken, en browsers kiezen er nu vaker voor om met features behind flags te gaan werken.
Bv: Cascade Layers: CanIuse
Flags
Remember de :dir CSS pseudo selector?
Flags
Die kunnen we in Chrome gaan enablen met de flag! op de url: chrome://flags/
Polyfills en build tools
Het browserlandschap
Polyfills
A polyfill is a piece of code (usually JavaScript on the Web) used to provide modern functionality on older browsers that do not natively support it.
Polyfills
Stel: je wil een nieuwe JS feature gebruiken, maar deze is nog niet overal beschikbaar is.
Hiervoor kan je een polyfill gebruiken
Polyfills
Een polyfill is dus een stukje code dat de nieuwe feature nabootst gebruikmakend van methodes die wel ondersteund worden door oudere browsers.
Je kan dit stukje daarom toevoegen aan je code, waardoor het wel werkt in oudere browsers
Polyfills
Uiteraard bestaat er niet voor elke nieuwe feature een polyfill
Bv. navigator.geolocation kan je niet nabootsen indien de browser geen toegang/support heeft om een locatie op te halen
Polyfills
Enkele voorbeelden van features die werden/worden ge-polyfilled:
Build tools
Meestal zullen we deze polyfills echter niet (altijd) manueel toevoegen.
Wanneer je code zal schrijven in de toekomst zal je vaak gebruik maken van een build tool (bundler) zoals Webpack, Parcel, ...
Build tools
Een build tool zal oa. volgende zaken regelen:
Transpilen
Dit wil zeggen dat de build tool automatisch jouw code zal omvormen (in een aparte file) naar JS code die compatibel is met de laagst ingestelde vereiste qua browser.
Simpel voorbeeld: alle "let" naar "var" wijzigen
Even samenvatten
Het browserlandschap
Even samenvatten
Het mobile-first principe
Voor een ontelbaar aantal verschillende schermbreedtes
Even samenvatten
Layout engines
De motors van browsers en andere applicaties
Even samenvatten
Relevantie van browserverschillen
Niet alle browserverschillen moet je gaan oplossen, maar kan je wel.
Even samenvatten
Browsersupport
Welke browsers wens je te ondersteunen
Even samenvatten
Progressive enhancement
Dmv fouttolerantie kan je reeds pracht opleveren voor een klein gedeelte van de bezoekers voor niet-essentiele verbeteringen.
Even samenvatten
Gracefull degradation
Dmv fouttolerantie kan je ook oudere browsers meekrijgen om iets essentieels te ondersteunen voor je bezoekers.
Even samenvatten
Feature detection
Een principe om met code te bepalen met welke support de browser van de gebruiker heeft.
Even samenvatten
CSS specification recommentation
Wanneer de community iets aanbeveelt om te gaan gebruiken als webtechnologie.
Even samenvatten
Browser-prefixes
Een toepassing van progressive enhancement of gracefull degradation CSS schrijft dat browsers overheen hun cycli van implementatie van die CSS kunnen verstaan.
Even samenvatten
"Behind-a-flag" principe
Het principe waarbij ontwikkelaars van layout-engines de nieuwe CSS al geïmplementeerd hebben maar die nog aan het testen zijn vooraleer die standaard wordt ingeschakeld.
Even samenvatten
Sommige principes bestaan ook binnen JS:
By Mathieu S. and Michael V.
Soorten browsers, browsersupport, browser-prefixes, browserverschillen, fouttolerantie, progressive enhancement, feature detection, New CSS specifications