Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [jquery][PHP] Dynamiczna zmiana grafik bez przeładowania strony
Forum PHP.pl > Forum > Przedszkole
tofik1778983
Witam.
Chciałem zrobić sobie dynamiczny pokaz slajdów bez przeładowania strony.
Np co 5 sekund zmienia grafikę na kolejną losową.
Chciałem użyć biblioteki jquery.cycle.all.min.js http://jquery.malsup.com/cycle/ ma dość ciekawe możliwości.
Przykładowo używa się jej tak:
Kod
<html>
<head>
<title>JQuery Cycle Plugin - Example Slideshow</title>
<!-- include jQuery library -->
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script>
<!-- include Cycle plugin -->
<script type="text/javascript" src="http://cloud.github.com/downloads/malsup/cycle/jquery.cycle.all.2.74.js"></script>
<!--  initialize the slideshow when the DOM is ready -->
<script type="text/javascript">
$(document).ready(function() {
    $('.slideshow').cycle({
        fx: 'fade' // choose your transition type, ex: fade, scrollUp, shuffle, etc...
    });
});
</script>
</head>
<body>
    <div class="slideshow">
<img src="1.jpg" alt="" />
    <img src="2.jpg" alt="" />
    <img src="3.jpg" alt="" />
    <img src="4.jpg" alt="" />
    <img src="5.jpg" alt="" />
    <img src="6.jpg" alt="" />
    <img src="7.jpg" alt="" />
    </div>
</body>
</html>

Nie ma problemu gdy grafik jest mało.. ale ja potrzebuje wrzucić 140 graficzek w formacie 400x300px które ważą 1,54MB (już po maksymalnym zmniejszeniu ich jakości względem wagi pliku.. więcej nie mogę bo pxeloza.. wcześniej ważyły prawie 6MB)
Podzieliłem je na 3 foldery po 46 sztuk w każdym i zrobiłem sobie tak:
Kod
<script type="text/javascript">
$(document).ready(function() {
    $('#slideshow').cycle({
        fx: 'fade',
        random: 1,
        timeout: 5000,
        speed: 2500
    
    });
});
</script>

<?php
$fol = array('01', '02', '03');
$los = rand(0, 2);
$dir = 'plix/los_jpg/'.$fol[$los];
$file_types = array('jpg','jpeg','gif','png');
if($handle = opendir($dir)) {
    while (false !== ($file = readdir($handle))) {
    if ($file != "." && $file != ".." && $file != "index.php") {
        $roz = explode(".",$file);
        foreach($roz as $key => $value){
            if(in_array($value,$file_types)){
                $image .= '<img src="'.$dir.'/'.$file.'" width="400px" height="300px" alt="tofx">';
            }        
        }
    }
}
closedir($handle);
}

echo'<div id="slideshow" style="height:310px; margin-left:220px;">'. $image .'</div>';

Co prawa po przeładowaniu strony wyświetla mi tylko 1/3 grafik na raz ale to przecierpię.
Nieco lepiej ale i tak jeszcze zamula.. w końcu musi załadować 46 grafik..

Zapewne dało by się prościej i może bez udziału php w tym procederze??
Może gdyby w jquery losować np liczbę od 001 do 140 (tak są nazwane pliki) i potem użyć tej wylosowanej liczby do wyświetlenia danej graficzki..questionmark.gif
Tylko nie wiem jak się do tego zabrać.. dopiero zaczynam przygodę z jquery.

Oczywiście nie musi to być z użyciem tej biblioteki może być inny sposób byle działał sprawniej od moich wypocin.
wookieb
Czekam na PW z poprawną nazwą tematu.
// otwieram
everth
Przeczytałeś chociaż dokumentację tego? Tutaj masz przykładowe rozwiązanie jak dynamicznie dodawać dodatkowe obrazki w tle. Przy tym u mnie skrypt rozkłada się na Operze, weź to pod uwagę.
tofik1778983
Wszystkiego nie czytałem przyznaje musiałem ominąć. Dzięki sprawdzę jutro dziś już z tylko spać.

Przykład u mnie działa elegancko pod każdą przeglądarką jaką sprawdzałem ALE...
Mam katalog w nim 140 grafik. Mój skrypt wygląda tak:
Kod
<script type="text/javascript">

$(document).ready(function() {  
    $('#slideshow').cycle({
        fx: 'fade',
        //random: 1,
        timeout: 1500,
        speed: 1400,
        before:   onBefore
    });

    var totalSlideCount = 30;
    
    function onBefore(curr, next, opts) {  
        if (!opts.addSlide)
            return;
        var currentImageNum = parseInt(next.src.match(/img(\d)/)[1]);
            
        if (currentImageNum == totalSlideCount) {
            opts.addSlide = null;
            return;
        }
        opts.addSlide('<img src="tmpz/img'+(currentImageNum+1)+'.jpg" width="400" height="300" />');
    };
});

</script>  

<div id="slideshow" class="pics">
        <img src="tmpz/img1.jpg" width="400" height="300" />
        <img src="tmpz/img2.jpg" width="400" height="300" />
</div>

Katalog fot: /tempz
Skrypt wyświetla tylko od img1 do img10 nie chce więcej ile bym nie podał w var totalSlideCount = 30;
Czy tyle może maksymalnie wyświetlić czy co questionmark.gif
everth co miałeś na myśli pisząc że nie działał poprawnie??

Ehh nie zauważyłem że w
Kod
var currentImageNum = parseInt(next.src.match(/img(\d)/)[1]);
jest wyrażenie regularne.
już wyświetla ile trzeba. Jednak chciałbym żeby wyświetlało losując nr obrazka, a nie leciało po kolei.
-----------------
Jednak to było prstsze niż myślałem.. Może się komuś przyda. Oto kod:
Kod
$(document).ready(function() {  
    $('#slideshow').cycle({
        fx: 'fade',
        //random: 1,
        timeout: 500,
        speed: 90,
        before:   onBefore
    });
    var totalSlideCount = 140;
    function onBefore(curr, next, opts) {  
        if (!opts.addSlide)
            return;
        //var currentImageNum = parseInt(next.src.match(/img(\d..)/)[1]);            
        //if (currentImageNum == totalSlideCount) {
        //    opts.addSlide = null;
        //    return;
        //}
        var ran=Math.floor((Math.random()*141)+1);
        //document.write(ran+' ');        
        opts.addSlide('<img src="tmpz/img'+(ran)+'.jpg" width="400" height="300" />');
    };
});

To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.