Prosty skrypt galerii zdjęć z efektem Highslide

Data aktualizacji: 22.04.2024r. Autor: Bartosz Stefanicki.

Prosty skrypt galerii zdjęć z efektem Highslide

Posiadasz wiele fotografii które chciałbyś zaprezentować, lecz nie masz czasu na wykonanie skryptu, który by to wszystko obsługiwał?

Poniżej zobaczysz, jak stworzyć prosty silnik galerii zdjęć przy wykorzystaniu technologii Ajax do ich efektywnej prezentacji. Skrypt Highslide którego użyjemy do stworzenia galerii, to podobnie jak Lightbox, Litebox, Thickbox, GreyBox etc. - ostatnio popularny efekt prezentacji zdjęć. Polega na przyciemnieniu ekranu oraz płynnym rozwinięciu ramki ze zdjęciem podczas powiększenia.

Na itporady.pl dostępna jest także nowsza wersja skryptu.

1. Struktura plików i katalogów

Galeria składać się będzie z następujących folderów i dokumentów.

  • css/ - katalog z arkuszem stylów
  • javascript/ - katalog ze skryptem Highslide
  • obrazki/ - katalog z dużymi obrazkami
  • miniaturki/ - katalog z miniaturkami
  • index.php - skrypt galerii

2. Silnik galerii w PHP

Pierwszy etap to stworzenie pliku głównego index.php, który będzie napędzać naszą galerię zdjęć. Poniżej jego zawartość.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl">
<head>
  <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
  <script type="text/javascript" src="javascript/highslide-with-gallery.js"></script>
  <link rel="stylesheet" href="css/style.css" type="text/css" media="screen" />

  <script type="text/javascript">
    hs.graphicsDir = 'javascript/images/';
    hs.align = 'center';
    hs.transitions = ['expand', 'crossfade'];
    hs.outlineType = 'rounded-white';
    hs.fadeInOut = true;
    //hs.dimmingOpacity = 0.75;

    // Add the controlbar
    if (hs.addSlideshow) hs.addSlideshow({
    //slideshowGroup: 'group1',
      interval: 5000,
      repeat: false,
      useControls: true,
      fixedControls: 'fit',
      overlayOptions: {
        opacity: .75,
        position: 'bottom center',
        hideOnMouseOut: true
      }
    });
</script>
</head>
<body>
  • hs.graphicsDir = 'javascript/images/' - adres do katalogu z obrazkami,
  • hs.align = 'center' - wyrównanie dużego obrazka,
  • hs.transitions = ['expand', 'crossfade'] - efekt przejścia między obrazkami,
  • hs.outlineType = 'rounded-white' - obramowanie zdjęć,
  • hs.fadeInOut = true - przezroczystość podczas powiększania,
  • //hs.dimmingOpacity = 0.75 - przyciemnienie ekranu podczas oglądania zdjęć (domyślnie nieaktywne),
  • interval: 5000 - czas pomiędzy slajdami w pokazie zdjęć,
  • repeat: false - powtarzanie pokazu (domyślnie nieaktywne),
  • useControls: true - pasek kontrolny z przyciskami (domyślnie aktywne),
  • fixedControls: 'fit' - pozycja kontrolek,
  • opacity: .75 - przezroczystość paska kontrolnego,
  • position: 'bottom center' - pozycja paska kontrolnego (na dole, wyśrodkowany),
  • hideOnMouseOut: true - ukrywanie paska gdy myszka jest ustawiona poza ramką ze zdjęciem (domyślnie aktywne),
<div id="galeria">
<ul><?php
$katalog = "obrazki";
$katalogminiaturki = "miniaturki";
$galeria = opendir( $katalog );

Rozpoczynamy tworzenie silnika galerii, którą obejmujemy znacznikiem DIV "galeria". Zmiennna $katalog zawiera nic innego, jak nazwę katalogu z obrazkami, $katalogminiaturki analogicznie zawiera nazwę katalogu z miniaturkami. Odczyt listy katalogów i plików ze wskazanej lokalizacji umożliwia nam funkcja opendir() - tę wartość przypisujemy zmiennej $galeria.

while ( $zdjecie = readdir( $galeria ) ){
$odczyt = pathinfo( $katalog.'/'.$zdjecie );
  if ( $odczyt['extension']  == 'jpg' ){

Otwieramy pętlę, w której zmiennej $zdjecie przypisujemy ścieżki do plików z katalogu "obrazki". Następnie dzięki funkcji pathinfo() otrzymujemy tablicę zawierającą informacje o wskazanych ścieżkach tj. nazwę katalogu, nazwę pliku i rozszerzenie. Nam potrzebna będzie trzecia wartość czyli rozszerzenie, dla której robimy warunek - jeżeli jest to format ".jpg" to przechodzimy do generowania galerii zdjęć.

echo '<li><a href="'.$katalog.'/'.$zdjecie.'" class="highslide" onclick="return hs.expand(this)" title="Zdjęcie: '.$zdjecie.'"><img width="200" height="133" src="'.$katalogminiaturki.'/'.$zdjecie.'" alt="Zdjęcie: '.$zdjecie.'" /></a></li>';
  }
}
closedir($galeria);
?>
</ul>
</div>

</body>
</html>

2.1. Sortowanie zdjęć według nazwy

Powyższy kod nie zawiera funkcji, która sortowałaby zdjęcia według nazwy pliku. Na prośbę użytkowników napisałem kod, który zmienia postać rzeczy. Funkcja sort() układa rosnąco, natomiast rsort() malejąco.

<div id="galeria">
<ul>
<?php
$katalog = "obrazki";
$katalogminiaturki = "miniaturki";
$pliki = glob($katalog.'/*.jpg');

//lista plików trafia do tablicy
$i=0;
foreach($pliki as $key => $value){
        $tab[$i] = $value;
        $i++;
}
sort($tab);

//wyświetlenie listy zgodnie z datą
for($nr = 0; $nr < $i; $nr++){
   print '<li><a href="'.$tab[$nr].'" class="highslide" onclick="return hs.expand(this)" rel="nofollow"><img width="200" height="133" src="'.str_replace($katalog, $katalogminiaturki, $tab[$nr]).'" /></a></li>';
}
?>
</ul>
</div>

3. JavaScript

Archiwum ze skryptem Highslide dostępne jest na stronie autorów, highslide.com/download.php. Nas interesuje plik highslide-with-gallery.js wraz z katalogiem images/.

4. Arkusz stylów CSS

Drugi etap to stworzenie pliku style.css, który będzie zawierać style dla naszej galerii zdjęć - umieszczamy go w katalogu css/. Poniżej jego zawartość.

#galeria {
        width: 700px;
        margin: 50px auto 0 auto;
        color: #555;
        font: 12px Arial, Verdana;
}

#galeria ul li {
        display: inline;
        margin:0 10px 10px 0;
}

#galeria img {
        border: 1px solid #bbb;
        padding: 1px;
}

/* AJAX */
.highslide-container div {
        font-family: Verdana, Helvetica;
        font-size: 10pt;
}
.highslide {
        outline: none;
        text-decoration: none;
}
.highslide img {
        border: 2px solid silver;
}
.highslide:hover img {
        border-color: gray;
}

.highslide-active-anchor img, .highslide-active-anchor:hover img {
        border-color: black;
}
.highslide-image {
        border-width: 2px;
        border-style: solid;
        border-color: white;
        background: gray;
}
.highslide-wrapper, .rounded-white {
        background: white;
}
.highslide-image-blur {
}
.highslide-caption {
        display: none;
        border-top: none;
        font-size: 1em;
        padding: 5px;
        background: white;
}
.highslide-heading {
        display: none;
        font-weight: bold;
        margin-bottom: 0.4em;
}
.highslide-dimming {
        position: absolute;
        background: black;
}
.highslide-loading {
        display: block;
        color: black;
        font-size: 9px;
        font-weight: bold;
        text-transform: uppercase;
        text-decoration: none;
        padding: 3px;
        border: 1px solid white;
        background-color: white;
        padding-left: 22px;
        background-image: url(../javascript/images/loader.white.gif);
        background-repeat: no-repeat;
        background-position: 3px 1px;
}
a.highslide-credits,
a.highslide-credits i {
        padding: 2px;
        color: silver;
        text-decoration: none;
        font-size: 10px;
}
a.highslide-credits:hover,
a.highslide-credits:hover i {
        color: white;
        background-color: gray;
}

/* Controls. See http://www.google.com/search?q=css+sprites */
.highslide-controls {
        width: 195px;
        height: 40px;
        background: url(../javascript/images/controlbar-white.gif) 0 -90px no-repeat;
        margin-right: 15px;
        margin-bottom: 10px;
        margin-top: 20px;
}
.highslide-controls ul {
        position: relative;
        left: 15px;
        height: 40px;
        list-style: none;
        margin: 0;
        padding: 0;
        background: url(../javascript/images/controlbar-white.gif) right -90px no-repeat;
}
.highslide-controls li {
        float: left;
        padding: 5px 0;
}
.highslide-controls a {
        background-image: url(../javascript/images/controlbar-white.gif);
        display: block;
        float: left;
        height: 30px;
        width: 30px;
        outline: none;
}
.highslide-controls a.disabled {
        cursor: default;
}
.highslide-controls a span {
        /* hide the text for these graphic buttons */
        display: none;
}
.highslide-move a {
        cursor: move;
}

/* The CSS sprites for the controlbar */
.highslide-controls .highslide-previous a {
        background-position: 0 0;
}
.highslide-controls .highslide-previous a:hover {
        background-position: 0 -30px;
}
.highslide-controls .highslide-previous a.disabled {
        background-position: 0 -60px !important;
}
.highslide-controls .highslide-play a {
        background-position: -30px 0;
}
.highslide-controls .highslide-play a:hover {
        background-position: -30px -30px;
}
.highslide-controls .highslide-play a.disabled {
        background-position: -30px -60px !important;
}
.highslide-controls .highslide-pause a {
        background-position: -60px 0;
}
.highslide-controls .highslide-pause a:hover {
        background-position: -60px -30px;
}
.highslide-controls .highslide-next a {
        background-position: -90px 0;
}
.highslide-controls .highslide-next a:hover {
        background-position: -90px -30px;
}
.highslide-controls .highslide-next a.disabled {
        background-position: -90px -60px !important;
}
.highslide-controls .highslide-move a {
        background-position: -120px 0;
}
.highslide-controls .highslide-move a:hover {
        background-position: -120px -30px;
}
.highslide-controls .highslide-full-expand a {
        background-position: -150px 0;
}
.highslide-controls .highslide-full-expand a:hover {
        background-position: -150px -30px;
}
.highslide-controls .highslide-full-expand a.disabled {
        background-position: -150px -60px !important;
}
.highslide-controls .highslide-close a {
        background-position: -180px 0;
}
.highslide-controls .highslide-close a:hover {
        background-position: -180px -30px;
}

Style umieszczone po komentarzu "AJAX" należą do skryptu Highslide, przed nim znajdziemy opcjonalne style galerii tj. obramowanie zdjęć, marginesy i szerokość strony.

Kategorie: HTML + CSS, PHP + MySQL. Tagi: #ajax, #css, #html, #php, #skrypty. Źródło obrazków: Pixabay, Font awesome.

Zobacz także

243 komentarzy

Kamil
23.07.2015, 09:40
Bardzo fajny skrypcik, w łatwy sposób udało mi się go wklepać w grafikę mojej strony, można zobaczyć na http://www.djlama.pl/galeria.php . Dobra robota, dziękuję w imieniu wszystkich którzy korzystają z zadowoleniem!
adrian
27.01.2016, 12:06
pokazuje mi się jedno okienko bez zdjęcia i obok "'; } } closedir($galeria); ?&gt;".
kaśka
10.07.2015, 23:00
Witam, super skrypt!! a czy dałoby radę zrobić galerię w wersji responsywnej?
Bartosz Stefanicki
31.07.2015, 00:43
Autor
Dostosowanie galerii zależy juz od Ciebie, moze pokaże sie taka na łamach Itporady.pl :)
Adam
14.12.2017, 12:26
Taka galeria byłaby świetna.
Demon
03.05.2015, 00:10
Nie działa :c po kliknięciu na miniature pisze loading... i tyle :c
Bartosz Stefanicki
05.05.2015, 00:47
Autor
A na innym serwerze?
Arek
10.02.2015, 05:23
Tworzę stronę na której chciałbym umieścić ten skrypt. Czy do swojej prywatnej strony mogę go prawnie wykorzystać? Jak to jest ze stroną dajmy na to jakiejś firmy? Czy trzeba wykupić jakieś prawa do korzystania z tego skryptu?
Bartosz Stefanicki
10.02.2015, 13:07
Autor
Mozesz wykorzystać skrypt na stronie firmowej albo prywatnej. Nie trzeba płacić, wklejasz i korzystasz. Odnośnie linku zwrotnego do itporady - jeśli chcesz, mozna wstawić, ale nie ma konieczności.
ANDRZEJ
29.10.2014, 17:55
Proszę jak wyżej o ten kawałek kodu , żeby wyświetlić nazwę zdjęcia na miniaturkach.Nie wiem jak to zrobić. Dziękuje za szybka reakcję
Michał
29.09.2014, 18:32
chcę wykorzystać tą galerię do szablonu na allegro. Co muszę zrobić oprócz takiej zmiany [code]&lt; &gt;[/code] mam wszystkie pliki i foldery na serwerze ale nie wiem jak podpiąć galerię do szablonu. Gdy dam szablon na serwer i nazwę index.html to wszystko super działa, ale poza już nie...
tomasz
28.05.2014, 12:21
Panowie a dlaczego wyswietlają mi sie takie znaki "ďťż " a jak sprawdze skad to się bierze to jest cos takiego napisane "Failed to load resource: the server responded with a status of 404 (Not Found)". Proszę o pomoc.
Rufi
06.04.2014, 23:31
Wielkie dzięki za pomoc - ja jako kompletna noga w tworzeniu czegokolwiek - udało mi się stworzyć galerie i zajęło mi to tylko 2 godzimy , wpisując ją w stronę.
Bartosz Stefanicki
07.04.2014, 00:11
Autor
Cieszę się, zachęcam do przeglądu reszty skryptów :)
Karolina
14.11.2013, 14:01
Cześć mam pytanie, zrobiłam tak jak po kolei kazałeś. Wszystko mi pięknie wyszło, ale jak zmodyfikować skrypt, żeby obrazki występowały w ciągu po sobie (poziomo) a nie w rzędach ???
Bartosz Stefanicki
17.11.2013, 19:50
Autor
Możesz zmniejszyć szerokość bloku galerii zdjeć za pomocą CSS ( weight ).
Tomasz
03.11.2013, 11:13
witam. W moim przypadku niektóre zdjęcia nie pokazują się na stronie np. wrzucam do katalogu zdjecia i miniaturki po 5 zdjec a na stronie wyswietlają mi sie tylko 3 pierwsze. Co moze byc ctego przyczyną?
Paweł
09.08.2013, 11:17
Witam, mam pytanie odnośnie galerii. Korzystam z szablonu www i mam problem żeby na stronie wyświetliła się galeria w moim szablonie a nie jako zwykła biała strona jak to zrobić ?
Bartosz Stefanicki
11.08.2013, 21:57
Autor
Masz plik z rozszerzeniem .php ?
Tomasz
24.05.2013, 09:50
Witam chciałbym zapytać jak dodać w oknie wyświetlonego obrazu odnośnik, np żeby zdjęcie prezentowało jakąś realizacje strony internetowej i był link właśnie do tej strony. Byłbym wdzięczny za rozwiązanie mojego problemu
wojteke
20.04.2013, 11:02
witam, ja mam taki problem że po kliknięciu na zdjęcie pojawia się napis loading ... i tak cały czas się to kółeczko obraca ale zdjęć nie wczytuje? W czym może być problem?
Bartosz Stefanicki
22.04.2013, 11:06
Autor
Witaj, lokalizacja obrazków jest w porządku (przynajmniej tych dużych), sprawdź czy wgrane są wszystkie pliki skryptu Highslide.
Marcin
17.04.2013, 03:19
Zacząłem tetować i bradzo mi się spodobał zwłaszcza, że miniaturki i duże zdjęcia są pobierane z plików. Jednak gdy chciałem dostosować do swoich potrzeb już było gorzej.I tu mam 2 problemy.1 Nie wiem czym w css steruje się pozycją wyświetlanych miniaturek. Próbowałem edytować kilka styli ale opcja padding nie dała rezyltatu. Natomiast problem 2 to co trzeba zmienić by miniaturki zachowywały proporcje czy chociaż samą wysokość bo nie bardzo chciał przycinać niektóre zdjęcia a jeśli tego się nie zrobi to miniaturki się zniekształcają.
Bartosz Stefanicki
19.04.2013, 15:03
Autor
[code lang="css"]#galeria ul li{ display: inline; margin:0 10px 10px 0; } #galeria img{ border: 1px solid #bbb; padding: 1px; } [/code] Fragment z wykazem (ul li) , zawiera odstępy między obrazkami. Natomiast we fragmencie z obrazkiem (img) , możesz zdefiniować szerokość i wysokość miniaturek. PS. Zobacz tez drugą wersję galerii: http://itporady.pl/html-css/prosty-skrypt-galerii-zdjec-z-efektem-highslide-wersja-2/
Jarek
20.01.2013, 18:37
jak zrobić podstrony bo zdjęć mam już 50 i się ciężko przeglada ??
Bartosz Stefanicki
26.01.2013, 23:45
Autor
@Jarek, Podział na strony będzie w następnej wersji galerii :-)
Jarek
27.01.2013, 15:18
super :) A kiedy możemy się spodziewać następnej wersji :)
Bartosz Stefanicki
27.01.2013, 16:21
Autor
@Jarek, Myślę, że w ciągu 2 tygodni.
Damian
11.01.2013, 13:52
Cześć Bartku. Głowie się nad wspomnianym już wyżej dodawaniem podpisu pod obrazkiem. Mam problem z wyciągnięciem nazwy pliku. Jeśli zostało Ci trochę cierpliwości to proszę o pomoc :) Pozdrawiam
M.
16.01.2013, 07:04
przyłączam się do prośby :)
Bartosz Stefanicki
26.01.2013, 23:45
Autor
@Damian, W $tab[$nr] znajduje się nazwa pliku, wyciągnij ją i wywołaj za pomocą np. funkcji print.
M.
26.11.2012, 18:04
Witam, czy można powiększyć liczbę kolumn? bo nie widzę tego nigdzie w kodzie? Albo jakieś podstrony, bo ja mam dość dużo obrazków. Najlepiej żeby zmienić te trzy kolumny na np pięć. I jak wydobyć z kodu galerii te podpisy pod zdjęciem?
noe
22.12.2012, 18:14
mam ten sam problem - 3 kolumny to ciut za mało, potrzebowałbym 5, tylko nie bardzo wiem gdzie to zmienic... łaze po tym kodzie w te i z powrotem i kicha btw. swietna galeria - wyglada i dziala znakomicie - wlasnie tego potrzebowalem ;)
noe
22.12.2012, 18:18
dobra, juz nie wazne ;) wystarczy wejsc w styl.css i w #galeria zmienic 'width' na większy, np 900px ;) (przy 900 są 4 kolumny)
M.
16.01.2013, 07:05
Ja dałam 1100px i mam 5 kolumn ;)
Bartosz Stefanicki
26.01.2013, 23:43
Autor
@M. Pewnie. Za pomocą CSS możesz zmienić szerokość galerii, parametr <tt>width</tt>.
Andrzej
16.11.2012, 12:07
Chcialbym wykorzystać, ale musiałbym mieć też opisy zdjęć. Da się to zrobić?
Bartosz Stefanicki
26.01.2013, 23:42
Autor
@Andrzej, Możesz wykorzystać tablice w PHP i do każdego pliku przypisać opis, albo bazy danych.
Jarek
12.11.2012, 00:03
Witam Nie doczytałem się, żeby ktoś pytał o zmianę koloru tła na czarny. Bardzo proszę o instrukcję. W html, wiedziałem jak to zrobić, ale w "php" niestety nie wiem. Z góry dziękuję za pomoc.
Bartosz Stefanicki
05.01.2013, 15:42
Autor
@Jarek, Kolor tła możesz zmienić w CSS.
Paweł
01.10.2012, 21:01
Cześć, Nie wiem dlaczego ale ściągnąłem ten szablon, odpalam go na wirtualnym serwerze i wyskakuje mi tylko okienko; brak zdjęć i z boku napis: } } closedir($galeria); ?&gt; Co jest tego przyczyną?
Bartosz Stefanicki
19.10.2012, 16:24
Autor
@Paweł, Pewnie to wina wirtualnego serwera, czy na pewno obsługuje PHP? Spróbuj ten kod wstawić na zwykły hosting.