Het webplatform bruist van de innovatie, waarbij CSS en web-UI-functies voorop lopen in deze opwindende evolutie. We leven in een gouden tijdperk voor de web-UI, met nieuwe CSS-functies die in browsers verschijnen in een tempo dat we nog nooit eerder hebben gezien, waardoor een wereld van mogelijkheden wordt geopend voor het creëren van prachtige en boeiende webervaringen. In deze blogpost duiken we diep in de huidige staat van CSS en onderzoeken we enkele van de meest baanbrekende nieuwe functies die de manier waarop we webapplicaties bouwen opnieuw definiëren, live te zien op Google I/O 2024.
Nieuwe interactieve ervaringen
Een webervaring is in wezen een vraag en antwoord tussen u en uw gebruikers. Daarom is het zo belangrijk om te investeren in hoogwaardige gebruikersinteracties. We hebben aan een aantal hele grote verbeteringen gewerkt die mogelijkheden ontgrendelen die we nog nooit eerder op internet hebben gehad voor het navigeren binnen webpagina's en het navigeren tussen webpagina's.
Scrollgestuurde animaties
Zoals de naam al aangeeft, kunt u met de scrollgestuurde animatie-API dynamische, op scrollen gebaseerde animaties maken zonder afhankelijk te zijn van scrollwaarnemers of andere zware scripting.
Maak scrollgestuurde animaties
Net zoals op tijd gebaseerde animaties op het platform werken, kunt u nu de scrollvoortgang van een scroller gebruiken om een animatie te starten, te pauzeren en terug te draaien. Dus als je vooruit scrolt, zie je dat de animatie vordert, en als je achteruit scrolt, gaat het andersom. Hiermee kunt u gedeeltelijke of volledige paginabeelden maken met elementen die in en binnen de viewport animeren, ook wel scrollytelling genoemd, voor een dynamische visuele impact.
Scrollgestuurde animaties kunnen worden gebruikt om belangrijke inhoud te benadrukken, gebruikers door een verhaal te leiden of eenvoudigweg een dynamisch tintje aan uw webpagina's toe te voegen.
Scrollgestuurde visuele animatie
Live-demo
@keyframes appear {
from {
opacity: 0;
scale: 0.8;
}
to {
opacity: 1;
scale: 1;
}
}
img {
animation: appear linear;
animation-timeline: view();
animation-range: entry 25% cover 50%;
}
De voorgaande code definieert een eenvoudige animatie die in de viewport verschijnt door de dekking en schaal van een afbeelding te wijzigen. De animatie wordt aangedreven door de scrollpositie. Om dit effect te creëren, stelt u eerst de CSS-animatie in en vervolgens de animation-timeline
. In dit geval volgt de functie view()
met zijn standaardwaarden de afbeelding ten opzichte van de scrollport (die in dit geval ook de viewport is).
Het is belangrijk om rekening te houden met browserondersteuning en gebruikersvoorkeuren, vooral als het gaat om toegankelijkheid. Gebruik daarom de @supports
regel om te controleren of de browser scrollgestuurde animaties ondersteunt, en verpak uw scrollgestuurde animatie in een gebruikersvoorkeurenquery zoals @media (prefers-reduced-motion: no-preference)
om de bewegingsvoorkeuren van gebruikers te respecteren . Nadat u deze controles heeft uitgevoerd, weet u dat uw stijlen zullen werken en dat de animatie geen problemen oplevert voor de gebruiker.
@supports (animation-timeline: view()) {
@media (prefers-reduced-motion: no-preference) {
/* Apply scroll-driven animations here */
}
}
Scrollgestuurde animaties kunnen scrollytelling-ervaringen op een volledige pagina betekenen, maar ze kunnen ook subtielere animaties betekenen, zoals een kopbalk die een schaduw minimaliseert en laat zien terwijl u door een webapp scrollt.
Scrollgestuurde visuele animatie
Live-demo
@keyframes shrink-name {
from {
font-size: 2em;
}
to {
font-size: 1.5em;
}
}
@keyframes add-shadow {
from {
box-shadow: none;
}
to {
box-shadow: 0 4px 2px -2px gray;
}
}
header {
animation: add-shadow linear both;
}
h2 {
animation: shrink-name linear both;
}
header, h2 {
animation-timeline: scroll();
animation-range: 0 150px;
}
Deze demo gebruikt een paar verschillende keyframe-animaties (de koptekst, tekst, navigatiebalk en achtergrond) en past vervolgens de respectieve scrollgestuurde animatie op elk toe. Hoewel ze allemaal een andere animatiestijl hebben, hebben ze allemaal dezelfde animatietijdlijn, de dichtstbijzijnde scroller en hetzelfde animatiebereik: van de bovenkant van de pagina tot 150 pixels.
Prestatievoordelen van scrollgestuurde animaties
Deze ingebouwde API vermindert de codelast die u moet onderhouden, of het nu gaat om een aangepast script dat u heeft geschreven of om de toevoeging van een extra afhankelijkheid van derden. Het elimineert ook de noodzaak om verschillende scroll-waarnemers te verzenden, wat een aantal behoorlijk aanzienlijke prestatievoordelen betekent. Dit komt omdat scrollgestuurde animaties buiten de rode draad werken bij het animeren van eigenschappen die op de compositor kunnen worden geanimeerd, zoals transformaties en dekking, of je nu de nieuwe API rechtstreeks in CSS gebruikt of de JavaScript-hooks gebruikt.
Tokopedia heeft onlangs scrollgestuurde animaties gebruikt om de productnavigatiebalk te laten verschijnen terwijl u scrolde. Het gebruik van deze API heeft een aantal serieuze voordelen opgeleverd, zowel voor codebeheer als voor prestaties.
"We zijn erin geslaagd om tot 80% van onze coderegels te verminderen in vergelijking met het gebruik van conventionele JS-scrollgebeurtenissen en hebben vastgesteld dat het gemiddelde CPU-gebruik tijdens het scrollen daalde van 50% naar 2%. - Andy Wihalim, Senior Software Engineer, Tokopedia"
De toekomst van scrolleffecten
We weten dat deze effecten het internet aantrekkelijker zullen blijven maken, en we denken al na over wat er daarna zou kunnen gebeuren. Dit omvat de mogelijkheid om niet alleen nieuwe animatietijdlijnen te gebruiken, maar ook om een scrollpunt te gebruiken om het begin van een animatie te activeren, de zogenaamde scroll-triggered animaties.
En er komen in de toekomst nog meer scrollfuncties naar browsers. De volgende demo toont een combinatie van deze toekomstige functies. Het gebruikt CSS scroll-start-target
om de initiële datum en tijd binnen de pickers in te stellen, en de JavaScript scrollsnapchange
gebeurtenis om de headerdatum bij te werken, waardoor het triviaal wordt om de gegevens te synchroniseren met de vastgeklikte gebeurtenis.
U kunt hier ook op voortbouwen om een kiezer in realtime bij te werken met de JavaScript- scrollsnapchanging
gebeurtenis.
Deze specifieke functies bevinden zich momenteel alleen in Canary achter een vlag, maar ze ontgrendelen mogelijkheden die voorheen onmogelijk of zeer moeilijk in het platform waren in te bouwen en benadrukken de toekomst van op scrollen gebaseerde interactiemogelijkheden.
Voor meer informatie over hoe u aan de slag kunt gaan met scrollgestuurde animaties heeft ons team zojuist een nieuwe videoserie gelanceerd die u kunt vinden op het Chrome for Developers YouTube-kanaal . Hier leer je de basisprincipes van scrollgestuurde animaties van Bramus Van Damme, inclusief hoe de functie werkt, woordenschat, verschillende manieren om effecten te creëren en hoe je effecten combineert om rijke ervaringen op te bouwen. Het is een geweldige videoserie om te bekijken.
Overgangen bekijken
We hebben zojuist een krachtige nieuwe functie besproken die animeert binnen webpagina's, maar er is ook een krachtige nieuwe functie genaamd weergaveovergangen voor het animeren tussen paginaweergaven om een naadloze gebruikerservaring te creëren. Weergaveovergangen introduceren een nieuw niveau van vloeibaarheid op internet, waardoor u naadloze overgangen kunt creëren tussen verschillende weergaven binnen één pagina, of zelfs over verschillende pagina's heen.
Airbnb is een van de bedrijven die al experimenteert met het integreren van weergaveovergangen in hun gebruikersinterface voor een soepele en naadloze webnavigatie-ervaring. Dit omvat de zijbalk van de lijsteditor, tot het bewerken van foto's en het toevoegen van voorzieningen, allemaal binnen een vloeiende gebruikersstroom.
Hoewel deze paginagrote effecten mooi en naadloos zijn, kunt u ook micro-interacties creëren, zoals dit voorbeeld waarbij uw lijstweergave wordt bijgewerkt op basis van gebruikersinteractie. Dit effect kan moeiteloos worden bereikt met zichtovergangen.
De manier om snel weergaveovergangen in uw toepassing met één pagina in te schakelen, is net zo eenvoudig als het inpakken van een interactie met document.startViewTransition
, en ervoor zorgen dat elk element dat overgaat een view-transition-name
heeft, inline of dynamisch met behulp van JavaScript terwijl u maakt DOM-knooppunten.
Demo visueel
Live-demo
document.querySelectorAll('.delete-btn').forEach(btn => {
btn.addEventListener('click', () => {
document.startViewTransition(() => {
btn.closest('.card').remove();
});
})
});
/* Styles for the transition animation */
::view-transition-old(.card):only-child {
animation: fade-out ease-out 0.5s;
}
Bekijk de overgangsklassen
Namen van weergaveovergangen kunnen worden gebruikt om aangepaste animaties toe te passen op uw weergaveovergang, hoewel dit lastig kan worden als er veel elementen overgaan. De eerste nieuwe update dit jaar om overgangen te bekijken vereenvoudigt dit probleem en introduceert de mogelijkheid om overgangsklassen te maken die kunnen worden toegepast op aangepaste animaties.
Browserondersteuning
Overgangstypen bekijken
Een andere grote verbetering voor weergaveovergangen is ondersteuning voor weergaveovergangstypen . Typen weergaveovergangen zijn handig als u een ander soort visuele weergaveovergang wilt bij het animeren van en naar paginaweergaven.
Browserondersteuning
U wilt bijvoorbeeld dat een startpagina op een andere manier naar een blogpagina animeert dan dat de blogpagina terugkeert naar de startpagina. Of misschien wilt u dat pagina's op verschillende manieren worden in- en uitgewisseld, zoals in dit voorbeeld, van links naar rechts en omgekeerd. Vroeger was dit rommelig om te doen. Je zou klassen aan de DOM kunnen toevoegen om stijlen toe te passen, en dan zou je de klassen daarna moeten verwijderen. Met View-transition-types kan de browser oude overgangen opschonen in plaats van dat u dit handmatig moet doen voordat u nieuwe initieert, waardoor dit werk voor u wordt gedaan.
U kunt typen instellen binnen uw document.startViewTransition
-functie, die nu een object accepteert. update
is de callback-functie die de DOM bijwerkt, en types
is een array met de types.
document.startViewTransition({
update: myUpdate,
types: ['slide', 'forwards']
})
Weergaveovergangen van meerdere pagina's
Wat het internet krachtig maakt, is hoe uitgebreid het is. Veel toepassingen zijn niet slechts één pagina, maar een robuust tapijtwerk met meerdere pagina's. En daarom zijn we zo blij om aan te kondigen dat we ondersteuning bieden voor weergaveovergangen tussen verschillende documenten voor toepassingen met meerdere pagina's in Chromium 126.
Browserondersteuning
Deze nieuwe functieset voor meerdere documenten omvat webervaringen die binnen dezelfde oorsprong leven, zoals navigeren van web.dev naar web.dev/blog, maar dit omvat niet het navigeren tussen verschillende oorsprong, zoals navigeren van web.dev naar blog.web.dev of naar een ander domein zoals google.com.
Een van de belangrijkste verschillen met weergaveovergangen voor hetzelfde document is dat u uw overgang niet hoeft in te wikkelen met document.startViewTransition()
. Meld u in plaats daarvan aan voor beide pagina's die betrokken zijn bij de weergaveovergang door de CSS @view-transition
at-regel te gebruiken.
@view-transition {
navigation: auto;
}
Voor een meer aangepast effect kunt u JavaScript inhaken met behulp van de nieuwe pageswap
of pagereveal
-gebeurtenislisteners, die u toegang geven tot het view transition-object.
Met pageswap
kunt u op het laatste moment nog enkele wijzigingen aanbrengen op de uitgaande pagina, vlak voordat de oude snapshots worden gemaakt, en met pagereveal
kunt u de nieuwe pagina aanpassen voordat deze begint te worden weergegeven nadat deze is geïnitialiseerd.
window.addEventListener('pageswap', async (e) => {
// ...
});
window.addEventListener('pagereveal', async (e) => {
// ...
});
In de toekomst zijn we van plan de weergaveovergangen uit te breiden, waaronder:
- Scoped transitions : Hiermee kunt u een transitie beperken tot een DOM-subboom, waardoor de rest van de pagina interactief kan blijven en meerdere weergave-overgangen tegelijkertijd worden ondersteund.
- Gebaargestuurde weergaveovergangen : gebruik sleep- of veegbewegingen om een weergaveovergang tussen documenten te activeren voor meer native-achtige ervaringen op internet.
- Navigatiematching in CSS : Pas uw weergaveovergang tussen meerdere documenten rechtstreeks in uw CSS aan als alternatief voor het gebruik van
pageswap
enpagereveal
gebeurtenissen in JavaScript. Voor meer informatie over weergaveovergangen voor toepassingen met meerdere pagina's, inclusief hoe u deze het best kunt instellen met vooraf weergave, bekijk de volgende lezing van Bramus Van Damme:
Door de engine ondersteunde UI-componenten: vereenvoudiging van complexe interacties
Het bouwen van complexe webapplicaties is geen eenvoudige opgave, maar CSS en HTML evolueren om dit proces veel beter beheersbaar te maken. Nieuwe functies en verbeteringen vereenvoudigen het maken van UI-componenten, zodat u zich kunt concentreren op het bouwen van geweldige ervaringen. Dit wordt gedaan door middel van een gezamenlijke inspanning waarbij verschillende belangrijke standaardorganisaties en gemeenschapsgroepen betrokken zijn, waaronder de CSS Working Group, Open UI community Group en WHATWG (Web Hypertext Application Technology Working Group).
Een groot pijnpunt voor ontwikkelaars is een ogenschijnlijk eenvoudig verzoek: de mogelijkheid om vervolgkeuzemenu's op te maken (het select-element). Hoewel het op het eerste gezicht eenvoudig lijkt, is dit een complex probleem, dat zoveel onderdelen van het platform raakt; van lay-out en weergave, tot scrollen en interactie, tot user-agent-styling en CSS-eigenschappen, en zelfs wijzigingen in HTML zelf.
Een vervolgkeuzelijst bestaat uit veel onderdelen en bevat veel statussen waarmee rekening moet worden gehouden, zoals:
- Toetsenbordbindingen (om de interactie in/uit te gaan)
- Klik weg om te sluiten
- Actief popoverbeheer (andere popovers sluiten wanneer er één wordt geopend)
- Beheer van tabbladfocus
- Visualisatie van de geselecteerde optiewaarde
- Pijl-interactiestijl
- Staatsbeheer (open/dicht)
Het is momenteel lastig om dit allemaal zelf te beheren, maar het platform maakt het ook niet gemakkelijk. Om dit op te lossen, hebben we deze onderdelen opgesplitst en een paar primitieve functies op de markt gebracht die vervolgkeuzelijsten voor styling mogelijk maken, maar die ook nog veel meer doen.
De Popover-API
Eerst hebben we een globaal attribuut met de naam popover
verzonden, waarvan ik met trots kan aankondigen dat het een paar weken geleden zojuist de Baseline-nieuw beschikbare status heeft bereikt.
Popover-elementen zijn verborgen met display: none
totdat ze worden geopend met een aanroeper zoals een knop of met JavaScript. Om een eenvoudige popover te maken, stelt u het popover-attribuut in op het element en koppelt u de ID ervan aan een knop met behulp van popovertarget
. Nu is de knop de aanroeper,
Demo visueel
Live-demo
<button popovertarget="my-popover">Open Popover</button>
<div id="my-popover" popover>
<p>I am a popover with more information.</p>
</div>
Nu het popover-attribuut is ingeschakeld, verwerkt de browser veel belangrijke gedragingen zonder extra scripting, waaronder:
- Promotie naar de bovenste laag. : Een aparte laag boven de rest van de pagina, zodat je niet hoeft te spelen met
z-index
. - Lichtuitschakelingsfunctionaliteit. : Als u buiten het popover-gebied klikt, wordt de popover gesloten en keert de focus terug.
- Standaard tabfocusbeheer. : Als u de popover opent, stopt het volgende tabblad binnen de popover.
- Ingebouwde toetsenbordbindingen. : Als u op de
esc
-toets drukt of dubbel schakelt, wordt de popover gesloten en keert de focus terug. - Standaardcomponentbindingen. : De browser verbindt een popover semantisch met de trigger.
Mogelijk gebruikt u deze popover-API vandaag zelfs zonder dat u het zich realiseert. GitHub implementeerde popover op het “nieuwe” menu op hun startpagina en in hun pull request review-overzicht. Ze hebben deze functie geleidelijk verbeterd met behulp van de popover polyfill , gebouwd door Oddbird met aanzienlijke ondersteuning van GitHub's eigen Keith Cirkel, om oudere browsers te ondersteunen.
“We zijn erin geslaagd om letterlijk duizenden regels code te beëindigen door naar popover te migreren. Popover helpt ons door de noodzaak van het bestrijden van magische z-indexnummers te elimineren... door de juiste toegankelijkheidsboomrelatie tot stand te brengen met declaratief knopgedrag, en door ingebouwd focusgedrag, wordt het voor ons ontwerpsysteem aanzienlijk eenvoudiger om patronen op de juiste manier te implementeren. Keith Cirkel, software-ingenieur, GitHub”
Animeren van in- en uitstapeffecten
Als je popovers hebt, wil je waarschijnlijk wat interactie toevoegen. Er zijn het afgelopen jaar vier nieuwe interactiefuncties geïntroduceerd ter ondersteuning van geanimeerde popovers. Deze omvatten:
De mogelijkheid om display
en content-visibility
op een keyframe-tijdlijn te animeren.
De eigenschap transition-behavior
met het sleutelwoord allow-discrete
om overgangen van discrete eigenschappen zoals display
mogelijk te maken.
De @starting-style
om invoereffecten van display: none
en in de bovenste laag .
De overlay-eigenschap om het gedrag van de bovenste laag tijdens een animatie te regelen.
Deze eigenschappen werken voor elk element dat u naar de bovenste laag animeert, of het nu een popover of een dialoogvenster is. Alles bij elkaar ziet het er als volgt uit voor een dialoog met een achtergrond:
Demo visueel
Live-demo
dialog, ::backdrop{
opacity: 0;
transition: opacity 1s, display 1s allow-discrete, overlay 1s allow-discrete;
}
[open], [open]::backdrop {
opacity: 1;
}
@starting-style {
[open], [open]::backdrop {
opacity: 0;
}
}
Stel eerst de @starting-style
in, zodat de browser weet vanuit welke stijlen dit element in de DOM moet worden geanimeerd. Dit wordt gedaan voor zowel de dialoog als de achtergrond. Stijl vervolgens de open status voor zowel het dialoogvenster als de achtergrond. Voor een dialoog wordt hiervoor het open
attribuut gebruikt, en voor een popover het ::popover-open
pseudo-element. Animeer ten slotte de opacity
, display
en overlay
met het trefwoord allow-discrete
om de animatiemodus in te schakelen waarin discrete eigenschappen kunnen overgaan.
Anker positionering
Popover was nog maar het begin van het verhaal. Een zeer opwindende update is dat ondersteuning voor ankerpositionering nu beschikbaar is vanuit Chrome 125.
Met behulp van ankerpositionering kan de browser met slechts een paar regels code de logica verwerken om een gepositioneerd element aan een of meer ankerelementen te koppelen. In het volgende voorbeeld is aan elke knop een eenvoudige tooltip verankerd, middenonder gepositioneerd.
Demo visueel
Live-demo
Stel een ankergepositioneerde relatie in CSS in door de eigenschap anchor-name
te gebruiken voor het verankeringselement (in dit geval de knop) en de eigenschap position-anchor
voor het gepositioneerde element (in dit geval de tooltip). Pas vervolgens een absolute of vaste positionering toe ten opzichte van het anker met behulp van de functie anchor()
. Met de volgende code wordt de bovenkant van de knopinfo naar de onderkant van de knop geplaatst.
.anchor {
anchor-name: --my-anchor;
}
.positioned {
position: absolute;
position-anchor: --my-anchor;
}
U kunt ook de ankernaam rechtstreeks in de ankerfunctie gebruiken en de eigenschap position-anchor
overslaan. Dit kan handig zijn bij verankering aan meerdere elementen.
.anchor {
anchor-name: --my-anchor;
}
.positioned {
position: absolute;
top: anchor(--my-anchor bottom);
}
Gebruik ten slotte het nieuwe trefwoord anchor-center
voor de eigenschappen justify
en align
om het gepositioneerde element ten opzichte van zijn anker te centreren.
.anchor {
anchor-name: --my-anchor;
}
.positioned {
position: absolute;
top: anchor(--my-anchor bottom);
justify-self: anchor-center;
}
Hoewel het erg handig is om ankerpositionering met popover te gebruiken, is popover zeker geen vereiste voor het gebruik van ankerpositionering. Ankerpositionering kan met twee (of meer) elementen worden gebruikt om een visuele relatie te creëren. In feite toont de volgende demo, geïnspireerd door een artikel van Roman Komarov , een onderstrepingsstijl die wordt verankerd om items weer te geven terwijl u er met de muis overheen beweegt of er met de tab over bladert.
Demo visueel
Live-demo
In dit voorbeeld wordt de ankerfunctie gebruikt om de ankerpositie in te stellen met behulp van de fysieke eigenschappen left
, right
en bottom
. Wanneer u over een van de links beweegt, verandert het doelanker en verschuift de browser het doel om de positionering toe te passen, waarbij tegelijkertijd de kleur wordt geanimeerd om een mooi effect te creëren.
ul::before {
content: "";
position: absolute;
left: anchor(var(--target) left);
right: anchor(var(--target) right);
bottom: anchor(var(--target) bottom);
...
}
li:nth-child(1) { --anchor: --item-1 }
ul:has(:nth-child(1) a:is(:hover, :focus-visible)) {
--target: --item-1;
--color: red;
}
positionering inset-area
Naast de standaard directionele absolute positionering die u waarschijnlijk eerder hebt gebruikt, is er een nieuw lay-outmechanisme opgenomen dat is geland als onderdeel van de ankerpositionerings-API, genaamd inset area. Het inzetgebied maakt het gemakkelijk om gepositioneerde elementen ten opzichte van hun respectievelijke ankers te plaatsen, en werkt op een raster met 9 cellen met het verankeringselement in het midden. Bijvoorbeeld: inset-area: top
plaatst het gepositioneerde element bovenaan, en inset-area: bottom
plaatst het gepositioneerde element onderaan.
Een vereenvoudigde versie van de eerste ankerdemo ziet er als volgt uit met inset-area
:
.anchor {
anchor-name: --my-anchor;
}
.positioned {
position: absolute;
position-anchor: --my-anchor;
inset-area: bottom;
}
U kunt deze positionele waarden combineren met span-trefwoorden, zodat u op de middelste positie begint en vervolgens naar links, naar rechts of naar allemaal spant om de volledige set beschikbare kolommen of rijen in beslag te nemen. U kunt ook logische eigenschappen gebruiken. Bekijk deze tool in Chrome 125+ om het gemakkelijker te maken dit lay-outmechanisme te visualiseren en op te pikken:
Omdat deze elementen verankerd zijn, beweegt het gepositioneerde element dynamisch over de pagina terwijl het anker beweegt. In dit geval hebben we kaartelementen in containerquery-stijl, waarvan het formaat wordt aangepast op basis van hun intrinsieke grootte (iets wat je niet zou kunnen doen met mediaquery's), en het verankerde menu zal verschuiven met de nieuwe lay-out naarmate de kaart-UI verandert.
Demo visueel
Live-demo
Dynamische ankerposities met position-try-options
Menu's en submenu-navigatie zijn zoveel eenvoudiger te maken met een combinatie van popover- en ankerpositionering. En wanneer u met uw verankerde element de rand van een kijkvenster bereikt, kunt u de browser de positioneringswijziging ook voor u laten afhandelen. Je kunt dit op een paar manieren doen. De eerste is om uw eigen positioneringsregels te maken. In dit geval bevindt het submenu zich in eerste instantie rechts van de knop ‘storefront’. Maar je kunt een @position-try
blok maken voor als er niet genoeg ruimte is aan de rechterkant van het menu, door het een aangepaste identificatie van --bottom
te geven. Vervolgens verbindt u dit @position-try
blok met het anker met behulp van position-try-options
.
Nu zal de browser schakelen tussen deze verankerde toestanden, eerst de juiste positie proberen en dan naar de onderkant verschuiven. En dat kan met een mooie overgang.
Demo visueel
Live-demo
#submenu {
position-anchor: --submenu;
top: anchor(top);
left: anchor(right);
margin-left: var(--padding);
position-try-options: --bottom;
transition: top 0.25s, left 0.25s;
width: max-content;
}
@position-try --bottom {
top: anchor(left);
left: anchor(bottom);
margin-left: var(--padding);
}
Naast de expliciete positioneringslogica zijn er een paar trefwoorden die de browser biedt als u basisinteracties wilt, zoals het omdraaien van uw anker in het blok of inline-richtingen.
position-try-options: flip-block, flip-inline;
Voor een eenvoudige flipping-ervaring kunt u profiteren van deze flip-trefwoordwaarden en het schrijven van een position-try
-definitie helemaal overslaan. U kunt nu dus een volledig functioneel locatie-responsief ankergepositioneerd element hebben met slechts een paar regels CSS.
Demo visueel
Live-demo
.tooltip {
inset-area: top;
position-try-options: flip-block;
}
Meer informatie over het gebruik van ankerpositionering .
De toekomst van een gelaagde gebruikersinterface
We zien overal gekoppelde ervaringen, en de reeks functies die in dit bericht worden getoond, zijn een uitstekend begin om creativiteit en betere controle over ankergepositioneerde elementen en gelaagde interfaces te ontketenen. Maar dit is nog maar het begin. Momenteel werkt popover
bijvoorbeeld alleen met knoppen als aanroepend element, of met JavaScript. Voor zoiets als voorvertoningen in Wikipedia-stijl, een patroon dat overal op het webplatform te zien is, moet het mogelijk zijn om ermee te communiceren en ook een popover te activeren via een link en van de gebruiker die interesse toont zonder noodzakelijkerwijs door te klikken, zoals een hover of een tabblad. focus.
Als volgende stap voor de popover-API werken we aan interesttarget
om deze behoeften op te lossen en het gemakkelijker te maken om deze ervaringen opnieuw te creëren met de juiste ingebouwde toegankelijkheidshooks. Dit is een uitdagend toegankelijkheidsprobleem om op te lossen, met veel open vragen. rond ideaal gedrag, maar het oplossen en normaliseren van deze functionaliteit op platformniveau zou deze ervaringen voor iedereen moeten verbeteren.
<a interesttarget="my-tooltip">Hover/Focus to show the tooltip</a>
<span popover=hint id="my-toolip">This is the tooltip</span>
Daarnaast is er nog een toekomstgerichte algemene aanroeper ( invoketarget
) beschikbaar om te testen in Canary dankzij het werk van twee externe ontwikkelaars, Keith Cirkel en Luke Warlow. invoketarget
ondersteunt de declaratieve ontwikkelaarservaring dat popovertarget
popovers biedt, genormaliseerd voor alle interactieve elementen, inclusief <dialog>
, <details>
, <video>
, <input type="file">
en meer.
<button invoketarget="my-dialog">
Open Dialog
</button>
<dialog id="my-dialog">
Hello world!
</dialog>
We weten dat er gebruiksscenario's zijn die nog niet door deze API worden gedekt. Bijvoorbeeld het stylen van de pijl die een verankerd element met zijn anker verbindt, vooral als de positie van het verankerde element verandert, en het mogelijk maken dat een element ‘schuift’ en in het kijkvenster blijft in plaats van naar een andere positie te springen die is ingesteld wanneer het zijn grens bereikt doos. Dus hoewel we blij zijn met deze krachtige API, kijken we er ook naar uit om de mogelijkheden ervan in de toekomst nog verder uit te breiden.
Stijlbaar selecteren
Door popover
en anchor
samen te gebruiken, heeft het team vooruitgang geboekt bij het eindelijk mogelijk maken van een aanpasbare vervolgkeuzelijst. Het goede nieuws is dat er veel vooruitgang is geboekt. Het slechte nieuws is dat deze API zich momenteel nog in een experimentele staat bevindt. Ik ben echter verheugd om enkele live demo's en updates over onze voortgang te delen en hopelijk wat van uw feedback te krijgen. Ten eerste is er vooruitgang geboekt bij het aanmelden van gebruikers voor de nieuwe, aanpasbare select-ervaring. De huidige, onderhanden zijnde manier om dit te doen, is door een eigenschap uiterlijk in CSS te gebruiken, ingesteld op appearance: base-select
. Zodra het uiterlijk is ingesteld, meldt u zich aan voor een nieuwe, aanpasbare select-ervaring.
select {
appearance: base-select;
}
Naast appearance: base-select
zijn er een paar nieuwe HTML-updates. Deze omvatten de mogelijkheid om uw opties in een datalist
te plaatsen voor aanpassing en de mogelijkheid om willekeurige niet-interactieve inhoud zoals afbeeldingen aan uw opties toe te voegen. Je hebt ook toegang tot een nieuw element, <selectedoption>
, dat de inhoud van de opties in zichzelf weerspiegelt, dat je vervolgens aan je eigen behoeften kunt aanpassen. Dit element is erg handig.
Demo visueel
Live-demo
<select>
<button type=popover>
<selectedoption></selectedoption>
</button>
<datalist>
<option value="" hidden>
<p>Select a country</p>
</option>
<option value="andorra">
<img src="Flag_of_Andorra.svg" />
<p>Andorra</p>
</option>
<option value="bolivia">
<img src="Flag_of_Bolivia.svg" />
<p>Bolivia</p>
</option>
...
</datalist>
</select>
De volgende code demonstreert het aanpassen van <selectedoption>
in de Gmail-gebruikersinterface, waarbij een visueel pictogram het geselecteerde type antwoord vertegenwoordigt om ruimte te besparen. U kunt basisweergavestijlen binnen selectedoption
gebruiken om de optiestijl te onderscheiden van de voorbeeldstijl. In dit geval kan de tekst die in de optie wordt weergegeven visueel worden verborgen in de selectedoption
.
Demo visueel
Live-demo
selectedoption .text {
display: none;
}
Een van de grootste voordelen van het hergebruiken van het <select>
-element voor deze API is achterwaartse compatibiliteit. In deze landselectie ziet u een aangepaste gebruikersinterface met vlagafbeeldingen in de opties, zodat de inhoud gemakkelijker door gebruikers kan worden geparseerd. Omdat niet-ondersteunde browsers de regels negeren die ze niet begrijpen, zoals de aangepaste knop, datalijst, geselecteerde optie en afbeeldingen binnen de opties, zal de terugval vergelijkbaar zijn met de huidige standaard selectie-UI.
Met aanpasbare selecties zijn de mogelijkheden eindeloos. Ik ben vooral dol op deze landenkiezer in Airbnb-stijl, omdat er een slimme stijl is voor responsief ontwerp. Je kunt dit en nog veel meer doen met de komende styleable select, waardoor het een broodnodige toevoeging aan het webplatform wordt.
Demo visueel
Live-demo
Exclusief accordeon
Het oplossen van geselecteerde styling (en alle onderdelen die daarbij horen) is niet het enige UI-component waarop het Chrome-team zich heeft gefocust. De eerste aanvullende componentupdate is de mogelijkheid om exclusieve accordeons te maken, waarbij slechts één van de items in de accordeon tegelijk kan worden geopend
Browserondersteuning
De manier om dit in te schakelen is door dezelfde naamwaarde toe te passen op meerdere detailelementen, waardoor een verbonden groep details ontstaat, vergelijkbaar met een groep keuzerondjes.
<details name="learn-css" open>
<summary>Welcome to Learn CSS!</summary>
</details>
<details name="learn-css">
<summary>Box Model</summary>
<p>...</p>
</details>
<details name="learn-css">
<summary>Selectors</summary>
<p>...</p>
</details>
:user-valid
en :user-invalid
Een andere verbetering van de UI-component zijn de :user-valid
en :user-invalid
pseudo-klassen. De :user-valid
en :user-invalid
pseudo-klassen zijn de laatste tijd stabiel in alle browsers en gedragen zich op dezelfde manier als de :valid
en :invalid
pseudo-klassen, maar komen pas overeen met een formuliercontrole nadat een gebruiker significante interactie heeft gehad met de invoer. Dit betekent dat er aanzienlijk minder code nodig is om te bepalen of er interactie is geweest met een formulierwaarde, of dat deze “vies” is geworden, wat erg handig kan zijn voor het geven van gebruikersfeedback, en vermindert veel scripting die nodig zou zijn om dit in de toekomst te doen. verleden.
Demoschermcast
Live-demo
input:user-valid,
select:user-valid,
textarea:user-valid {
--state-color: green;
--bg: linear-gradient(...);
}
input:user-invalid,
select:user-invalid,
textarea:user-invalid {
--state-color: red;
--bg: linear-gradient(...);
}
Meer informatie over het gebruik van pseudo-elementen voor formuliervalidatie door gebruikers* .
field-sizing: content
Een andere handige componentupdate die onlangs is geland is field-sizing: content
, die kan worden toegepast op formulierbesturingselementen zoals invoer en tekstgebieden. Hierdoor kan de omvang van de invoer groter (of kleiner) worden, afhankelijk van de inhoud ervan. field-sizing: content
kan bijzonder handig zijn voor tekstgebieden, omdat u niet langer gebonden bent aan vaste formaten waarbij u mogelijk omhoog moet scrollen om te zien wat u in de eerdere delen van uw prompt in een te klein invoervak hebt geschreven.
Demoschermcast
Live-demo
textarea, select, input {
field-sizing: content;
}
Meer informatie over veldgrootte .
<hr>
in <select>
De mogelijkheid om het <hr>
- of horizontale regelelement in selecties in te schakelen is een andere kleine maar nuttige componentfunctie. Hoewel dit niet veel semantisch nut heeft, helpt het je wel om inhoud mooi te scheiden binnen een geselecteerde lijst, vooral inhoud die je misschien niet noodzakelijkerwijs wilt groeperen met een optgroup, zoals een tijdelijke aanduidingswaarde.
Selecteer Schermafbeelding
Selecteer Livedemo
<select name="majors" id="major-select">
<option value="">Select a major</option>
<hr>
<optgroup label="School of Fine Arts">
<option value="arthist">
Art History
</option>
<option value="finearts">
Fine Arts
</option>
...
</select>
Meer informatie over het gebruik van hr in select
Verbeteringen van de levenskwaliteit
We zijn voortdurend aan het itereren, en dat geldt niet alleen voor interacties en componenten. Er zijn het afgelopen jaar nog veel meer updates over de kwaliteit van leven verschenen.
Nesten met vooruitkijken
Native CSS-nesting is vorig jaar in alle browsers geïntroduceerd en is sindsdien verbeterd om lookahead te ondersteunen, wat betekent dat de &
before-elementnamen niet langer een vereiste zijn. Hierdoor voelt het nestelen zoveel ergonomischer en vergelijkbaar met wat ik in het verleden gewend was.
Een van mijn favoriete dingen van CSS-nesten is dat je hiermee componenten visueel kunt blokkeren, en dat je binnen die componenten statussen en modifiers kunt opnemen, zoals containerquery's en mediaquery's. Voorheen had ik de gewoonte om al deze zoekopdrachten onderaan het bestand te groeperen voor specificiteitsdoeleinden. Nu kunt u ze op een zinvolle manier schrijven, direct naast de rest van uw code
.card {
/* card base styles */
h2 {
/* child element style */
}
&.highlight {
/* modifier style */
}
&:hover, &:focus {
/* state styles */
}
@container (width >= 300px) {
/* container query styles */
}
}
Inhoud uitlijnen voor blokindeling
Een andere hele leuke verandering is de mogelijkheid om centreermechanismen te gebruiken, zoals align-content
in de blokindeling. Dit betekent dat je nu dingen kunt doen zoals verticaal centreren binnen een div zonder dat je flex- of rasterlay-out hoeft toe te passen, en zonder bijwerkingen zoals het voorkomen van het instorten van de marges, die je misschien niet wilt van die lay-outalgoritmen.
Browserondersteuning
Schermafbeelding
Live-demo
div {
align-content: center;
}
Tekstomloop: evenwichtig en mooi
Over lay-out gesproken: de tekstlay-out heeft een mooie verbetering gekregen door de toevoeging van text-wrap: balance
en pretty
. text-wrap: balance
wordt gebruikt voor een uniformer tekstblok, terwijl text-wrap: pretty
zich richt op het verminderen van singletons op de laatste regel van de tekst.
Demoschermcast
Live-demo
h1 {
text-wrap: balance;
}
Meer informatie over tekstomloop: balans .
Internationale typografische updates
Updates voor de typografische lay-out voor CJK-tekstfuncties hebben het afgelopen jaar veel leuke updates gekregen, zoals de functie word-break: auto-phrase
die de regel omsluit op de natuurlijke zinsgrens.
Browserondersteuning
En text-spacing-trim
, waarmee spatiëring tussen leestekens wordt toegepast om de leesbaarheid van Chinese, Japanse en Koreaanse typografie te verbeteren voor visueel aantrekkelijkere resultaten.
Relatieve kleursyntaxis
In de wereld van kleurthema’s zagen we een grote update met relatieve kleursyntaxis.
In dit voorbeeld gebruiken de kleuren hier een op Oklch gebaseerd thema. Naarmate de tintwaarde wordt aangepast op basis van de schuifregelaar, verandert het hele thema. Dit kan worden bereikt met de relatieve kleursyntaxis. De achtergrond gebruikt de primaire kleur, gebaseerd op de tint, en past de lichtheid, chroma en tintkanalen aan om de waarde ervan aan te passen. --Ik is de broer of zus-index in de lijst voor de gradatie van waarden, waaruit blijkt hoe u een stap kunt combineren met aangepaste eigenschappen en relatieve kleursyntaxis om thema's te bouwen.
Demo screencast
Live Demo
:root {
--hue: 230;
--primary: oklch(70% .2 var(--hue));
}
li {
--_bg: oklch(from var(--primary)
calc(l - (var(--i) * .05))
calc(c - (var(--i) * .01))
calc(h - (var(--i) + 5)));
}
light-dark()
functie
Samen met de functie light-dark()
is het thema veel dynamischer en vereenvoudigd geworden.
De functie light-dark()
is een ergonomische verbetering die de opties voor het thema van de kleur vereenvoudigt, zodat u themastijlen op een meer beknopte manier kunt schrijven, zoals zo mooi in dit visuele diagram van Adam Argyle wordt aangetoond. Voordat u twee verschillende codeblokken nodig heeft (uw standaardthema en een gebruikersvoorkeurquery), om thema -opties in te stellen. Nu kunt u deze stijlopties schrijven voor zowel lichte als donkere thema's in dezelfde lijn van CSS met behulp van de functie light-dark()
.
html {
color-scheme: light dark;
}
button {
background-color: light-dark(lightblue, darkblue);
}
Als de gebruiker een lichtthema heeft geselecteerd, heeft de knop een lichtblauwe achtergrond. Als de gebruiker een donker thema heeft geselecteerd, heeft de knop een donkerblauwe achtergrond.
:has()
selector
En ik zou nalaten om over moderne gebruikersinterface te praten zonder een van de meest impactvolle interop -hoogtepunten van het afgelopen jaar te vermelden, die de :has()
selector moet zijn, die in december vorig jaar over browsers landt. Deze API is een game-wisselaar voor het schrijven van logische stijlen.
Met de :has()
selecteur kunt u controleren of een onderliggende element specifieke kinderen heeft, of dat die kinderen zich in een specifieke staat bevinden en in wezen ook als ouderkeuze kunnen functioneren.
:has()
is al met name nuttig gebleken voor veel bedrijven , waaronder PolicyBazaar, die gebruiken :has()
style blokken op basis van hun interieurinhoud, zoals in de sectie Compare, waar de stijl zich aanpast als er een plan is om een plan te zijn Vergelijk in het blok, of als het leeg is.
"Met de: HAS () selector konden we op JavaScript gebaseerde validatie van de selectie van de gebruiker elimineren en vervangen door een CSS -oplossing die naadloos voor ons werkt met dezelfde ervaring als voorheen. - Aman Soni, Tech Lead, PolicyBazaar"
Containerquery's
Een andere belangrijke toevoeging aan het web dat nu nieuw beschikbaar is en groeit in gebruik zijn containerquery's, die de mogelijkheid kunnen geven om de intrinsieke grootte van een element te ondervragen om stijlen toe te passen: een veel meer fijne kam dan media-query's, die alleen de viewport vragen maat.
Angular heeft onlangs een prachtige nieuwe documentatie -site op Angular.Dev gelanceerd met behulp van containerquery's om de headerblokken te stylen op basis van hun beschikbare ruimte op de pagina. Dus zelfs als de lay-out verandert en van een multicolumn-zijbalkindeling naar een lay-out met één kolom gaat, kunnen de headerblokken zichzelf instellen.
Zonder containerquery's was het doen van zoiets als dit vrij moeilijk te bereiken, en schadelijk voor prestaties, waarvoor het formaat van waarnemers en elementwaarnemers nodig was. Nu is het triviaal om een element te stylen op basis van de oudermaat.
Demo screencast
Live Demo
@property
En uiteindelijk zijn we heel snel verheugd om @property land in baseline te zien. Dit is een belangrijk kenmerk voor het bieden van semantische betekenis aan CSS aangepaste eigenschappen (ook bekend als CSS -variabelen) en maakt een hele reeks nieuwe interactiefuncties mogelijk. @property
maakt ook contextuele betekenis, typeching, standaardwaarden en fallback -waarden mogelijk in CSS. Het openen van de deuren voor nog robuustere functies zoals bereikstijlquery's. Dit is een functie die nooit eerder mogelijk was en nu zoveel diepte biedt aan de taal van CSS.
Demo screencast
Live Demo
@property --card-bg {
syntax: "<color>";
inherits: false;
initial-value: #c0bae8;
}
Conclusie
Met al deze nieuwe krachtige UI -mogelijkheden die over browsers landen, zijn de mogelijkheden eindeloos. Nieuwe interactieve ervaringen met scroll-aangedreven animaties en weergavesteovergangen maken het web vloeistof en interactiever op manieren die we nog nooit eerder hebben gezien. En ui -componenten op het volgende niveau maken het eenvoudiger dan ooit om robuuste, prachtig aangepaste componenten te bouwen zonder de hele native ervaring uit te scheuren. En ten slotte, kwaliteit van leven verbeteringen in architectuur, lay -out, typografie en responsief ontwerp, lost niet alleen de kleine grote dingen op, maar geven ontwikkelaars ook de tools die ze nodig hebben om complexe interfaces te bouwen die werken op verschillende apparaten, vormfactoren en gebruiker behoeften.
Deze nieuwe functies moeten u in staat zijn om scripting van derden te verwijderen voor prestatiegeavy-functies zoals scrollytelling en tethering-elementen aan elkaar met ankerpositionering, vloeistofpagina-overgangen bouwen, eindelijk vervolgkeuzemensters stylen en de algemene structuur van uw code moeten verbeteren.
Het is nooit een betere tijd geweest om een webontwikkelaar te worden. Er is niet zoveel energie en opwinding geweest sinds de aankondiging van CSS3. Functies die we nodig hebben, maar hebben er alleen van gedroomd om in het verleden daadwerkelijk te landen, worden eindelijk een realiteit en een deel van het platform. En het is vanwege je stem die we kunnen prioriteren en uiteindelijk deze mogelijkheden tot leven brengen. We werken eraan om het gemakkelijker te maken om de harde, vervelende dingen native te doen, zodat u meer tijd kunt besteden aan het bouwen van de dingen die ertoe doen - zoals de kernfuncties en ontwerpdetails die uw merk onderscheiden.
Volg voor meer informatie over deze nieuwe functies als ze landen bij Developer.Chrome.com en Web.Dev, waar ons team het laatste nieuws deelt in webtechnologieën. Probeer scroll -aangedreven animaties, bekijk overgangen, ankerpositionering of zelfs de stijlbare select en laat ons weten wat u ervan vindt. We zijn hier om te luisteren en we zijn hier om te helpen.
,Het webplatform leeft met innovatie, met CSS- en Web UI -functies in de voorhoede van deze opwindende evolutie. We leven in een gouden tijdperk voor web -gebruikersinterface, met nieuwe CSS -functies die overbrowsers landen in een tempo dat we nog nooit eerder hebben gezien, een wereld van mogelijkheden openen voor het creëren van prachtige en boeiende webervaringen. Deze blogpost zal diep in de huidige staat van CSS duiken en enkele van de meest game-veranderende nieuwe functies verkennen die opnieuw worden gedefinieerd hoe we webtoepassingen bouwen, live te zien op Google I/O 2024.
Nieuwe interactieve ervaringen
Een webervaring is fundamenteel een oproep en reactie tussen u en uw gebruikers - dat is waarom het zo belangrijk is om te investeren in kwaliteitsgebruikersinteracties. We hebben gewerkt aan een aantal echt grote verbeteringen die mogelijkheden ontgrendelen die we nog nooit eerder op internet hebben gehad voor het navigeren op webpagina's en het navigeren tussen hen.
Scroll-aangedreven animaties
Zoals de naam al aangeeft, kun je met de scroll-aangedreven animaties API dynamische scroll-gebaseerde animaties maken zonder te vertrouwen op scroll-waarnemers of andere zware scripting.
Maak scroll-aangedreven animaties
Vergelijkbaar met hoe op tijd gebaseerde animaties op het platform werken, kunt u nu de scroll-voortgang van een scroller gebruiken om een animatie te starten, te pauzeren en om te keren. Dus als je vooruit scrolt, zie je die animatie voortgang en wanneer je achteruit scrollen, gaat het andersom. Hiermee kunt u gedeeltelijke of volledige pagina's maken met elementen die animeren in en binnen de Viewport, ook bekend als ScrollyTelling , voor dynamische visuele impact.
Scroll-aangedreven animaties kunnen worden gebruikt om belangrijke inhoud te benadrukken, gebruikers door een verhaal te begeleiden of gewoon een dynamische aanraking aan uw webpagina's toe te voegen.
Scroll-aangedreven animatievisual
Live Demo
@keyframes appear {
from {
opacity: 0;
scale: 0.8;
}
to {
opacity: 1;
scale: 1;
}
}
img {
animation: appear linear;
animation-timeline: view();
animation-range: entry 25% cover 50%;
}
De voorgaande code definieert een eenvoudige animatie die in de Viewport verschijnt door de opaciteit en schaal van een afbeelding te wijzigen. De animatie wordt aangedreven door de scrollpositie. Om dit effect te maken, stelt u eerst de CSS-animatie in en stelt u vervolgens de animation-timeline
in. In dit geval volgt de functie view()
met de standaardwaarden de afbeelding ten opzichte van de Scrollport (die in dit geval ook de Viewport is).
Het is belangrijk om browserondersteuning en gebruikersvoorkeuren in gedachten te houden, vooral voor toegankelijkheidsbehoeften. Gebruik daarom de @supports
regel om te controleren of de browser scroll-aangedreven animaties ondersteunt en uw scroll-aangedreven animatie in een gebruikersvoorkeurquery zoals @media (prefers-reduced-motion: no-preference)
inpakt om de bewegingsvoorkeuren van gebruikers te respecteren . Nadat u deze controles heeft uitgevoerd, weet u dat uw stijlen zullen werken en dat de animatie niet problematisch is voor de gebruiker.
@supports (animation-timeline: view()) {
@media (prefers-reduced-motion: no-preference) {
/* Apply scroll-driven animations here */
}
}
Scroll-aangedreven animaties kunnen in de volledige pagina scrollytelling-ervaringen betekenen, maar ze kunnen ook subtielere animaties betekenen, zoals een headerbalk die een schaduw minimaliseert en een schaduw toont terwijl je op een web-app scrollen.
Scroll-aangedreven animatievisual
Live Demo
@keyframes shrink-name {
from {
font-size: 2em;
}
to {
font-size: 1.5em;
}
}
@keyframes add-shadow {
from {
box-shadow: none;
}
to {
box-shadow: 0 4px 2px -2px gray;
}
}
header {
animation: add-shadow linear both;
}
h2 {
animation: shrink-name linear both;
}
header, h2 {
animation-timeline: scroll();
animation-range: 0 150px;
}
Deze demo maakt gebruik van een paar verschillende keyframe-animaties-de header, tekst, nav-bar en achtergrond-past vervolgens de respectieve scroll-aangedreven animatie toe op elk. Hoewel ze elk een andere animatiestijl hebben, hebben ze allemaal dezelfde animatie-timeline, de dichtstbijzijnde scroller en dezelfde animatiebereik-van de bovenkant van de pagina tot 150 pixels.
Prestatievoordelen van door scroll aangedreven animaties
Deze ingebouwde API vermindert een codelast die u moet onderhouden, of dat is aangepaste script dat u hebt geschreven of de opname van een extra afhankelijkheid van derden. Het verwijdert ook de noodzaak om verschillende scroll -waarnemers te verzenden, wat betekent dat een aantal behoorlijk belangrijke prestatievoordelen. Dit komt omdat met scroll aangedreven animaties van de hoofdthread werken bij het animeren van eigenschappen die kunnen worden geanimeerd op de compositor zoals Transforms en Dekking, of u de nieuwe API rechtstreeks in CSS gebruikt of de JavaScript Hooks gebruikt.
Tokopedia gebruikte onlangs met scroll-aangedreven animaties om de productnavigatiebalk te laten verschijnen terwijl u scrolde. Het gebruik van deze API heeft een aantal serieuze voordelen gehad, zowel voor codebeheer als voor prestaties.
"We zijn erin geslaagd om tot 80% van onze codes te verminderen in vergelijking met het gebruik van conventionele JS -scroll -evenementen en merkten op dat het gemiddelde CPU -gebruik tijdens het scrollen van 50% tot 2% is afgenomen. - Andy Wihalim, senior software -ingenieur, Tokopedia"
De toekomst van scroll -effecten
We weten dat deze effecten van het internet een meer boeiende plek zullen blijven maken, en we denken al aan wat er zou kunnen komen. Dit omvat de mogelijkheid om niet alleen nieuwe animatietijdlijnen te gebruiken, maar om ook een scrollpoint te gebruiken om het begin van een animatie te activeren, genaamd met scroll-geactiveerde animaties.
En er komen nog meer scroll -functies in de toekomst naar browsers. De volgende demo toont een combinatie van deze toekomstige functies. Het maakt gebruik van CSS scroll-start-target
om de begindatum en tijd in te stellen in de pickers, en de JavaScript scrollsnapchange
gebeurtenis om de koptekstdatum bij te werken, waardoor het triviaal is om de gegevens te synchroniseren met de gebroken gebeurtenis.
U kunt hier ook op bouwen om een picker in realtime bij te werken met het JavaScript -evenement scrollsnapchanging
.
Deze specifieke functies zijn momenteel alleen in Canary achter een vlag, maar ze ontgrendelen mogelijkheden die voorheen onmogelijk of zeer moeilijk te bouwen zijn in het platform en de toekomst van scroll-gebaseerde interacties te benadrukken.
Voor meer informatie over aan de slag met scroll-aangedreven animaties, heeft ons team zojuist een nieuwe videoserie gelanceerd die je kunt vinden op het Chrome voor YouTube-kanaal van ontwikkelaars . Hier leert u de basisprincipes van scroll-aangedreven animaties van Bramus van Damme, inclusief hoe de functie werkt, vocabulaire, verschillende manieren om effecten te creëren en hoe effecten te combineren om rijke ervaringen op te bouwen. Het is een geweldige videoserie om te bekijken.
Bekijk overgangen
We hebben zojuist een krachtige nieuwe functie geanimeerd op webpagina's, maar er is ook een krachtige nieuwe functie genaamd View Transitions voor het animeren tussen paginaweergaven om een naadloze gebruikerservaring te creëren. Bekijk overgangen introduceren een nieuw niveau van vloeibaarheid in het web, zodat u naadloze overgangen tussen verschillende weergaven binnen een enkele pagina, of zelfs op verschillende pagina's kunt maken.
Airbnb is een van de bedrijven die al experimenteren met het integreren van weergaveovergangen in hun gebruikersinterface voor een soepele en naadloze webnavigatie -ervaring. Dit omvat de sideBar van de lijsteditor, meteen in het bewerken van foto's en het toevoegen van voorzieningen, allemaal binnen een vloeiende gebruikersstroom.
Hoewel deze effecten op volledige pagina mooi en naadloos zijn, kunt u ook micro-interacties maken, zoals dit voorbeeld waarbij uw lijstweergave wordt bijgewerkt over gebruikersinteractie. Dit effect kan moeiteloos worden bereikt met weergavestransities.
De manier om snel weergavevoerovergangen in uw applicatie met één pagina in te schakelen, is net zo eenvoudig als het inpakken van een interactie met document.startViewTransition
, en ervoor te zorgen dat elk element dat overgang is een view-transition-name
, inline of dynamisch gebruik van JavaScript als u maakt als u maakt DOM -knooppunten.
Demo visual
Live Demo
document.querySelectorAll('.delete-btn').forEach(btn => {
btn.addEventListener('click', () => {
document.startViewTransition(() => {
btn.closest('.card').remove();
});
})
});
/* Styles for the transition animation */
::view-transition-old(.card):only-child {
animation: fade-out ease-out 0.5s;
}
Bekijk transitieklassen
Bekijk overgangsnamen kunnen worden gebruikt om aangepaste animaties toe te passen op uw weergavestransitie, hoewel dit omslachtig kan worden met veel overgang van elementen. De eerste nieuwe update om overgangen dit jaar te bekijken, vereenvoudigt dit probleem en introduceert de mogelijkheid om view -overgangslessen te maken die kunnen worden toegepast op aangepaste animaties.
Browserondersteuning
Bekijk overgangstypen
Een andere grote verbetering voor weergavestransities is ondersteuning voor weergaveversie . Bekijk overgangstypen zijn handig als u een ander soort visuele weergavestransitie wilt bij het animeren van en naar paginaweergaven.
Browserondersteuning
Misschien wilt u bijvoorbeeld een startpagina op een andere manier naar een blogpagina animeren dan die blogpagina terug naar de startpagina. Of misschien wilt u dat pagina's op verschillende manieren in en uit ruilen, zoals in dit voorbeeld, van links naar rechts gaan en Visa Versa. Voordat dit rommelig was om te doen. Je zou klassen aan de DOM kunnen toevoegen om stijlen toe te passen, en zou dan de klassen daarna moeten verwijderen. View-transition-types stellen de browser in staat om oude overgangen op te ruimen in plaats van u te eisen dat u dit handmatig doet voordat u nieuwe initiëren, dit werk voor u doen.
U kunt typen instellen in uw document.startViewTransition
-functie, die nu een object accepteert. update
is de callback -functie die de DOM bijwerkt, en types
is een array met de typen.
document.startViewTransition({
update: myUpdate,
types: ['slide', 'forwards']
})
Overgangen met meerdere pagina's
Wat het web krachtig maakt, is hoe uitgebreid het is. Veel toepassingen zijn niet alleen een pagina, maar een robuust tapijt met meerdere pagina's. En daarom zijn we zo enthousiast om aan te kondigen dat we de ondersteuning van cross-documentweergave overgangen voor toepassingen voor meerdere pagina's in Chromium 126 verzenden.
Browserondersteuning
Deze nieuwe cross-document-functieset bevat webervaringen die in hetzelfde origin leven, zoals navigeren van web.dev naar web.dev/blog, maar dit omvat niet navigeren door cross-origin, zoals navigeren van web.dev naar Blog.web.dev of naar een ander domein zoals Google.com.
Een van de belangrijkste verschillen met overgangen van hetzelfde document is dat u uw overgang niet hoeft te verpakken met document.startViewTransition()
. Meld in plaats daarvan op beide pagina's die betrokken zijn bij de weergave-overgang met behulp van de CSS @view-transition
At-Rule.
@view-transition {
navigation: auto;
}
Voor een meer aangepast effect, kunt u in JavaScript haken met behulp van de nieuwe pageswap
of pagereveal
-evenementenluisteraars, die u toegang geven tot het View Transition -object.
Met pageswap
kunt u enkele last-minute wijzigingen aan te brengen op de uitgaande pagina vlak voordat de oude snapshots worden gemaakt, en met pagereveal
Pas de nieuwe pagina aan voordat deze begint te worden weergegeven nadat deze is geïnitialiseerd.
window.addEventListener('pageswap', async (e) => {
// ...
});
window.addEventListener('pagereveal', async (e) => {
// ...
});
In de toekomst zijn we van plan om overovergangen uit te breiden, waaronder:
- Scoped overgangen : laat u een overgang naar een DOM -subtree beperken, waardoor de rest van de pagina interactief kan blijven en meerdere weergavestransities tegelijkertijd ondersteunt.
- Gebaar-aangedreven weergaveovergangen : gebruik slepen- of veeggebaren om een overgang van een cross-document-weergave te activeren voor meer native-achtige ervaringen op internet.
- Navigatie-matching in CSS : Pas de overgang van uw cross-documentweergave rechtstreeks in uw CSS aan als een alternatief voor het gebruik van
pageswap
enpagereveal
evenementen in JavaScript om meer te weten te komen over weergavestransities voor toepassingen met meerdere pagina's, inclusief hoe u deze het meest kunt instellen met Pre- Rendering, bekijk het volgende gesprek van Bramus van Damme:
Motor-componenten UI-componenten: het vereenvoudigen van complexe interacties
Het bouwen van complexe webtoepassingen is geen eenvoudige prestatie, maar CSS en HTML evolueren om dit proces veel beter beheersbaar te maken. Nieuwe functies en verbeteringen zijn het vereenvoudigen van het creëren van UI -componenten, waardoor u zich kunt concentreren op het opbouwen van geweldige ervaringen. Dit wordt gedaan door middel van een samenwerkingsinspanning met verschillende belangrijke normen en gemeenschapsgroepen, waaronder de CSS -werkgroep, Open UI Community Group en Whatwg (Web Hypertext Application Technology Working Group).
Eén grote ontwikkelingspunt is een schijnbaar eenvoudig verzoek: de mogelijkheid om vervolgkeuzemenu's te stylen (het geselecteerde element). Hoewel het op het oppervlak eenvoudig lijkt, is dit een complex probleem, dat zoveel stukken van het platform aanraakt; Van lay -out en rendering tot scrollen en interactie tot styling van gebruikersagent en CSS -eigenschappen, en zelfs wijzigingen in HTML zelf.
Een vervolgkeuzelijst bestaat uit veel stukken en omvat veel staten die moeten worden verantwoord, zoals:
- Toetsenbordbindingen (om de interactie in te voeren/te verlaten)
- Klik om af te wijzen
- Actief popoverbeheer (sluit andere popovers wanneer men opent)
- Tab focusbeheer
- Visualiseren van de geselecteerde optiewaarde
- Pijl -interactiestijl
- Staatsbeheer (open/sluiten)
Het is momenteel moeilijk om al deze staat zelf te beheren, maar het platform maakt het ook niet gemakkelijk. Om dit op te lossen, hebben we die stukken opgebroken en verzendt we een paar primitieve functies die dropdowns mogelijk maken, maar ook zoveel meer doen.
De popover -API
Eerst hebben we een wereldwijd kenmerk verzonden genaamd popover
, waarvan ik enthousiast ben om aan te kondigen dat ik een paar weken geleden net de nieuw beschikbare status bereikte.
Popover -elementen zijn verborgen met display: none
tot er geopend met een invoker zoals een knop of met JavaScript. Om een basispopover te maken, stelt u het Popover -kenmerk op het element in en koppelt u de ID aan een knop met behulp van popovertarget
. Nu is de knop de invoker,
Demo visual
Live Demo
<button popovertarget="my-popover">Open Popover</button>
<div id="my-popover" popover>
<p>I am a popover with more information.</p>
</div>
Met het Popover -kenmerk dat nu is ingeschakeld, verwerkt de browser veel sleutelgedrag zonder extra scripting, waaronder:
- Promotie naar de bovenste laag. : Een afzonderlijke laag boven de rest van de pagina, zodat u niet hoeft te spelen met
z-index
. - Lichte-dismiss functionaliteit. : Als u buiten het popovergebied klikt, wordt de Popover gesloten en de focus geretourneerd.
- Standaard Tab Focus Management. : Het openen van de popover maakt het volgende tabblad stop in de popover.
- Ingebouwde toetsenbordbindingen. : Het raken van de
esc
-toets of dubbele schakelen zal de popover sluiten en de focus retourneren. - Standaardcomponentbindingen. : De browser verbindt semantisch een popover met zijn trigger.
Misschien gebruik je deze Popover API vandaag zelfs zonder het te beseffen. GitHub implementeerde Popover op hun 'nieuw' -menu van hun startpagina en in hun overzicht van het pull -aanvraagrecensie. Ze hebben deze functie progressief verbeterd met behulp van de Popover Polyfill , gebouwd door Oddbird met enige belangrijke ondersteuning van Github's eigen Keith Cirkel, om oudere browsers te ondersteunen.
“We zijn erin geslaagd om letterlijk 1000s code -regels van code af te perceren door naar Popover te migreren. Popover helpt ons door het elimineren van de noodzaak om te vechten tegen magische z-indexnummers ... met de juiste toegankelijkheidsboomrelatie die is vastgesteld met declaratief knopgedrag en focusgedrag ingebouwd, maakt het voor ons ontwerpsysteem aanzienlijk eenvoudiger om patronen op de juiste manier te implementeren. Keith Cirkel, software -ingenieur, GitHub "
Invoer- en exit -effecten animeren
Als je popovers hebt, wil je waarschijnlijk wat interactie toevoegen. Er zijn vier nieuwe interactiefuncties die het afgelopen jaar zijn geland om animerende popovers te ondersteunen. Deze omvatten:
De mogelijkheid om display
en content-visibility
te animeren op een KeyFrame-tijdlijn.
De eigenschap transition-behavior
met het trefwoord allow-discrete
om overgangen van discrete eigenschappen zoals display
mogelijk te maken.
De @starting-style
regel om toegangseffecten van weergave te animeren van display: none
en in de bovenste laag .
De eigenschap overlay om top-laag gedrag te regelen tijdens een animatie.
Deze eigenschappen werken voor elk element dat u in de bovenste laag animeert, of het nu een popover of een dialoogvenster is. Alles bij elkaar ziet het er zo uit voor een dialoogvenster met een achtergrond:
Demo visual
Live Demo
dialog, ::backdrop{
opacity: 0;
transition: opacity 1s, display 1s allow-discrete, overlay 1s allow-discrete;
}
[open], [open]::backdrop {
opacity: 1;
}
@starting-style {
[open], [open]::backdrop {
opacity: 0;
}
}
Stel eerst de @starting-style
in, zodat de browser weet welke stijlen om dit element in de DOM te animeren. Dit wordt gedaan voor zowel het dialoogvenster als de achtergrond. Stijl vervolgens de open status voor zowel het dialoogvenster als de achtergrond. Voor een dialoogvenster gebruikt dit het open
kenmerk, en voor een popover, de ::popover-open
pseudo-element. Animeer ten slotte de opacity
, display
en overlay
met behulp van het trefwoord allow-discrete
om de animatiemodus in te schakelen waar discrete eigenschappen kunnen overstappen.
Ankerpositionering
Popover was nog maar het begin van het verhaal. Een zeer opwindende update is dat ondersteuning voor ankpositionering nu beschikbaar is bij Chrome 125.
Met behulp van ankerpositionering, met slechts een paar regels code, kan de browser de logica verwerken om een gepositioneerd element aan een of meer ankerelementen aan te sluiten. In het volgende voorbeeld is een eenvoudige tooltip verankerd in elke knop, geplaatst in het onderste midden.
Demo visual
Live Demo
Stel een anker-gepositioneerde relatie in CSS in met behulp van de eigenschap anchor-name
op het verankeringselement (in dit geval de knop) en de eigenschap position-anchor
op het gepositioneerde element (in dit geval de tooltip). Pas vervolgens absolute of vaste positionering toe ten opzichte van het anker met behulp van de functie anchor()
. De volgende code plaatst de bovenkant van de tooltip naar de onderkant van de knop.
.anchor {
anchor-name: --my-anchor;
}
.positioned {
position: absolute;
position-anchor: --my-anchor;
}
Als alternatief, gebruik de ankernaam rechtstreeks in de ankerfunctie en sla de eigenschap position-anchor
over. Dit kan handig zijn bij het verankeren van meerdere elementen.
.anchor {
anchor-name: --my-anchor;
}
.positioned {
position: absolute;
top: anchor(--my-anchor bottom);
}
Gebruik ten slotte het nieuwe trefwoord anchor-center
voor de justify
en align
eigenschappen uit om het gepositioneerde element naar zijn anker te centreren.
.anchor {
anchor-name: --my-anchor;
}
.positioned {
position: absolute;
top: anchor(--my-anchor bottom);
justify-self: anchor-center;
}
Hoewel het erg handig is om ankerpositionering met Popover te gebruiken, is Popover absoluut geen vereiste voor het gebruik van ankerpositionering. Anchor -positionering kan worden gebruikt met twee (of meer) elementen om een visuele relatie te creëren. In feite toont de volgende demo, geïnspireerd door een artikel uit Roman Komarov , een onderstrepingstijl die wordt verankerd om items te vermelden terwijl u zich zweeft of over hen.
Demo visual
Live Demo
Dit voorbeeld gebruikt de ankerfunctie om de ankerpositie in te stellen met behulp van de fysieke eigenschappen van left
, right
en bottom
. Wanneer u over een van de links zweeft, verandert het doelanker en verschuift de browser het doelwit om de positionering toe te passen, waarbij de kleur ook tegelijkertijd wordt geanimeerd om een netjes effect te creëren.
ul::before {
content: "";
position: absolute;
left: anchor(var(--target) left);
right: anchor(var(--target) right);
bottom: anchor(var(--target) bottom);
...
}
li:nth-child(1) { --anchor: --item-1 }
ul:has(:nth-child(1) a:is(:hover, :focus-visible)) {
--target: --item-1;
--color: red;
}
inset-area
positionering
Naast de standaard directionele absolute positionering die u waarschijnlijk eerder hebt gebruikt, is er een nieuw lay -outmechanisme dat is opgenomen als onderdeel van de ankerpositionerings -API genaamd Inset Area. Inset-gebied maakt het gemakkelijk om gepositioneerde elementen te plaatsen ten opzichte van hun respectieve ankers, en werkt op een 9-cellet met het verankeringselement in het midden. Bijvoorbeeld, inset-area: top
plaatst het gepositioneerde element bovenaan, en inset-area: bottom
plaatst het gepositioneerde element onderaan.
Een vereenvoudigde versie van de eerste ankerdemo ziet er zo uit met inset-area
:
.anchor {
anchor-name: --my-anchor;
}
.positioned {
position: absolute;
position-anchor: --my-anchor;
inset-area: bottom;
}
U kunt deze positionele waarden combineren met span -trefwoorden om bij de middenpositie te starten en ofwel naar links spannen, naar rechts span of alles omvatten om de volledige set kolommen of rijen beschikbaar te nemen. U kunt ook logische eigenschappen gebruiken. Bekijk dit gereedschap in Chrome 125+ om het gemakkelijker te maken om dit lay -outmechanisme te visualiseren en op te pakken:
Omdat deze elementen verankerd zijn, beweegt het gepositioneerde element dynamisch rond de pagina terwijl het anker beweegt. Dus in dit geval hebben we kaartelementen met container-query-stijl, die het formaat wijzigen op basis van hun intrinsieke grootte (iets dat je niet zou kunnen doen met media-query's), en het verankerde menu zal verschuiven met de nieuwe lay-out naarmate de kaart-UI verandert.
Demo visual
Live Demo
Dynamische ankerposities met position-try-options
Menu's en submenu -navigatie zijn zoveel gemakkelijker te maken met een combinatie van popover- en ankerpositionering. En wanneer u de rand van een viewport met uw verankerde element raakt, kunt u de browser ook voor u laten wijzigen. Je kunt dit op een paar manieren doen. De eerste is om uw eigen positioneringsregels te maken. In dit geval is het submenu aanvankelijk aan de rechterkant van de knop "StoreFront" geplaatst. Maar u kunt een @position-try
blok maken voor wanneer er niet genoeg ruimte is rechts van het menu, waardoor het een aangepaste identificatie van --bottom
heeft. Vervolgens verbindt u dit @position-try
blok met het anker met behulp van position-try-options
.
Nu zal de browser schakelen tussen deze verankerde toestanden, eerst de juiste positie proberen en vervolgens naar de bodem schakelen. En dit kan worden gedaan met een mooie overgang.
Demo visual
Live Demo
#submenu {
position-anchor: --submenu;
top: anchor(top);
left: anchor(right);
margin-left: var(--padding);
position-try-options: --bottom;
transition: top 0.25s, left 0.25s;
width: max-content;
}
@position-try --bottom {
top: anchor(left);
left: anchor(bottom);
margin-left: var(--padding);
}
Samen met de expliciete positioneringslogica zijn er een paar zoekwoorden die de browser biedt als u een aantal basisinteracties wilt, zoals uw anker in het blok of inline aanwijzingen omdraaien.
position-try-options: flip-block, flip-inline;
Voor een eenvoudige flipping-ervaring, profiteer van deze flip-trefwoordwaarden en sla het schrijven van een definitie van een position-try
helemaal over. Dus nu kunt u een volledig functioneel locatie-responsief ankergelect element hebben met slechts een paar regels CSS.
Demo visual
Live Demo
.tooltip {
inset-area: top;
position-try-options: flip-block;
}
Meer informatie over het gebruik van ankerpositionering .
De toekomst van gelaagde gebruikersinterface
We zien overal gebonden ervaringen, en de set functies die in dit bericht worden getoond, is een uitstekende start om creativiteit en betere controle over ankerpositioneerde elementen en gelaagde interfaces te ontketenen. Maar dit is nog maar het begin. Momenteel werkt popover
bijvoorbeeld alleen met knoppen als het oproepende element, of met JavaScript. Voor zoiets als previews in Wikipedia-stijl, een patroon dat overal op het webplatform wordt gezien, moet het mogelijk zijn om mee te communiceren, en ook een popover van een link te activeren en van de gebruiker die interesse toont zonder noodzakelijkerwijs door te klikken, zoals een hover of tabblad focus.
Als een volgende stap voor de Popover API, werken we aan interesttarget
om deze behoeften op te lossen en het gemakkelijker te maken om deze ervaringen opnieuw te maken met de juiste ingebouwde toegankelijkheidshaken. Dit is een uitdagend toegankelijkheidsprobleem om op te lossen, met veel open vragen rond ideaal gedrag, maar het oplossen en normaliseren van deze functionaliteit op platformniveau zou deze ervaringen voor iedereen moeten verbeteren.
<a interesttarget="my-tooltip">Hover/Focus to show the tooltip</a>
<span popover=hint id="my-toolip">This is the tooltip</span>
Bovendien is er nog een toekomstgerichte algemene invoker ( invoketarget
) beschikbaar om in Canary te testen dankzij het werk van twee externe ontwikkelaars, Keith Cirkel en Luke Warlow. invoketarget
ondersteunt de declaratieve ontwikkelaarservaring die popovertarget
popovers biedt, genormaliseerd voor alle interactieve elementen, inclusief <dialog>
, <details>
, <details>, <video>
, <input type="file">
en meer.
<button invoketarget="my-dialog">
Open Dialog
</button>
<dialog id="my-dialog">
Hello world!
</dialog>
We weten dat er nog gebruik cases zijn die nog niet onder deze API vallen. Bijvoorbeeld, het stylen van de pijl die een verankerd element verbindt met zijn anker, vooral omdat de positie van het verankerde element verandert, en een element in staat te stellen "te glijden" en in de viewport te blijven in plaats van naar een andere positie te gaan wanneer het zijn grenzen bereikt doos. Dus hoewel we enthousiast zijn om deze krachtige API te landen, kijken we er ook naar uit om in de toekomst nog meer uit te breiden naar zijn mogelijkheden.
Stijlbaar selecteren
Met behulp van popover
en anchor
samen, heeft het team vooruitgang geboekt om eindelijk een aanpasbare geselecteerde vervolgkeuzelijst te schakelen. Het goede nieuws is dat er veel vooruitgang is geboekt. Het slechte nieuws is dat deze API op dit moment nog steeds in een experimentele staat is. Ik ben echter verheugd om enkele live demo's en updates over onze voortgang te delen en hopelijk wat van je feedback te krijgen. Ten eerste is er vooruitgang geboekt om gebruikers te kiezen in de nieuwe, aanpasbare selecte ervaring. De huidige, werk-in-progress manier om dit te doen, is door een uiterlijkeigenschap te gebruiken in CSS, ingesteld op appearance: base-select
. Zodra het uiterlijk is ingesteld, kunt u zich aanmelden voor een nieuwe, aanpasbare selecte ervaring.
select {
appearance: base-select;
}
Naast appearance: base-select
, zijn er een paar nieuwe HTML-updates. Deze omvatten de mogelijkheid om uw opties in een datalist
in te pakken voor aanpassing en de mogelijkheid om willekeurige niet-interactieve inhoud zoals afbeeldingen in uw opties toe te voegen. U hebt ook toegang tot een nieuw element, <selectedoption>
, die de inhoud van de opties in zichzelf weerspiegelt, die u vervolgens kunt aanpassen aan uw eigen behoeften. Dit element is echt handig.
Demo visual
Live Demo
<select>
<button type=popover>
<selectedoption></selectedoption>
</button>
<datalist>
<option value="" hidden>
<p>Select a country</p>
</option>
<option value="andorra">
<img src="Flag_of_Andorra.svg" />
<p>Andorra</p>
</option>
<option value="bolivia">
<img src="Flag_of_Bolivia.svg" />
<p>Bolivia</p>
</option>
...
</datalist>
</select>
De volgende code demonstreert het aanpassen van <selectedoption>
in de Gmail -gebruikersinterface, waarbij een visueel pictogram het type antwoord vertegenwoordigt dat is geselecteerd om ruimte te besparen. U kunt basisweergavestijlen binnen selectedoption
gebruiken om de optiestyling te onderscheiden van de preview -styling. In dit geval kan tekst, die in de optie wordt weergegeven, visueel worden verborgen in de selectedoption
.
Demo visual
Live Demo
selectedoption .text {
display: none;
}
Een van de grootste voordelen bij het hergebruiken van het <select>
-element voor deze API is achterwaartse compatibiliteit. In dit land selecteren, ziet u een aangepaste gebruikersinterface met vlagafbeeldingen in de opties voor eenvoudiger gebruiker van de inhoud. Because non-supported browsers will ignore the lines they do not understand, such as the custom button, datalist, selectedoption, and images within the options, the fallback will be similar to the current default select UI.
With customizable selects, the possibilities are endless. I particularly love this Airbnb-style country selector because there is a clever style for responsive design. You can do this and so much more with the upcoming stylable select, making it a much-needed addition to the web platform.
Demo visual
Live demo
Exclusive accordion
Solving select styling (and all the pieces that come along with it) isn't the only UI component the Chrome team has been focusing on. The first additional component update is the ability to create exclusive accordions, in which only one of the items in the accordion can be opened at a time
Browserondersteuning
The way to enable this is to apply the same name value for multiple details elements, hence creating a connected group of details, much like a group of radio buttons
<details name="learn-css" open>
<summary>Welcome to Learn CSS!</summary>
</details>
<details name="learn-css">
<summary>Box Model</summary>
<p>...</p>
</details>
<details name="learn-css">
<summary>Selectors</summary>
<p>...</p>
</details>
:user-valid
and :user-invalid
Another UI component improvement are the :user-valid
and :user-invalid
pseudo-classes. Stable in all browsers recently, the :user-valid
and :user-invalid
pseudo-classes behave similarly to the :valid
and :invalid
pseudo-classes, but match a form control only after a user has significantly interacted with the input. This means significantly less code is needed to determine if a form value has been interacted with, or has become “dirty”, which can be very useful for providing user feedback, and reduces a lot of scripting that would be necessary to do this in the verleden.
Demo Screencast
Live Demo
input:user-valid,
select:user-valid,
textarea:user-valid {
--state-color: green;
--bg: linear-gradient(...);
}
input:user-invalid,
select:user-invalid,
textarea:user-invalid {
--state-color: red;
--bg: linear-gradient(...);
}
Learn more about using user-* form validation pseudo-elements .
field-sizing: content
Another handy component update that has landed recently is field-sizing: content
, which can be applied to form controls like inputs and textareas. This enables the size of the input to grow (or shrink) depending on its contents. field-sizing: content
can be particularly handy for textareas, as you no longer are resolved to fixed sizes where you may need to scroll up to see what you wrote in the earlier parts of your prompt in a too-small input box.
Demo Screencast
Live Demo
textarea, select, input {
field-sizing: content;
}
Learn more about field sizing .
<hr>
in <select>
The ability to enable the <hr>
, or horizontal rule element in selects is another small but useful component feature. While this doesn't have much semantic use, it does help you nicely separate content within a select list, especially content that you might not necessarily want to group with an optgroup, like a placeholder value.
Select Screenshot
Select Live Demo
<select name="majors" id="major-select">
<option value="">Select a major</option>
<hr>
<optgroup label="School of Fine Arts">
<option value="arthist">
Art History
</option>
<option value="finearts">
Fine Arts
</option>
...
</select>
Learn more about using using hr in select
Quality-of-life improvements
We're constantly iterating, and it's not just for interactions and components. There are many other quality of life updates that have landed in the past year.
Nesting with lookahead
Native CSS nesting landed in all browsers last year, and has since improved to support lookahead, which means the &
before element names is no longer a requirement. This makes nesting feel so much more ergonomic and similar to what I have been used to in the past.
One of my favorite things about CSS nesting is that it enables you to visually block components, and within those components include states and modifiers, such as container queries and media queries. Previously, I was in the habit of grouping all of these queries at the bottom of the file for specificity purposes. Now, you can write them in a way that makes sense, right next to the rest of your code
.card {
/* card base styles */
h2 {
/* child element style */
}
&.highlight {
/* modifier style */
}
&:hover, &:focus {
/* state styles */
}
@container (width >= 300px) {
/* container query styles */
}
}
Align-content for block layout
Another really nice change is the ability to use centering mechanisms like align-content
in block layout. This means you can now do things like vertical centering within a div without needing to apply flex or grid layout, and without side effects like preventing margin-collapse, that you may not want from those layout algorithms.
Browserondersteuning
Schermafbeelding
Live Demo
div {
align-content: center;
}
Text-wrap: balance and pretty
Speaking of layout, text layout got a nice improvement with the addition of text-wrap: balance
and pretty
. text-wrap: balance
is used for a more uniform block of text, while text-wrap: pretty
focuses on reducing singletons on the last line in the text.
Demo Screencast
Live Demo
h1 {
text-wrap: balance;
}
Learn more about text-wrap: balance .
International typography updates
Typographic layout updates for CJK text features got a lot of nice updates in the past year, like the word-break: auto-phrase
feature that wraps the line at the natural phrase boundary.
Browserondersteuning
And text-spacing-trim
, which applies kerning between punctuation characters to improve the readability of Chinese, Japanese, and Korean typography for more visually pleasing results.
Relative color syntax
In the world of color theming, we saw a big update with relative color syntax.
In this example, the colors here use Oklch-based theming. As the hue-value adjusts based on the slider, the entire theme changes. This can be achieved with relative color syntax. The background uses the primary color, based on the hue, and adjusts the lightness, chroma, and hue channels to adjust its value. --i is the sibling index in the list for the gradation of values, showing how you can combine stepping with custom properties and relative color syntax to build themes.
Demo Screencast
Live Demo
:root {
--hue: 230;
--primary: oklch(70% .2 var(--hue));
}
li {
--_bg: oklch(from var(--primary)
calc(l - (var(--i) * .05))
calc(c - (var(--i) * .01))
calc(h - (var(--i) + 5)));
}
light-dark()
function
Along with the light-dark()
function, theming has become much more dynamic and simplified.
The light-dark()
function is an ergonomic improvement that simplifies color theming options so that you can write theme styles in a more concise way, as demonstrated so nicely in this visual diagram by Adam Argyle. Before, you would need two different blocks of code, (your default theme and a user preference query), to set up theme options. Now, you can write these style options for both light and dark themes in the same line of CSS using the light-dark()
function.
html {
color-scheme: light dark;
}
button {
background-color: light-dark(lightblue, darkblue);
}
If the user selected a light theme, the button will have a light blue background. If the user selected a dark theme, the button will have a dark blue background.
:has()
selector
And I would be remiss to talk about modern UI without mentioning one of the most impactful interop highlights from the past year, which has to be the :has()
selector, landing across browsers in December of last year. This API is a game-changer for writing logical styles.
The :has()
selector enables you to check if a child element has specific children, or if those children are in a specific state, and essentially can function as a parent selector as well.
:has()
has already shown to be particularly useful for many companies , including PolicyBazaar, who use :has()
to style blocks based on their interior content, such as in the compare section, where the style adjusts if there is a plan to compare in the block, or if its empty.
“With the :has() selector, we were able to eliminate JavaScript based validation of the user's selection and replace it with a CSS solution which is working seamlessly for us with the same experience as before.–Aman Soni, Tech Lead, PolicyBazaar”
Container queries
Another key addition to the web that is now newly available and growing in usage is container queries, which enable the ability to query an element parent's intrinsic size to apply styles: a much more fine-toothed comb than media queries, which only query the viewport maat.
Angular recently launched a beautiful new documentation site on angular.dev using container queries to style the header blocks based on their available space on the page. So even if the layout changes, and goes from a multicolumn sidebar layout to a single-column layout, the header blocks can self-adjust.
Without container queries, doing something like this was quite hard to achieve, and damaging for performance, requiring resize observers and element observers. Now, it's trivial to style an element based on its parent size.
Demo Screencast
Live Demo
@property
And finally very soon, we are excited to see @property land in Baseline. This is a key feature for providing semantic meaning to CSS custom properties (also known as CSS variables), and enables a slew of new interaction features. @property
also enables contextual meaning, typechecking, defaults, and fallback values in CSS. Opening the doors for even more robust features like range style queries. This is a feature that was never possible before, and now provides so much depth to the language of CSS.
Demo Screencast
Live Demo
@property --card-bg {
syntax: "<color>";
inherits: false;
initial-value: #c0bae8;
}
Conclusie
With all of these new powerful UI capabilities landing across browsers, the possibilities are endless. Novel interactive experiences with scroll-driven animations and view transitions make the web more fluid and interactive in ways we've never seen before. And next level UI components make it easier than ever to build robust, beautifully customized components without ripping out the entire native experience. And finally, quality of life improvements in architecture, layout, typography, and responsive design not only solve the little big things, but also give developers the tools they need to build complex interfaces that work on a variety of devices, form factors, and user behoeften.
These new features you should be able to remove third-party scripting for performance-heavy features like scrollytelling and tethering elements to each other with anchor positioning, build fluid page transitions, finally style dropdowns, and improve the overall structure of your code natively.
It's never been a better time to be a web developer. There hasn't been so much energy and excitement since the announcement of CSS3. Features we've needed but have only dreamed of actually landing in the past, are finally becoming a reality and a part of the platform. And it's because of your voice that we're able to prioritize and finally bring these capabilities to life. We're working on making it easier to do the hard, tedious stuff natively so you can spend more time building the things that matter–like the core features and design details that set your brand apart.
To learn more about these new features as they land, follow along at developer.chrome.com and web.dev, where our team shares the latest news in web technologies. Try out scroll driven animations, view transitions, anchor positioning, or even the stylable select, and let us know what you think. We're here to listen and we're here to help.