afbeelding laden als div in beeld komt

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Christian k

christian k

06/06/2014 17:37:28
Quote Anchor link
hallo iedereen,
Omdat mijn website heel veel plaatjes heeft en dus een lange laad tijd heeft
kwam ik op het idee om de afbeelding pas te laden als de div in beeld komt
ik heb nu:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<div class="picture">
<img src="voorbeeld.jpg" alt="voorbeeld">
</div>

hoe kan ik ervoor zorgen dat javascript dicteert dat de div (dus de afbeelding) in beeld is
en daarna de afbeelding laad?

alvast bedankt
 
PHP hulp

PHP hulp

19/04/2024 07:35:36
 
- Ariën  -
Beheerder

- Ariën -

06/06/2014 17:55:14
 
Christian k

christian k

06/06/2014 18:15:55
Quote Anchor link
ik zou het graag zelf typen.
maar zo moeilijk moet het toch niet zijn
alleen js hoeft maar te dicteren dat de div in beeld is en dan
i.p.v zon load image de src veranderen naar de afbeelding
 
Reshad F

Reshad F

06/06/2014 18:29:44
Quote Anchor link
Je zal sowieso met AJAX moeten werken wil je dit voor elkaar krijgen.

Om je een begin te geven. Zo haal je de height op. ( cross browser )

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
  function getViewportHeight() {
        var height = window.innerHeight; // Safari, Opera
        var mode = document.compatMode;

        if ( (mode || !$.support.boxModel) ) { // IE, Gecko
            height = (mode == 'CSS1Compat') ?
                document.documentElement.clientHeight : // Standards
                document.body.clientHeight; // Quirks
        }

        return height;
    }


Wat jij nog moet toevoegen.

1. Scrollen bijhouden. en bepalen aan de hand van het scrollen waar de gebruiker is. Vervolgens doe je iets als

if('img').visible .. o.i.d.
.. haal de volgende plaatjes via ajax op.
Gewijzigd op 06/06/2014 18:31:52 door Reshad F
 
Joakim Broden

Joakim Broden

06/06/2014 21:57:10
Quote Anchor link
Wtf, hoezo Ajax hietvoor gebruiken. Ajax gebruik je om data op te halen en geen afbeeldingen.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<img class="image-load" data-image-load="de_url_van_de_afbeelding.png" />


En dan via javascript kijken of de scrollTop in de buurt komt van de .image-load. Komt het in de buurt dan de src van de afbeelding zetten mbv data-image-load attribute.
 
Christian k

christian k

07/06/2014 09:02:30
Quote Anchor link
oke maar elke afbeelding moet toch een andere id hebben? om de
scr te veranderen?
maar hoe kun je die dan via 1 script allemaal aanroepen als hij zover gescrolt is?
en hoe kun je een javascript full time door laten runnen? met een loop functie over
de funtie heen die controleert hoever je gescrolt bent?
 
Reshad F

Reshad F

07/06/2014 10:04:15
Quote Anchor link
@Hertog Wat is jou definitie van Data? want een img is ook gewoon data en kan prima d.m.v. Ajax opgehaald worden. Ajax is niets meer of minder dan een JS functie die een php bestand aanroept. En als jij daar iets textueels mee op wilt halen prima, maar afbeeldingen kan ook prima.

@Christian google is op ajax lazy loading dan zie je genoeg voorbeeldjes. Als je genoeg tijd hebt kun je natuurlijk zelf een variant op maat maken maar mocht je het direct nodig hebben dan is de link die Aar gaf een hele goede welke ook Ajax ondersteunt.

http://www.appelsiini.net/projects/lazyload/enabled_ajax.html
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

07/06/2014 10:08:27
Quote Anchor link
Christian k op 07/06/2014 09:02:30:
oke maar elke afbeelding moet toch een andere id hebben? om de
scr te veranderen?
maar hoe kun je die dan via 1 script allemaal aanroepen als hij zover gescrolt is?
en hoe kun je een javascript full time door laten runnen? met een loop functie over
de funtie heen die controleert hoever je gescrolt bent?

Nee, je kunt een eventListener maken op scroll (window.onscroll).
Als je jquery gebruikt kan je dan met een class selector alle images aflopen, controleren of een image een source heeft, zoniet dan de source erin zetten als de image in beeld is.

Met zo'n selector (kan ook met plain JS) krijg je een verzameling van DOM elementen, je kan daar doorheen lopen en de benodigde acties uitvoeren op het element, je hebt dus geen id nodig.



Toevoeging op 07/06/2014 10:13:58:

@Reshad,
Waarom zou je een php script aanroepen als je een image rechtstreeks kan ophalen?
Gewijzigd op 07/06/2014 10:16:12 door Ger van Steenderen
 
Christian k

christian k

07/06/2014 10:45:17
Quote Anchor link
@ger het moet wel via php want ik echo de images via een php script.

maar het probleem is hij soms de afbeeldingen niet laad,
hij laad altijd maar 1 albeelding (het verschilt welke als ik reload zie ik er soms 2)
dus ik dacht misschien licht het aan dat het teveel bandbreedte kost dus dat ik daarom een lazy load
in mijn pagina moet bouwen. is dat eigenlijk wel de oplossing?

Toevoeging op 07/06/2014 11:00:04:

ik heb dit script gevonden
http://css-tricks.com/snippets/javascript/lazy-loading-images/
maar hoe kan ik er voor zorgen dat hij als de afbeeldingen ingeladen zijn
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

07/06/2014 11:28:50
Quote Anchor link
Voor de browser maakt het niet uit of een php in de src staat of een jpg, die verwacht gewoon een image.
Het is wel zo dat als je images via PHP processed dit sowieso al trager is dan de direct van de server te halen.

Ik vraag me af waarom je het zelf wilt coderen, die link die Aar gaf regelt het allemaal voor je.
Ook de link die je zelf gaf doet dat volgens mij.
 
Joakim Broden

Joakim Broden

07/06/2014 13:45:37
Quote Anchor link
Reshad F op 07/06/2014 10:04:15:
@Hertog Wat is jou definitie van Data? want een img is ook gewoon data en kan prima d.m.v. Ajax opgehaald worden. Ajax is niets meer of minder dan een JS functie die een php bestand aanroept. En als jij daar iets textueels mee op wilt halen prima, maar afbeeldingen kan ook prima.


Ja dat is toch onnozel? Jij wilt dus aan een afbeelding een id koppelen, dan via ajax de id meesturen en dan via php gaan bekijken welke afbeelding bij welke id hoord? Wat is dat voor omslachtige (mijn mening onnozele) oplossing?

Zelf zou ik zoiets als dit doen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
    <img class="image-load" data-image-load="URL van de afbeelding" />


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    $(document).ready(function() {
        $(window).bind('scroll', function() {
            $('.image-load').each(function() {
                var image = $(this);

                if (undefined == image.attr('src')) { // Kijken of de SRC is ingevuld.
                    var position = image.position().top();
                    
                    if ($(window).scrollTop() + $(window).height() >= position) { // Is de scollpositie + scherm grote groter dan de positie van de afbeelding.
                        image.attr('src', image.attr('data-image-load')); // SRC invullen.
                    }
                
                }
            });
        });
    });

Ik heb deze code nog niet getest, er kunnen fouten in zitten en waarschijnlijk zal je hem nog wat aan moeten passen.
Gewijzigd op 07/06/2014 13:46:19 door Joakim Broden
 
Christian k

christian k

07/06/2014 14:30:33
Quote Anchor link
de reden waarom ik de afbeeldingen ophaal via php is de foto's die je verstuurd
niet voor iedereen zichtbaar moeten zijn. nu ik het via php doet word er eerste gecontroleerd
of je de afbeelding mag zien als dat het geval is echo't hij de afbeelding als het niet het geval is echo't hij een afbeelding met de tekst: deze foto is niet voor u bedoelt.



Toevoeging op 07/06/2014 14:34:11:

ik ga nu je script testen
 
Joakim Broden

Joakim Broden

07/06/2014 14:36:34
Quote Anchor link
PHP staat hier los van. Afbeelding laden als ze in de viewport komen in Front-end!
 
Christian k

christian k

07/06/2014 14:52:12
Quote Anchor link
het script werkt niet ik vermoed dat het hier aan ligt
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
var position = image.position().top();

als ik een alert('hoi') voor deze regel zet krijg ik de hele tijd hoi te zien
zodra ik alert('hoi') na deze regel zet krijg ik niks meer te zien
weet iemand hoe dat komt?
 
Joakim Broden

Joakim Broden

07/06/2014 14:57:41
Quote Anchor link
.top() moet .top zijn ;-) Excuses en anders 'Wat zegt de javarscript console'...
 
Christian k

christian k

07/06/2014 15:08:15
Quote Anchor link
ik ben nu verder het script werkt nog steeds niet nu ligt het aan deze regel
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
image.attr('src', image.attr('data-image-load')); // SRC invullen.

de javascript console zegt:
event.returnvalue is deprecated. please use the standard event.preventdefault() instead
ik kan er zelf niet zoveel uit wijs worden
 
Joakim Broden

Joakim Broden

07/06/2014 15:13:32
Quote Anchor link
event.returnvalue is deprecated. please use the standard event.preventdefault() instead heeft niks te maken met die regel, tenzij je nog een oude jQuery hebt ofzo?? Heb je een online link, kan ikz elf even kijken wat er fout gaat.
 
Christian k

christian k

07/06/2014 15:15:26
Quote Anchor link
nee sorry ik heb hem alleen op mijn computer draaien in apache2
ik heb deze jQuery
<script src="http://code.jquery.com/jquery-1.10.0.min.js"></script>
 
Joakim Broden

Joakim Broden

07/06/2014 15:21:02
Quote Anchor link
Zegt hij ook op welke regel de fout zich bevind? Want die error heeft volgens mij weinig te maken met de code die ik je gegeven heb.
 
Christian k

christian k

07/06/2014 16:42:53
Quote Anchor link
nee maar dat is de regel die niet uitgevoerd word
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

07/06/2014 19:32:54
Quote Anchor link
Zo zou ik het doen:
Code (js)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$(document).ready(function() {
    $(window).on('scroll', function() {
        $(".image-load").each(function(index, el) {
            var im_data = $(el).data('image_src');
            // controleer of het attribuut geen image bevat
            if (typeof im_data == 'string') {
                var top = $(el).offset().top
                // controleer of de image in de viewport staat
                if (top >= $(window).scrollTop() &&
                        top <= $(window).scrollTop() + $(window).height()) {
                    // zet de image in het data-attribuut
                     var new_img = new Image();
                     new_img.src = im_data;
                     $(el).data('image_src', new_img);
                     el.src = new_img.src;
                }
            }
        });
    });

    // trigger de scroll
    $(window).trigger('scroll');
});
Gewijzigd op 07/06/2014 19:50:36 door Ger van Steenderen
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.