This website uses cookies. We use cookies to personalise content and ads, to provide social media features and to analyse our traffic. We also share information about your use of our site with our social media, advertising and analytics partners who may combine it with other information that you’ve provided to them or that they’ve collected from your use of their services.

Cookies are small text files that can be used by websites to make a user's experience more efficient.

The law states that we can store cookies on your device if they are strictly necessary for the operation of this site. For all other types of cookies we need your permission.

This site uses different types of cookies. Some cookies are placed by third party services that appear on our pages.

You can at any time change or withdraw your consent from the Cookie Declaration on our website.

Learn more about who we are, how you can contact us and how we process personal data in our Privacy Policy.

Please state your consent ID and date when you contact us regarding your consent.

Your consent applies to the following domains: blog.angulion.dev

Your current state: Deny. 

Cookie declaration last updated on 6/28/23 by Cookiebot:

Necessary (4)

Necessary cookies help make a website usable by enabling basic functions like page navigation and access to secure areas of the website. The website cannot function properly without these cookies.

Name Provider Purpose Maximum Storage Duration Type
CookieConsent Cookiebot Stores the user's cookie consent state for the current domain 1 year HTTP Cookie
iconify0 blog.angulion.dev Used by the website's content management system (CMS) to determine how the website's menu-tabs should be displayed. Persistent HTML Local Storage
iconify-count blog.angulion.dev Used by the website's content management system (CMS) to determine how the website's menu-tabs should be displayed. Persistent HTML Local Storage
iconify-version blog.angulion.dev Used by the website's content management system (CMS) to determine how the website's menu-tabs should be displayed. Persistent HTML Local Storage

Marketing (1)

Marketing cookies are used to track visitors across websites. The intention is to display ads that are relevant and engaging for the individual user and thereby more valuable for publishers and third party advertisers.

Name Provider Purpose Maximum Storage Duration Type
i/jot/embeds Twitter Inc. Sets a unique ID for the visitor, that allows third party advertisers to target the visitor with relevant advertisement. This pairing service is provided by third party advertisement hubs, which facilitates real-time bidding for advertisers. Session Pixel Tracker

Unclassified (5)

Unclassified cookies are cookies that we are in the process of classifying, together with the providers of individual cookies.

Name Provider Purpose Maximum Storage Duration Type
__ph_opt_in_out_phc_mhkFeVpp5lxOsefr2qaJVPXQlpXkfgPgG5RTHTRKy4M blog.angulion.dev Pending Session HTTP Cookie
ph_#_posthog [x2] blog.angulion.dev Pending 1 year HTTP Cookie
ph_#_primary_window_exists blog.angulion.dev Pending Session HTML Local Storage
ph_#_window_id blog.angulion.dev Pending Session HTML Local Storage

Dlaczego nowoczesny CSS jest zajebisty?

Post cover

Siemano


Z tej strony Bartek 🫡
Dzisiaj lecimy z tematem nowoczesnego CSS.

Fajnie, nie?

Patrz jak to się fajnie rozszerza i zwęża 🐍: funkcja max()


Funckja max() w CSS

Zwróć proszę uwagę - ten czerwony kwadrat:

  • w miarę rozszerzania - rośnie, ale tylko do połowy.
  • Przy zwężaniu (ikonka węża nie będzie już śmieszna drugi raz) maleje, ale do pewnego momentu i wtedy jest stop 🛑


A teraz patrz na kodzisław:


    .some-div {
        background-color: red;
        width: max(50%, 300px);
        height: 300px;
    }

Używamy funkcji max() dla width tego diva. max() po prostu wybiera większą wartość.


Ale skąd wiadomo, która wartość jest większa? 300px to 300px. Ale te 50%?


Te 50% odnosi się do rodzica tego czerwonego gościa. Jeśli rodzic ma np. 1000px, to 50% z tysiąca = 500px

I dalej - jak zwężamy ekran, to rodzic też ma co raz mniej pixeli.


Zwężamy - rodzic ma 900px, 50% z tego to 450px - max() wybiera 450px, bo jest większe niż 300px, proste

Zwężamy - rodzic ma 800px, 50% z tego to 400px - max() wybiera 400px, bo jest większe niż 300px, proste

Zwężamy - rodzic ma 500px, 50% z tego to 250px - max() tym razem wybiera 300px - i stąd to zatrzymanie zwężania się czerwonego gościa, bo 50% rodzica już nie jest większe, nara


A po co w ogóle takie funkcje jak max()?


Rzekłbym, że punkt dla Gryffindoru, ale nie jestem fajny i nie znam sie na tych Harrych Potterach


✅ A zatem - punkt dla responsywności


P.S. Jest też funkcja min() - działa analogicznie (a zarazem cyfrowo heheh)

Na responsywny tekst też są nowe triki: funkcja clamp()


Tutaj wjeżdza funkcja clamp(). Jak masz dwie takie same, to bliźniaki Clamp.


Dobra…


Sprawa jest krótka - choć z tłumikiem


Funkcja clamp() w CSS

Patrz na kodzisław:

    <h1 class="responsive-header">Półgłówek</h1>

    .responsive-header {
        font-size: clamp(14px, 1rem + 2vw, 28px);
    }

  • Pierwsza wartość - 14px - to takie minimum, jakie przyjmie nasz font
  • Ta wyższa matematyka - 1rem + 2vw - to coś, co nasz clamp() będzie najbardziej respektował
  • Ostatnia wartość - 28px - to max jaki font może osiągnąć jeśli chodzi o rozmiar 👀


I teraz pewnie spytasz - a nie powinniśmy mieć osobnego clamp() dla różnych wielkości fontów? h1 to jakiś większy clamp(), h4 to o wiele mniejszy clamp() itd.


💡 No jasne, że możemy - gorąco zachęcam do zdefiniowania wielu takich gości, ale nie musicie tego robić samodzielnie.

Wpadajcie na 👉 utopia.fyi i wygenerujcie je z automatu - fajna sprawa 👀


✅ Główny benefit? Font size’y mogą bardziej żyć swoim życiem - możemy odpiąć troche klasek z Media Queries

✅ A zatem - kolejny punkt dla responsywności!

Ale żeby funkcje nie pełniły, aż tak ważnej funkcji w tym poście


To są jeszcze inne, zajebiste rzeczy w CSS, które musisz sprawdzić. Lecimy dalej 🔥

Prawie jak w Sass: Nesting CSS


Często argumentem za używaniem preprocesorów CSS (Sass/LESS) - jest to, że mają więcej funkcji (hehe, znowu). I że tam np. jest takie fajne zagnieżdżanie styli itd.

♟️ Szach mat, bo w CSS też jest już zagnieżdżanie. Aaa? Kończą się powoli argumenty?


Spójrz proszę na kodzisław:


    <section class="card">
      <h2>Pocztówka</h2>
      <p>-- Pozdrowiam z rodzinką</p>
      <div class="card__photos">
        <div>🚵</div>
        <div>🌊</div>
      </div>
    </section>

    .card {
      width: 300px;
      height: 300px;
      background-color: purple;
      border-radius: 10px;
      padding: 10px;

      h2 {
        color: whitesmoke;
        text-align: center;
      }

      p {
        color: whitesmoke;
        font-style: italic;
      }

      .card__photos {
        display: flex;
        gap: 1em;
        justify-content: center;

        div {
          font-size: 60px;
        }
      }
    }

A teraz spójrz proszę na to arcydzieło 🎨

Zagnieżdzanie w CSS

Szach mat numer 2: Zmienne CSS


Bo to jest tak, że też często mówi się o zmiennych, bo zmienne są fajne..

No i w CSS też są zmienne jak coś. I jak raz wprowadzili, to jest duża szansa, że to już jest niezmienne. Heheh, dobra…


    <h1>Śmieszne koty</h1>
    <h2>Zobacz jak</h2>

    :root {
      --font-level-1: clamp(20px, 1rem + 1.5vw, 44px);
      --font-level-2: clamp(18px, 1rem + 1.3vw, 36px);
      --background-color: pink;
      --foreground-color: whitesmoke;
    }

    body {
      background-color: var(--background-color);
      color: var(--foreground-color);
    }

    h1 {
      font-size: var(--font-level-1)
    }

    h2 {
      font-size: var(--font-level-2);
    }

Ależ tutaj doszło do połączenia wątków - mamy zmienne, mamy clamp() - a nawet dwa - to już bliźniaki clamp() (musiałem).


Co jest fajne w zmiennych?


✅ Przede wszystkim to, że jak już mamy taki fajny setup, że trzymamy w nich wszystkie kolory - to np. możemy bardzo łatwo zmienić całą “szatę graficzną naszej witryny” (ten zwrot trochę jebie jQuery, old schoool) w jednym miejscu.

✅ Tę samą regułę możemy zaaplikować do rozmiaru fonta, ale podobno rozmiar nie ma znaczenia.

A słyszeliście o tym? Pseudoselektor :has()


Kodzisław od razu, bez pytania:

    <section>
        <h2>Półgłówek</h2>
    </section>

    <section>

    </section>

    section:has(h2) {
        /* styluje sobie tylko sekcje, które mają h2 w środku*/
    }

W dużym skrócie - ostylujemy dzięki temu tylko tę sekcję, która ma w środku h2


Patrz proszę na kodzisław nr. 2:

    <section>
        <h1>Półgłówek</h1>
        <h2>Półgłowek 2</h2>
    </section>

    <section>
        <h1>Półgłówek</h1>
        <p>Daj osobę, a znajdzie się...</p>
    </section>

    h1:has(+ h2) {
        color: red;
    }

A tutaj ostylujemy tylko takie h1, które maja h2 jako sąsiadujący element. Fajnie.

Lecimy na rekord: Kodzisław nr. 3:

    <section>
        <h1>H1</h1>
        <h2>H2</h2>
    </section>

    <section>
        <h1>H1</h1>
        <p>P</p>
    </section>

    section:has(h1):has(p) {
        color: red;
    }

Tutaj ostylujemy tylko sekcję nr. 2, ponieważ tylko ona zawiera w sobie h1 oraz p na raz.

To taki mały showcase, że te pseudoselektory (albo selektory w nich zawarte) można łączyć. I to prawie w nieskończoność.


Podobno limit takich łączeń wynosi mniej więcej:


Zapraszam po więcej takich rzeczy 🔥


🔥 Takich rzeczy uczymy na szkoleniu Wszechstronny Frontend, myślę, że fajna sprawa.


Szkolenie Wszechstronny Frontend

✅ Startujemy od totalnych podstaw, także o nic się nie martw

✅ Aktualnie mamy otwarte terminy na 13, 14, 15 września


👉 Dołącz albo poleć znajomemu (nie zawiedziemy) - Wszechstronny Frontend 🔥