Przejdź do głównej treści
Grafika przedstawia ukryty obrazek

Automatyczny motyw Bootstrap 5.3 na bazie pory dnia

Obraz Główny

W tym wpisie chciałbym się podzielić fajnym sposobem na realizację automatycznego motywu strony na Bootstrap 5.3 który zmienia się w zależności od tego czy jest dzień czy noc, zmieniając się z jasnego na ciemny a także naśladujący tak zwane złote i niebieskie godziny w fotografii, co może obrazować zbliżający się zachód słońca i wieczór. Do tego celu wykorzystałem własne rozszerzenie Bootstrap 5.3, w którym wprowadzono dwa motywy light i dark a ja dodałem jeszcze motywy golden i twilight. Przedstawiam klasę Theme do Koseven do realizacji tego zadania.

Klasa Theme do obługi motywu

<?php

defined('SYSPATH') OR die('No direct script access.');

class Theme
{

    const DAY = 10;
    const GOLDEN = 20;
    const TWILIGHT = 30;
    const NIGHT = 40;

    public static $daytime = Theme::DAY;

    public static function daytime($golden_duration = 3600, $twilight_duration = NULL)
    {
        $suninfo = Date::suninfo();
        $sunrise_time = Arr::get($suninfo, 'sunrise');
        $sunset_time = Arr::get($suninfo, 'sunset');
        $civil_twilight_begin_time = Arr::get($suninfo, 'civil_twilight_begin');
        $civil_twilight_end_time = Arr::get($suninfo, 'civil_twilight_end');
        $now = time();

        $twilight_morning_start_time = $twilight_duration !== NULL ? $sunrise_time - $twilight_duration : $civil_twilight_begin_time;        
        $golden_morning_start_time = $sunrise_time;
        $golden_morning_end_time = $sunrise_time + $golden_duration;
        $golden_evening_start_time = $sunset_time - $golden_duration;
        $golden_evening_end_time = $sunset_time;
        $twilight_evening_end_time = $twilight_duration !== NULL ? $sunset_time + $twilight_duration : $civil_twilight_end_time;        

        if (($now >= $twilight_morning_start_time) && ($now < $golden_morning_start_time))
        {
            return Theme::TWILIGHT;
        }
        elseif (($now >= $golden_morning_start_time) && ($now < $golden_morning_end_time))
        {
            return Theme::GOLDEN;
        }
        elseif (($now >= $golden_morning_end_time) && ($now < $golden_evening_start_time))
        {
            return Theme::DAY;
        }
        elseif (($now >= $golden_evening_start_time) && ($now < $golden_evening_end_time))
        {
            return Theme::GOLDEN;
        }
        elseif (($now >= $golden_evening_end_time) && ($now < $twilight_evening_end_time))
        {
            return Theme::TWILIGHT;
        }
        else
        {
            return Theme::NIGHT;
        }
    }

    public static function auto($day = 'light', $golden = 'golden', $twilight = 'twilight', $night = 'dark')
    {
        switch (Theme::$daytime)
        {
            case Theme::DAY:
                return $day;
            case Theme::GOLDEN:
                return $golden;
            case Theme::TWILIGHT:
                return $twilight;
            case Theme::NIGHT:
                return $night;
        }
    }

}

Klasa wykorzystuje dodatkową funkcję w klasie Date do obliczania godziny wschodu i zachodu słońca na bazie funkcji date_sun_info. Domyślna wartość $timestamp = NULL oznacza aktualną datę i godzinę pobraną funkcją time() jako UNIX Timestamp a domyśle wartości $latitude oraz $longitude dotyczą Warszawy.

Rozszerzenie klasy Date do obliczania wschodu i zachodu słońca

<?php

defined('SYSPATH') OR die('No direct script access.');

class Date extends Kohana_Date
{

    public static function suninfo($timestamp = NULL, $latitude = 52.2297, $longitude = 21.0122)
    {
        if ($timestamp === NULL)
        {
            $timestamp = time();
        }

        return date_sun_info($timestamp, $latitude, $longitude);
    }

}

Modyfikacja bootstrap.php

W pliku bootstrap.php w projekcie na frameworku Koseven użyłem kodu podstawiającego do Theme::$daytime wartość aktualnej pory dnia obliczonej fukncją daytime().

//...tutaj różne ustawienia w bootstrap.php

Theme::$daytime = Theme::daytime();

Przykładowy kod html

Teraz można użyć tak przygotowanej funkcji w dowolnym widoku renderowanym przez clasę View w Koseven. Oto przykładowy kod.

<!DOCTYPE html>
<html lang="en" data-bs-theme="<?= Theme::auto() ?>">
    <head>
        <title>Bootstrap 5.3 Auto Theme</title>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
        <link href="bootstrap_extra.css" rel="stylesheet">
        <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
    </head>
    <body>
        <div class="p-5 text-center">
            <h2>Example Bootstrap Page</h2>
            <p>Some Bootstrap buttons:</p>
            <button class="btn btn-primary">Primary</button>
            <button class="btn btn-secondary">Secondary</button>
        </div>
        <div class="container p-5">
            <div class="row">
                <div class="col-sm-4">
                    <h3>Column 1</h3>
                    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit...</p>
                    <p>Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris...</p>
                </div>
                <div class="col-sm-4">
                    <h3>Column 2</h3>
                    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit...</p>
                    <p>Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris...</p>
                </div>
                <div class="col-sm-4">
                    <h3>Column 3</h3>
                    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit...</p>
                    <p>Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris...</p>
                </div>
            </div>
        </div>
    </body>
</html>

Użyłem dodatkowego css bootstrap extra do realizacji pośrednich motywów golden i twilight http://www.dariuszrorat.ugu.pl/assets/css/bootstrap/extra.css

Jak działa klasa Theme?

Wartości pory dnia są obliczane funkcją Theme::daytime() i są ustalane na wartości: Theme::DAY, THEME::GOLDEN, Theme::TWILIGHT i Theme::NIGHT. Fotograficzna niebieska i złota godzina są obliczane na bazie wschodu i zachodu słońca. Niebieska godzina jest obliczana przez funkcję date_sun_info. Złota godzina domyślnie zaczyna się o wschodzie słońca i kończy 60 min po nim albo zaczyna na 60 min przed zachodem słońca i kończy o zachodzie słońca.

Kiedy dziś wschodzi i zachodzi słońce?

Wartości w poniższej tabeli dotyczą współrzędnych geograficznych długość 21.0122 i szerokość 52.2297.

Zmienna Opis Wartość
sunrise wschód słońca 2026-05-28 04:23:39
sunset zachód słońca 2026-05-28 20:42:56
transit górowanie słońca 2026-05-28 12:33:18
civil_twilight_begin początek niebieskiej godziny rano 2026-05-28 03:37:39
civil_twilight_end koniec niebieskiej godziny wieczorem 2026-05-28 21:28:56

Kiedy jest dziś złota i niebieska godzina?

Dwa zegary

Przykładowe widoki z tymi motywami

Motyw light (obecnie załadowany)

Example Bootstrap Page

Some Bootstrap buttons:

Column 1

Lorem ipsum dolor sit amet, consectetur adipisicing elit...

Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris...

Column 2

Lorem ipsum dolor sit amet, consectetur adipisicing elit...

Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris...

Column 3

Lorem ipsum dolor sit amet, consectetur adipisicing elit...

Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris...


Motyw golden

Example Bootstrap Page

Some Bootstrap buttons:

Column 1

Lorem ipsum dolor sit amet, consectetur adipisicing elit...

Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris...

Column 2

Lorem ipsum dolor sit amet, consectetur adipisicing elit...

Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris...

Column 3

Lorem ipsum dolor sit amet, consectetur adipisicing elit...

Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris...


Motyw twilight

Example Bootstrap Page

Some Bootstrap buttons:

Column 1

Lorem ipsum dolor sit amet, consectetur adipisicing elit...

Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris...

Column 2

Lorem ipsum dolor sit amet, consectetur adipisicing elit...

Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris...

Column 3

Lorem ipsum dolor sit amet, consectetur adipisicing elit...

Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris...


Motyw dark

Example Bootstrap Page

Some Bootstrap buttons:

Column 1

Lorem ipsum dolor sit amet, consectetur adipisicing elit...

Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris...

Column 2

Lorem ipsum dolor sit amet, consectetur adipisicing elit...

Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris...

Column 3

Lorem ipsum dolor sit amet, consectetur adipisicing elit...

Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris...


4 stycznia 2025 71

Kategorie

programowanie

Dziękujemy!
()

Powiązane wpisy

Wizualizacja tematu Wyraenia regularne i ich obsuga w PHP oraz JavaScript
1 lutego 2025 5 min 19

Wyrażenia regularne i ich obsługa w PHP oraz JavaScript

php
Czytaj więcej
Zdjecie zwiazane z Klasa Promise w PHP i jej zastosowanie
5 lutego 2025 7 min 39

Klasa Promise w PHP i jej zastosowanie

php
Czytaj więcej
Obraz ilustrujacy Porwnanie dziedziczenia i kompozycji w PHP
13 lutego 2025 2 min 17

Porównanie dziedziczenia i kompozycji w PHP

php
Czytaj więcej
Wymiana doświadczeń

Masz podobne doświadczenia?

Chętnie poznam Twoją perspektywę i porozmawiam o tym temacie szerzej.

Napisz do mnie

Każda perspektywa może wnieść coś wartościowego do dyskusji.

Twoja prywatność i pliki cookies

  1. Ta strona internetowa wykorzystuje wyłącznie niezbędne pliki cookies, które są wymagane do jej prawidłowego działania – m.in. do poprawnego wyświetlania treści, zapamiętania podstawowych ustawień przeglądarki oraz zapewnienia stabilności serwisu.
  2. Nie stosuję plików cookies w celach marketingowych, reklamowych ani analitycznych.
  3. Strona ma charakter wyłącznie informacyjny i nie zawiera formularzy kontaktowych, rejestracyjnych ani zakupowych, przez które dane mogłyby być przesyłane na serwer.
  4. Nie zbieram danych osobowych podczas zwykłego korzystania z witryny.
  5. Serwis nie korzysta z certyfikatu SSL, jednak ze względu na informacyjny charakter strony nie jest wymagane przesyłanie poufnych danych. Zalecam jednak, aby nigdy nie wpisywać haseł ani danych osobowych na stronach bez szyfrowanego połączenia.
  6. Korzystając z tej strony, wyrażasz zgodę na używanie wyłącznie niezbędnych plików cookies.

Więcej informacji znajdziesz w mojej polityce prywatności.