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

marcin
28.09.2012, 13:35
A czy dało by radę dopisać fragment kodu do generowania podpisów pod zdjęciami którymi byłyby nazwy plików?
Bartosz Stefanicki
19.10.2012, 16:22
Autor
@Marcin, Wystarczy to wydobyć z kodu galerii. Trochę praktyki. :)
Krzysztof
14.09.2012, 22:41
Panowie, jestem jeszcze troche "zielony" w tym temacie Moglibyście mi podpowiedziec, co musze zrobić, by wstawic tą "galerie"- a konkretnie co w który plik
Emilia
14.09.2012, 19:12
a pytanie trochę z innej beczki - jak zablokować możliwość kopiowania zdjęć z galerii?
Bartosz Stefanicki
26.01.2013, 23:40
Autor
@Emilia, http://www.kurshtml.edu.pl/skrypty/blokada.html. Tu znajdziesz informacje na ten temat.
Kamil
12.09.2012, 20:36
Skrypt na prawdę fajny, ale niestety nie przyda mi się, jeśli nie można podzielić galerii na albumy. Da się to jakoś zrobić za pomocą tego skryptu? Nie umiem programować i z tego względu proszę o poprawkę.
Bartosz Stefanicki
19.09.2012, 17:59
Autor
@Kamil, Stwórz osobne katalogi, następnie osobne pliki z galerią do poszczególnych katalogów i po sprawie.
scooter
04.09.2012, 13:20
A jak zrobić taki bajer, żeby na zdjęciu albo poniżej wyświetlała się nazwa pliku ??
Bartosz Stefanicki
19.09.2012, 17:58
Autor
@Scooter, W $tab[$nr] znajduje się nazwa pliku, wyciągnij ją i wywołaj za pomocą np. funkcji print.
anon
30.08.2012, 17:15
to lipa jak nie robi sam miniatu, a jak zrobic paginacje 50zdjec na jednej stronie kolejne 50 na drugiej itd ?
Piotr
07.09.2012, 19:48
@anon Ja zrobiłem tak, że sam robi miniatury, potrzebujesz wtedy 1 katalogu ;)
Vlodek
29.08.2012, 00:02
Bardzo ciekawy skrypt, napewno się przyda. Dzięki!
anon
27.08.2012, 14:04
I jeszcze pytanie, jak zrobic by miniaturki nie byly kwadratowe tylko dopasowywaly sie do obrazka?
anon
27.08.2012, 14:02
Witam sciagnalem gotowa galerie wszystko wgralem, usunalem te zdjecie co tam byly duze i te miniaturki i wgralem swoje duze zdjecia ale po wejsciu na galerie nie wyswietlaja sie miniaturki jak zrobic by z moich zdjec stworzyl miniaturki ?? i drugie pytanie, jak zrobic paginacje np zeby na stronie pokazywalo sie tylko 50zdjec kolejne 50 na nastepnej stronie ? Dziekuje za pomoc
Bartosz Stefanicki
29.08.2012, 15:22
Autor
@Anon, Skrypt nie tworzy sam miniaturek, należy je samodzielnie utworzyć. Polecam program : http://itporady.pl/programy/hurtowe-zmniejszanie-zdjec-vso-image-resizer/.
Artur
24.08.2012, 14:08
Galeria działa wyśmienicie. Nurtuje mnie jednaj jej długość po dodaniu 65 obrazków. Jak to podzielić na podstrony?
Bartosz Stefanicki
26.01.2013, 23:33
Autor
@Artur, Podział na strony będzie w następnej wersji galerii :-)
Mariusz
22.08.2012, 15:31
mam pytanie. po wrzuceniu galerii na stronę porobiły mi się znaki zapytania przy polskich ogonkach. co mam zmienic w kodzie aby bylo wszystko wporzadku ?
Bartosz Stefanicki
23.08.2012, 13:33
Autor
@Mariusz, Ustaw kodowanie pliku na UTF-8 /lub/ iso8859-2 i takie samo w meta-tagach strony.
patryk
13.08.2012, 12:13
Super skrypt, mam tylko pytanie... Czy jest możliwość zablokowania przejścia do następnego katalogu przy przeglądaniu zdjęć w powiększeniu? Zrobiłem tą galerię na 3 różne foldery w osobne zakładki w phpie. Jak pisałem wyżej, wyświetlanie jest okej, czyli każdy folder osobno (niestety musi być wzrastająca liczba obrazków w następnych folderach lub taka sama ilość), a przy powiększeniu i przeskakiwaniu zdjęciami dalej, skrypt przechodzi do następnego folderu.
Bartosz Stefanicki
21.08.2012, 13:13
Autor
@Patryk, Highslide wyświetla wszystkie obrazki, które mu podasz w kodzie HTML - tam musisz to ograniczyć.
Patryk
28.08.2012, 18:22
Czyli jak mam wszystko w phpie w jednym pliku to nie można tego rozgraniczyć? Możesz powiedzieć o co Ci chodziło z kodem? próbowałem już przerabiać skrypt (część html/php) na różne sposoby i zawsze przeskakuje do następnego folderu wyświetlając zdjęcia.
Mateusz
10.08.2012, 14:58
Dlaczego w wierszu 9 wyskakuje mi brak definicji hs
Bartosz Stefanicki
26.01.2013, 23:30
Autor
@Mateusz, Który plik masz na myśli? Gdzie pojawia się błąd?
Damian
09.08.2012, 10:54
dobra dobra, ogarnąłem :D nie śmiece już..
Damian
09.08.2012, 10:16
Skrobnie ktoś sortowanie po nazwie jpgów?
Piotr
04.08.2012, 18:41
Witam. To ponownie ja. Tylko, że teraz chcę się czegoś innego dowiedzieć. Chciałbym, aby w galerii wyświetlało mi tylko strzałki do przełączania się pomiędzy fotkami bez dodatkowych ikonek, czy da radę takie coś zrobić?
Bartosz Stefanicki
06.08.2012, 11:18
Autor
Informacje dotyczące skryptu Highslide znajdziesz na stronie http://highslide.com/
Piotr
09.08.2012, 21:41
Witam. Przeczytałem porady i troszkę poprawiłem wygląd, ale... W komentarzach znajdował się skrypt z sortowaniem obrazków po dacie dodania, a teraz już go nie ma, a mój niestety znikł po błędzie na serwerze :/ Proszę o jeszcze az wstawienie skryptu na sortowanie fotek od najnowszej, do najstarszej. Z góry dzięki ;)
Bartosz Stefanicki
21.08.2012, 13:15
Autor
@Piotr, Wszystkie komentarze są dalej dostępne. Kliknij na dole strony link "<< Starsze komentarze".
Pieciek
30.07.2012, 14:31
hs.graphicsDir = 'javascript/images/' - adres do katalogu z obrazkami nieścisłość - obrazkami ale do obsługi skryptu :) strzałeczki, ramki, krzyżyki, itp. a nie do NASZYCH obrazków.
Piotr
18.07.2012, 19:57
Witam. W kodzie występuje taka opcja: fixedControls: 'fit' - pozycja kontrolek A co zamiast słowa fit może się jeszcze znajdować?
Bartosz Stefanicki
06.08.2012, 11:09
Autor
fixedControls (one of 'fit', true or false) When this is true, Highslide aligns subsequent slides so that the controls are in the same position for the next image. This means the user can browse through the images using the "Next" button without moving the mouse. If fixedControls is set to 'fit', Highslide fixes the controls when possible, but ensures that the popup stays within the viewport.
Urt
06.07.2012, 02:18
Mój problem jest dość dziwny.. Otóż wszystko działa z pańskimi przykładkowymi zdjęciami.. w momencie kiedy w folderze "obrazki" i "miniaturki" tworze podfolder ze zdjęciami ( zeby miec wszystko uporzadkowane - kilka galerii w roznych miejscach na stronie ) to na stronie galeria nie funkcjonuje ( tak jakby jej w ogole nie bylo ), ale jeśli spowrotem zmienie sciezkę na pierwotną ( z pańskimi zdjęciami ) wszystko działa.. moje pytanie.. o co chodzi? :) Przykład: Tu jest wszystko okej: &lt;?php $katalog = &quot;obrazki&quot;; $katalogminiaturki = &quot;miniaturki&quot;; $galeria = opendir( $katalog ) Tu się sypie: &lt;?php $katalog = &quot;obrazki/1&quot;; $katalogminiaturki = &quot;miniaturki/1&quot;; $galeria = opendir( $katalog )
Bartosz Stefanicki
21.08.2012, 13:16
Autor
@Urt, Skrypt nie pobiera obrazków z podfolderów. Wszystko musi być w jednym miejscu, aby zostało wyświetlone poprawnie.
Łukasz
27.06.2012, 08:54
Witam Takim kodem wyświetlam swoją galerię, mógłbyś podpowiedzieć jak podpiąć highslide [code lang="html"]&lt;? &lt;a href=&quot;#gal&quot; onclick=&quot;show(&#039;');" rel="lightbox[roadtrip]" style="cursor:pointer;"&gt;&lt;img src=&quot;./img/product/80x60/" alt=""&gt;</a> &lt;? if($i%$a==0) echo &#039;'; $i++; } mysql_free_result($query); ?&gt; &lt;img src=&quot;img/product/" alt=""/&gt; ?&gt;[/code]
Bartosz Stefanicki
07.07.2012, 14:41
Autor
@Łukasz, http://highslide.com/doc.php