kaxigt.com

Jag skriver om webben för webben

Några bra och nyttiga CSS-tekniker

Postad: 1 december 2021 | CSS · CSS-guider | No Comments
Lästid: 5 minuter

Den här artikeln handlar om CSS och några av dess spännande tekniker.

Det finns flera bra och spännande webbartiklar på nätet. Smashing Magazine är en site som ofta har ett intressant innehåll för oss som bland annat vurmar för CSS och UX. Jag tänker här dela med mig lite CSS-tips som jag tycker är spännande och bra att kunna (eller känna till).

Designa vackra skuggor med CSS

Det här med att skapa realistiska skuggor med CSS kan vara en riktig utmaning. Ett av knepen för att skapa skuggor som känns mer naturliga än vad du vanligtvis ser kommer från Josh W Comeau i hans artikel (tutorial) Designing Beautiful Shadows in CSS. Han menar att om man staplar 5 eller 6 individuella skugglager och sedan anpassar vart och ett av dem med olika värden för x/y offset, oskärpa radie, spridning, färg och opacitet så får man den ultimata effekten på skuggan. Josh’s CSS Shadow Palette Generator är då till god hjälp och jag rekommenderar även hans artikel.

Förbättra skrollprestandan

Johan Isaksson skriver i sin artikel How I made Google’s data grid scroll 10x faster with one line of CSS hur han upptäckte hur väldig Googles rullningsfördröjning var.

I mitt företag använder vi Google Search Console för att kontrollera indexeringsstatus och optimera synligheten för våra webbplatser. Du kan också kontrollera vilka externa webbplatser som länkar till din sida, och när jag surfade på sidan ”Bästa länkande webbplatser” märkte jag stor rullningsfördröjning. Detta händer när du väljer att visa en större datauppsättning (500 rader) istället för standardresultaten på 10.

Lösningen då?
Efter mycken möda och besvär visade sig att om han helt enkelt till lade en enda rad CSS till <table> på elementpanelen, och specificerade att det inte kommer att påverka layouten eller stilen för andra element på sidan, så ökade prestandan 10 gånger.

table {
  contain: strict; 
}

Läs mer om CSS contain propertyMDN.

Mjukare hover effekt (button)

Lägg alla stilar du vill ska animeras på hover i ett pseudo-element, inte i själva elementet.

Eric Wätke säger sig ha hittat en väg att få animationer på hover buttons att vara mycket mjukare genom att applicera animationen på pseudo-elementet ::hover eller :hover. Det spelar ingen roll vilken variant du väljer eftersom man måste justera z-indexet ändå. Det här ska inte bara förhindra hover-glitchar utan också se bättre ut samt att man slipper flimret och hoppandet som kan uppstå.

Eric Wätke på Twitter

/* Without pseudo-element */
.element{
	background: ...;
	border-radius: ...;
	color: ...;
}
.element.boop{
	animation: boop .2s forwards;
}

/* With pseudo-element */
.element{
	color: ...;
	position: relative;
}
.element.boop::after{
	content: "";
	position: absolute;
	width: 100%;
	height: 100%;
	background: ...;
	border-radius: ...;
	z-index: -1;
	animation: boop .2s forwards;
}

Se även lösningen och diskussioner om denna på Erics Twitter-sida. Du märker också att i detta kodexempel så använder han boop-animationer. Vad det är kan du läsa i Josh’s artikel (tutorial) Boop (react)! A whimsical twist on hover transitions.

CSS Pseudo-class som kan vara praktiska

:autofill

Pseudoklassen :autofill CSS matchar endast när ett <input>-element har sitt värde autofyllt av webbläsaren. Den slutar matcha om användaren redigerar fältet.

The user agent style sheets of many browsers use !important in their :-webkit-autofill style declarations, making them non-overrideable by webpages without resorting to JavaScript hacks. For example Chrome has the following in its internal stylesheet:

background-color: rgb(232, 240, 254) !important;
background-image: none !important;
color: -internal-light-dark(black, white) !important;

This means that you cannot set the background-color, background-image, or color in your own rules.

https://developer.mozilla.org/en-US/docs/Web/CSS/:autofill

:fullscreen

Pseudoklassen :fullscreen CSS matchar alla element som för närvarande är i helskärmsläge. Om flera element har satts i helskärmsläge, väljs alla. Pseudoklassen :fullscreen låter dig konfigurera dina stilmallar för att automatiskt justera innehållets storlek, stil eller layout när element växlar fram och tillbaka mellan helskärms- och traditionella presentationer.

Magin händer naturligtvis i vår CSS. Här finns två regler. Den första fastställer bakgrundsfärgen för knappen ”Växla helskärmsläge” när elementet inte är i helskärmsläge. Nyckeln är användningen av :not(:fullscreen), som letar efter att elementet inte har pseudoklassen :fullscreen applicerad på sig.

#fs-toggle:not(:fullscreen) {
  background-color: #afa;
}
#fs-toggle:fullscreen {
  background-color: #faa;
}

https://developer.mozilla.org/en-US/docs/Web/CSS/:fullscreen

:focus-within

Pseudoklassen :focus-within CSS matchar ett element om elementet eller någon av dess avkomlingar är fokuserade. Med andra ord, det representerar ett element som i sig matchas av pseudoklassen :focus eller har en avkomling som matchas av :focus. (Detta inkluderar ättlingar i shadow trees.)

/* Selects a <div> when one of its descendants is focused */
div:focus-within {
  background: cyan;
}</div>

https://developer.mozilla.org/en-US/docs/Web/CSS/:focus-within

:indeterminate

Pseudoklassen :indeterminate CSS representerar vilket formelement som helst vars tillstånd är obestämt, till exempel check boxes som har sitt HTML indeterminate-attribut satt till true, radio buttons som är medlemmar i en grupp där alla alternativknappar är avmarkerade och obestämda <progress> element.

/* Selects any <input /> whose state is indeterminate */
input:indeterminate {
  background: lime;
}

Element som den här selektorn riktar in sig på är följande.

<input type=”checkbox”> elements whose indeterminate property is set to true by JavaScript
<input type=”radio”> elements, when all radio buttons with the same name value in the form are unchecked
<progress> elements in an indeterminate state

https://developer.mozilla.org/en-US/docs/Web/CSS/:indeterminate

:picture-in-picture

Pseudoklassen :picture-in-picture CSS matchar elementet som för närvarande är i ”bild-i-bild-läge”. Pseudoklassen :picture-in-picture låter dig konfigurera dina stilmallar för att automatiskt justera storleken, stilen eller layouten på innehållet när en video växlar fram och tillbaka mellan ”bild-i-bild” och traditionella presentationslägen.

:picture-in-picture {
  box-shadow: 0 0 0 5px red;
}
Det finns ingen data-specifikation funnen för css.selectors.picture-in-picture.

https://developer.mozilla.org/en-US/docs/Web/CSS/:picture-in-picture

För dem som tycker om att grotta ned sig i CSS i allmänhet och pseudoklasser i synnerhet så är Developer Mozilla ypperlig!

Förhindra Scroll Chaining (skrollkedja)

Föreställ dig att du har ett element med position: fixed, typ en modal dialogruta som är placerad i mitten av viewport, med det faktiska webbsidans innehåll under sig. Nu, om modalen har en skroll-list och du har nått dess nedre gräns så kommer webbläsaren att fortsätta skrolla huvudsidans innehåll. Det är ett standardbeteendet och tyvärr ganska förvirrande. Lyckligtvis kan scroll chaining, som den oönskade effekten kallas, fixas med CSS.

Den magiska ingrediensen är overscroll-behavior. Ahmad Shadeed skriver om just detta i sin artikel Prevent Scroll Chaining With Overscroll Behavior

Den gamla hack-lösningen

Vi brukade fixa det genom att tillämpa overflow: hidden på body-elementet via Javascript. När en modal öppnas lägger vi till en klass till organet som ansvarar för att tillämpa överflödet.

body.modal-open {
    overflow: hidden;
}

.modal.is-open {
    display: block;
}

Den här lösningen brukade fungera perfekt över stationära webbläsare, men Safari på iOS gillade det inte. För att få det att fungera måste vi också lägga till position: fixed till body-elementet.

body.modal-open {
    position: fixed;
    overflow: hidden;
}

.modal.is-open {
    display: block;
}

Men det räcker inte enligt Ben Frain i sin artikel Preventing body scroll for modals in iOS utan vi måste lägga till följande (iOS 13+).

.bg-scrolling-element-when-modal-active {
    /* when modal active */
    touch-action: none;
    -webkit-overflow-scrolling: none;
    overflow: hidden;
    /* Other browsers */
    overscroll-behavior: none;
}

overscroll-behavior

Egenskapen overscroll-behavior anger vad en webbläsare ska göra när vi når gränsen för ett rullningsområde. Det stöds i alla större webbläsare utom Safari. Egenskapen är en förkortning för overscroll-behavior-x och overscroll-behavior-y.

Observera att inställning av överrullningsbeteende kommer att ställa in båda axlarna. Låt oss därför gå in på möjliga värden.

overscroll-behavior: auto

Standardvärdet är auto, vilket möjliggör chain scroll. När vi har ett rullningselement och vi når gränsen för det kommer webbläsaren att fortsätta rulla på <body>-innehållet.

overscroll-behavior: contain

Från dess namn kommer värdet contain att innehålla rullningen inom elementgränsen.

overscroll-behavior: none

När none är inställd har den en liknande effekt att contain för att förhindra studseffekten när toppen eller botten av sidan nås.

Fler värden finns så jag rekommenderar Ahmad Shadeeds artikel.