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

omel
28.09.2022, 18:11
U mnie chyba nie zadziałało. Rzucam branżę internetową:D
Piotr
12.12.2021, 21:44
A czy nie można by było wszystko zrobić we wtyczke w wp?
DJ na wesele Śląsk i Kraków
27.02.2019, 23:13
Dzięki świetny skrypt. Na pewno wykorzystam
Marek
13.04.2017, 10:00
Witam, od kilku dni próbuję testować i zainstalować skrypt i klęska. Na moim domowym localhost działa IDEALNIE! Natomiast w hostingach zewnętrznych - 3 firmy - , dzieją się dziwne rzeczy. I na wszystkich identyczne. Po pierwsze, zdjęcia układają się w pionie po 2 w rzędzie i pasek nawigacyjny na dole dużego zdjęcia dzieli się na trzy poziome. Już mnie głowa boli, ale nie mogę tego zrozumieć.
Bartosz Stefanicki
13.04.2017, 21:11
Autor
Mi też nie przychodzi nic do głowy. Może wersja PHP?
Krzysiek
17.03.2017, 22:16
Witam mam pytanie ponieważ jestem kompletnym laikiem. Pobrałem paczkę i teraz problem, mam stronę w htmlu więc rozumiem że musiałem zrobić plik galeria.php aby mi to śmigało tak więc zrobiłem. Wszystko śmiga pięknie tylko że są podstawione pańskie zdjęcia w którym pliku mogę je zmienić na swoje? Pozdriawiam
Bartosz Stefanicki
06.04.2017, 02:38
Autor
Tam jest katalog w którym znajdują się obrazki
bongo
26.01.2017, 13:22
jak dodać krótki opis pod zdjęciem ?
Pawel
18.08.2016, 17:41
Witam jest mozliwosc aby slideshow wyswietlal obrazki fullscreen lub jakos poprostu dobrac sie do ich rozmiaru I miec na niego wplyw? Z gory dziekuje za odpowiedz I przepraszam za brak polskich znakow GB keyboard. Pozdrawiam
Piotr
17.03.2016, 21:33
Witam, Jak dla mnie brakuje funkcji automatycznie tworzącej miniaturę ze zdjęcia w katalogu /obrazki/. Mógłby Pan objaśnić jak to zrobić ?
Bartosz Stefanicki
18.03.2016, 00:34
Autor
Jeśli będzie zainteresowanie to może pojawić się kolejna wersja galerii ;) Poszukaj jak to zrobić w PHP.
Karol
11.03.2016, 02:39
Witam. Mam problem z sortowaniem zdjęć naturalnie. Korzystałem z punktu 2.1 jednak nie przynosi to rezultatów. Ciągle mi sortuje 1, 10, 11,12...,19, 2, 20,21...itd. Próbowałem zmienić sort($tab); na natcasesort($tab); i milion innych sposobów łącznie z innymi pętlami. Przeczytałem wcześniejsze komentarze, niektórzy również pisali o tym problemie jednak punkt porad 2.1 im pomagał. W czym jeszcze może tkwić problem?
Karol
18.03.2016, 19:26
Jakby ktoś miał problem jak ja powyżej wklejam tu rozwiązanie: [code lang="php"]$wartosc){ echo '&lt;img width=&quot;200&quot; height=&quot;133&quot; src=&quot;'.$wartosc.'&quot; alt=&quot;&quot; '; } ?&gt;[/code]
Karol
19.03.2016, 10:50
$wartosc) { echo '<a href="'.$wartosc.'" rel="nofollow">&lt;img width=&quot;200&quot; height=&quot;133&quot; src=&quot;&#039;.$wartosc.&#039;&quot; alt=&quot;&quot; </a>'; } ?&gt; ------------------------------------------------------------------------------------------------------------------------------------------------ Nie mogłem tego wkleić więc napisałem ręcznie. Nie używam folderu "miniaturki" moim zdaniem nic on nie wnosi. Zdjęcia minimalizujemy poprzez " img width="200" height="133" " .
Karol
19.03.2016, 10:55
Ciągle blokuje mój kod, gdy go chcę umieścic w komentarzu. Proszę o usunięcie bezwartościowych komentarzy.
Adrian
07.03.2016, 15:47
Witam, chciałbym aby galeria ukazywała zdjęcia w kolejności mam nazwane foty numerycznie od 1 do 80 ale w galerii mają one losową kolejność, jak to naprawić ?
Bartosz Stefanicki
07.03.2016, 18:16
Autor
Skorzystałeś z punktu porady: #2.1. Sortowanie zdjęć według nazwy ?
Adrian
08.03.2016, 10:40
próbuję jednak nie wiek w którym dokładnie miejscu wkleić ten kod
Adrian
08.03.2016, 10:52
okej wyszło na to że popełniłem błąd nowicjusza :D skopiowałem bez zamknięcia klamry :D
Bartosz Stefanicki
08.03.2016, 23:41
Autor
Wazne, ze sie udało ;)
Aneta
11.02.2016, 09:49
Witam, jak usunąć białą ramkę przy dużym zdjęciu?
Bartosz Stefanicki
11.02.2016, 22:57
Autor
Poniżej ustalisz obramowanie obrazków. "Białe obramowanie" to padding - poszukaj w CSS. [code lang="css"].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; }[/code]
Karolina
11.01.2016, 12:24
Witam, może to banalne pytanie, ale jestem początkująca... gdzie i co umieścić na stronie w kodach, aby mi się w ogóle wyświetlała ta galeria? Ściągnęłam całość do mojego folderu ze stroną www i teraz jak otwieram swój index.html chciałabym gdzieś w tych kodach coś wpisać aby mi się galeria pokazywała? Gdzie to mogę uczynić?
Bartosz Stefanicki
11.01.2016, 20:04
Autor
Najłatwiej pobrać skrypt, link jest powyżej. Następnie dodać swoje treści do tych moich plików. Próbować, próbować, próbować.
Tomasz
21.12.2015, 13:39
Czy - mogę poprosić na maila przykład - niestety słabo znam css Dziękuje
Tomasz
21.12.2015, 14:02
OK - już sobie poradziłem - tylko teraz powstał następny problem - miniaturki nie są równo poukładane - czy można miniaturki tak posortować aby były równo - np pierw wszystkie w pionie później w poziomie ?
Tomasz
21.12.2015, 13:02
Witam - gdzie zmienia się parametr w css aby zdjęcia pionowe w miniaturkach wyświetlały się poprawnie - teraz zdj poziome wyświetlane sa OK natomiast pionowe rozciągnięte Dzieki
Bartosz Stefanicki
21.12.2015, 13:19
Autor
Proponuję w kodzie HTML img objąć w div. Div dać szerokość, a img tylko wysokość. Obecnie img ma i wysokość i szerokość dlatego pionowe sa dostosowywane do sztywnych wymiarów.
Daniel
02.10.2015, 14:40
Warning: sort() expects parameter 1 to be array, null given in podczas sortowania. :/
Tape
26.09.2015, 01:05
Jest opcja ustawienia tak aby highslide domyślnie się uruchamiało w miniaturce z innych zdjęć (tak aby każda miniatura była sliderem 4-6 zdjęć a po powiększeniu wyświetlało się inne statyczne, czy lepiej użyć gifa?).
Łukasz
30.08.2015, 10:37
Witam a jak zrobić żeby były również wyświetlane zdjęcia pionowe?
Bartosz Stefanicki
31.08.2015, 16:55
Autor
To jest zależne od tego jak ustawisz szerokość / wysokość wyświetlanych obrazków w CSS.
SalyWan
28.08.2015, 21:24
Ja mam taki sam błąd jak kolega Łukasz. Nie mogę jednak go naprawić. Mianowicie chodzi pokazuje mi się jedno okienko bez zdjęcia i obok "'; } } closedir($galeria); ?&gt;".
Bartosz Stefanicki
28.08.2015, 23:42
Autor
Czy Twój serwer obsługuje PHP?
Marta
21.08.2015, 14:13
hej a w jaki sposób mozna zmienić ilość zdjęć miniaturek? wyswietla mi 15 zdjec podczas gdy w katalogu mam 50
Bartosz Stefanicki
23.08.2015, 00:38
Autor
W tym skrypcie nie widzę ograniczenia co do wyświetlania zdjęć.
Łukasz
31.07.2015, 00:10
Siemka, wrzuciłem całą paczkę plików którą od Ciebie pobrałem, ale u mnie niestety wyestepuje błąd i nie mogę go zdiagnozować. Mozesz pomóc ;)?
Bartosz Stefanicki
31.07.2015, 00:42
Autor
Jaki błąd sie pojawia?
Łukasz
31.07.2015, 01:05
Już sobie poradziłem, ale ostatnia linijka fotek jest lekko przesunięta w lewo, jakoś uda sięto naprawić?