Wprowadzenie do CSS

Bartosz Szczeciński

18.05.2018

@btmpl

medium.com/@baphemot

CSS

Kaskadowe Arkusze Stylów (cascading style sheets) to mechanizm pozwalający opisanie stylu prezentacji i na zmianę wyglądu i zachowania elementów HTML w przeglądarce.

 

CSS nie ma możliwości wpływania na strukturę HTML/DOM, chociaż może on dodawać tzw. "pseudoelementy".

Sposoby dodawania CSS

<div style="padding: 15px; color: pink; font-size: 32px; background: black">
    Ten tekst ma rozmiar 32px, jest różowy,
    wyświetlony jest na czarnym tle i ma 15 px "wcięcia".
</div>
<style>
    .hello {
        padding: 15px;
        color: pink;
        font-size: 32px;
        background: black
    }
</style>

<div class="hello">
    Ten tekst ma rozmiar 32px, jest różowy,
    wyświetlony jest na czarnym tle i ma 15 px "wcięcia".
</div>
<link rel="stylesheet" href="./style.css" />

<div class="hello">
    Ten tekst ma rozmiar 32px, jest różowy,
    wyświetlony jest na czarnym tle i ma 15 px "wcięcia".
</div>

Składnia CSS

.selektor { /* Selektor */
    /* Komentarz ;) */

    color: red; /* atrybut: wartość */
}

Selektory

/* Selektor Typu / Elementu */
div {}, html {}, body {}

/* Selektor klasy - atrybutu class="" */
.main {}, .active {}

/* Selektor atrybutu id */
#link {}, #main {}

/* Selektor uniwersalny */
* {}

/* Kombinatory */
/* Kolejne rodzeństwo */
h4 + p {}, li + li {}

/* "Dalsze rodzeństwo" */
h4 ~ p {}, li ~ li {}

/* Bezpośredni potomek */
body > div {}, ul > li {}

/* Ogólny potomek */
body div {}, ul li {}

Selektory

atrybuty

input[type="text"] {

}

input[attr] /* element posiada atrybut */
input[attr="val"] /* atrybut ma wartość "val" */
input[attr~="val"] /* atrybut zawiera słowo "val" w liście oddzielonej przecinkami*/
input[attr^="val"] /* atrybut zaczyna się od "val" */
input[attr|="val"] /* atrybut zaczyna się od "val-" lub jest po prostu "val" */
input[attr$="val"] /* atrybut kończy się na "val" */
input[attr*="val"] /* atrybut zawiera "val" */

Selektory

pseudo-klasy

/* Element wskazany kursorem */
.selektor:hover {}

/* Element będący pierwszym dzieckiem */
ul li:first-child {}

/* Element będący n-tym dzieckiem */
ul li:nth-child(3) {}

/* Co drugie dziecko */
ul li:nth-child(2n+1) {}

/* Pole formularza (lub inny element*), które jest aktualnie zmieniane */
input:focus {}

/* Odwiedzony wcześniej link */
a:visited {}

/* Negacja */
a:not(:visited) {}

/* Łączenie */
a.external:not(:visited):first-child
/*
    Pierwszy link 
    który nie był przez nas odwiedzany
    i mający klasę "external"
*/

Selektory

pseudo-elementy

/* Utwórz pseudo-element wewnątrz węzła, jako pierwszy / ostatni */
.selektor::before {}
.selektor::after {}

/* Pierwsza linia tekstu */
.selektor::firstLine {}

/* Pierwszy znak */
.selektor::first-letter

/* Kolor tła przy zaznaczeniu tekstu */
.selektor::selection {}

Selektory

@rules

/* Media-queries */
@media <typ mediów> [dodatkowe specyfikatory] {
    .selector {

    }
}

Przykładowe typy mediów:

all, screen, print, projection, tv

/* Dodatkowe specyfikatory */
@media screen and (max-width: 768px) {
    .hideOnMobile {
        display: hidden;
    }
}

Selektory

@keyframes

/* Animacje */
@keyframes nazwaAnimacji {
    0% {
        font-size: 10px;
    }

    100% {
        font-size: 32px;
    }
}

.selektor {
    animate: nazwaAnimacji 3s linear 1s infinite alternate;
}

/*
    Dodaj animację "nazwaAnimacji"
    Która trwa 3 sekundy
    Użyj transakcji liniowej
    Opóźnij o 1 sekundę
    Powtarzaj nieskończoną ilość razy
    Od początku do końca, od końca do początku
*/

Selektory

@font-face

/* Deklaracja własnej czcionki */
@font-face {
    font-family: 'Moja Super Czcionka',
    src:    url('/fonts/mojaCzcionka.woff') format('woff2'),
            url('/fonts/mojaCzcionka.ttf') format('ttf')
}

.selektor {
    font-family: 'Moja Super Czcionka';
}

Deklaracje

.class {
    color: red;
    color: blue;

    font-size: 12px;
    font-size: 12rem;

    background-image: url('http://example.com/test/background.png');
    background-repeat: no-repeat;
    background-position: center center;
}

Każda deklaracja musi zaczynać się od atrybutu i zawierać jego wartość (oddzielone :).

Wszystkie deklaracje (poza ostatnią) musza być zakończone średnikiem.

Deklaracje

shorthand

.class {
    background-image: url('http://example.com/test/background.png');
    background-repeat: no-repeat;
    background-position: center center;

    background: url('http://example.com/test/background.png') no-repeat center center;
}

Niektóre deklaracje posiadają zapis skrócony. Dotyczy to deklaracji, które należą do grupy (font-size, background-color, animation-function). Składnia wersji skróconej jest zdefiniowana, ale CSS pozwala na pomijanie elementów.

Deklaracje

Jednostki

px - pixele

mm, cm, in - milimetry, centymetry, cale

pt, pc - punkty (1/72 cala) lub pice (12pt)

em - szerokość litery M w danej czcionce, relatywne wzg. rodzica

ex - wysokość litery x

ch - szerokość cyfry 0

rem - szerokość litery M, relatywne wg. elementu <html> lub <body>

vw, vh - 1% szerokość i wysokość viewportu

vmin, vmax - 1% mniejszego / większego z boków viewportu

Ćwiczenie

Zmień rozmiar tekstu na stronie na 16px

Zmień pogrubienie (font-weight: 'bold') pierwszego <li>

Style dołącz do strony jako oddzielny plik, lub osadź w kodzie HTML

Specificity

.class1 {
    color: red;
}

.class2 {
    color: yellow;
    color: orange;
}

<div class="class1 class2">
    Witaj świecie!
</div>

CSS używa kilku mechanizmów na określenie wynikowego stylu elementu:

Klasy zadeklarowane "później" i atrybuty zadeklarowane "później" mają pierwszeństwo.

Specificity

#id {
    /* 0100 */
}

.class, [type="test"], :hover {
    /* 0010 */
}

element, ::before {
    /* 0001 */
}

style="" // 1000

Każdy rodzaj selektora ma swój własny "specificity"

Specificity

ul li:first-child {
    /* 0012 */
}

p#link > a {
    /* 0102 */
}

p#link > a:hover {
    /* 0112 */
}

li.main {
    /* 0011 */
}

li.main.main.main.main {
    /* 0041 */
}

Selektory można łączyć, łącząc ich specificity:

Specificity

<div style="color: red">
    Ten tekst ma być czerwony! (ale będzie różowy)
</div>

div {
    color: pink !important
}

Istnieje możliwość wymuszenia, aby to nasza konkretna reguła była zastosowana, lecz nie jest to rekomendowane:

<div style="color: red !red">
    Ten tekst ma być czerwony! (i nic tego nie zmieni)
</div>

Praca z CSS w JS

document.querySelector('h4').style.color = 'red';

Styl obiektu (atrybut style) można odczytać i modyfikować jako string.

Ponieważ jest to mało wygodne, można również skorzystać z obiektu .style dla danego elementu
i odczytywać, dodawać lub modyfikować jego wartości.

Praca z CSS w JS

W ten sposób możemy uzyskać jedynie dostęp do stylów nałożonych w HTML (<div style="">) lub dodanych przez JS. Nie mamy dostępu do deklaracji nałożonych przez CSS, ani nie mamy informacji czy deklaracja jest respektowana, czy też została nadpisana przez !important

Praca z CSS w JS

W odróżnieniu od normalnej notacji CSS (kebab case), praca ze stylami w JS używa notacji camelCase:

document.querySelector('h4').style.fontSize = '14px';
document.querySelector('h4').style.textAlign = 'center';

Ćwiczenie

Używając JS, zmień kolor nagłówka (h4)
na stronie na dowolny inny.

Wprowadzenie do CSS

By btmpl

Wprowadzenie do CSS

  • 451