• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Ganze Seite mit Bilder automatisch scrollen

eierkopf

New member
hallo zusammen,

mit Hilfe vieler Codeschnipsel im Netz habe ich eine Bildergalerie in Form einer "Tapete" erstellt. Diese Seite funktioniert auch ganz gut.

Jetzt würde ich gern die Seite automatisch rauf und runter scrollen lassen, wenn der User einige Zeit nichts macht. Leider habe ich keine der Lösungen im Netz umsetzen können.

Wo muss ich z.B. folgende js-Funktion in meinem Code einfügen?
HTML:
<script type="text/javascript">
window.onload = function(){
	var step = 1;
	window.setInterval(function(){
		var oldScrollTop = window.document.documentElement.scrollTop;
		window.scrollBy(0, step);
		if (oldScrollTop == window.document.documentElement.scrollTop) step *= -1;
	}, 10);
};
</script>

Hier der Quell-Code meiner Seite:
HTML:
<html lang="de-de">
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <title>Alle Bilder</title>
  <meta name="description" content="...">
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <!-- CSS Reset -->
	<link rel="stylesheet" href="css/normalize.css">
  <!-- Magnific popup styles -->
	<link rel="stylesheet" href="css/magnific-popup.css">
  <!-- Global CSS for the page and tiles -->
	<link rel="stylesheet" href="css/main.css">
  <!-- Specific CSS for the example -->
  <style>
    .tiles-wrap li {
      -moz-box-sizing: border-box;
           box-sizing: border-box;
    }
    .tiles-wrap li img {
      width: 100%;
      height: auto;
    }
  </style>
</head>
<body>
  <div id="top">
	<header><h1>Alle Bilder</h1></header>
    <div role="main">
	<ul id="container" class="tiles-wrap">	
	<?php
		$d = array(	"ordner 1",
					"ordner 2", ...
		);
	?>
	<!-- alle bilder eines ordners laden und in ul als li eintragen -->
	<?php
		foreach ($d as $ordner) {
			$alledateien = scandir($ordner);
			foreach ($alledateien as $datei) {
				$dateiinfo = pathinfo($ordner."/".$datei);
				$size = ceil(filesize($ordner."/".$datei)/1024);
				if ($datei != "." && $datei != ".." && $datei != "_notes") {
	?>
<li>
		  <a href="<?php echo $dateiinfo['dirname']."/".$dateiinfo['basename'];?>">
		    <img class="lazy" src="<?php echo $dateiinfo['dirname']."/".$dateiinfo['basename'];?>" width="150" height="auto">
		  </a>
		  <p><?php echo $dateiinfo['filename'];?></p>
		</li>
	<?php
				};
			};
		}
	?>
	<!-- -->
	</ul>
	</div>
  	<div id="div1" style="position:fixed; right:30px; bottom:12px;">
	  <a href="#top"><img title="Nach oben scrollen" alt="Nach oben scrollen" src="css/arrow_big_white_up.png" /> </a>
	</div>
	<div id="div2" style="position:absolute; left:30px; top:12px;">
	  <a href="#" onclick="history.back(); return false"><img title="Zurück" alt="Zurück" src="css/arrow_big_white_lt.png" /> </a>
	</div>
</div>
<!-- include smoothscroll -->
  <script src="js/smoothscroll.js"></script>
<!-- include jQuery -->
	<script src="js/jquery.min.js"></script>
<!-- include jQuery -->
	<script src="js/jquery.lazyload.js"></script>
<!-- Include the imagesLoaded plug-in -->
	<script src="js/imagesloaded.pkgd.min.js"></script>
<!-- include magnific popup -->
	<script src="js/jquery.magnific-popup.min.js"></script>
<!-- Include the plug-in -->
	<script src="js/wookmark.js"></script>
<!-- Once the page is loaded, initalize the plug-in. -->
	<script type="text/javascript">
		$(function() {
			$("img.lazy").lazyload();
		});
		(function() {
			function getWindowWidth() {
				return Math.max(document.documentElement.clientWidth, window.innerWidth || 0)
			}
			// Instantiate wookmark after all images have been loaded
			var wookmark;
			// ------------------------------------
			// Init lightbox
			$('#container').magnificPopup({
				delegate: 'li:not(.inactive) a',
				type: 'image',
				gallery: {
					enabled: true
				}
			});
			// ------------------------------------
			imagesLoaded('#container', function() {
				wookmark = new Wookmark('#container', {
					itemWidth: 300, // Optional min width of a grid item
					outerOffset: 20, // Optional the distance from grid to parent
					flexibleWidth: function () {
						// Return a maximum width depending on the viewport
						return getWindowWidth() < 1024 ? '100%' : '50%';
					}
				});
			});
		})();
	</script>
</body>
</html>

Auch wenn ich jQuery.ScrollTo benutze, muss ich ja wissen, wo genau ich die Funktion dann aufrufen muss.

Vielen Dank für Eure Hilfe...
 
Zuletzt bearbeitet:
hallo kkapsner,

vielen Dank für deine Antwort. Wenn ich wüsste, wie...

Und außerdem ist das nicht mein erstes Problem. Ich würde gern nach Aufbau der Seite (mehrere dutzend Bilder) diese automatisch rauf und runter scrollen lassen. Vorgestellt hatte ich mir das so, einen Button zu positionieren und auf Klick läuft dann die Seite langsam rauf und runter.

Und ja - es muss auch die Möglichkeit geben, das Scrollen zu pausieren/ abzubrechen. Aber eins nach dem anderen... Und das Pausenproblem würde ich auch gern danach angehen.
 
okay - ich hab' folgendes eingegeben (Bsp. von Tryit Editor v2.6 übernommen):

Unterhalb von "div2":
HTML:
	<div id="div3" style="position:absolute; right:30px; top:12px;">
		<button onclick="scroll()">Click me</button>
	</div>

und dann im js-Teil:
HTML:
	<script type="text/javascript">
		function scroll() {
			var step = 1;
			window.setInterval(function(){
				var oldScrollTop = window.document.documentElement.scrollTop;
				window.scrollBy(0, step);
				if (oldScrollTop == window.document.documentElement.scrollTop) step *= -1;
				}, 10);
		};
		$(function() {
.
.
.

Es passiert nichts...
 
Zeig' mal eine Testlink, wo wir uns das live ansehen können.

Mit dem ganzen PHP und den nicht gezeigten, zusätzlichen Dateien (JS und CSS) ist die Fernwartung sehr schwierig. Mein Verdacht ist aber, dass bei dir ja nicht das komplette Fenster, sondern ein spezifisches Elemnt gescrollt werden soll/muss.
 
hier der link mit dem nicht funktionierenden Code: [entfernt]

Ich denke schon, dass die ganze Seite scrollen sollte...
 
Zuletzt bearbeitet:
In deinem Code hast du zum einen die Klammern für den Funktionsaufruf im Eventlistener vergessen und zum anderen ist der Code falsch. Die globale Scrollposition wird mit window.scrollY ausgelesen.
 
hallo kkapsner,

vielen Dank für deine Antwort. Ich habe den Code folgendermaßen abgeändert - läuft aber trotzdem nicht:

HTML:
function scroll_up_and_down() {

	var step = 1;
	window.setInterval(function(){
		var oldScrollTop = window.document.documentElement.scrollY;
		window.scrollBy(0, step);
		if (oldScrollTop == window.document.documentElement.scrollY) step *= -1;
	}, 10);
};

Vllt. habe ich dich aber auch mißverstanden?
 
Irgendwie seh' ich den Wald vor lauter Bäumen nicht:

HTML:
<div id="div3" style="position:absolute; right:30px; top:12px;">
   <button onclick="scroll_up_and_down">Click me</button>
</div>
...
<script type="text/javascript">
    function scroll_up_and_down() {
        var step = 1;
        window.setInterval(function(){
            var oldScrollTop = window.scrollY;
            window.scrollBy(0, step);
            if (oldScrollTop == window.scrollY) step *= -1;
        }, 10);
    };
...

Es tut sich noch immer nichts...

@ kkapsner

Ich hab ein zweites php-Script Gallery2 erstellt, bei dem ich das Ganze mit jQuery.animate versuche zu realisieren. Gibt es eine Möglichkeit, animate "linear" scrollen zu lassen?

Bsp.
HTML:
$(document).ready(function (){
  $("#go_up").click(function (){ $('html, body').animate({ scrollTop: $("#top").offset().top }, 100000); }); 
  $("#go_dn").click(function (){ $('html, body').animate({ scrollTop: $("#ende").offset().top }, 100000); });
});

Ich verstehe den Code so, dass die komplette Seite in "100000" (Millisekunden?) gescrollt wird. Leider wird animate dabei immer schneller...
 
@ kkapsner

Erst einmal vielen Dank - es läuft. Beides.

Ich entscheide mich aber trotzdem gegen jQuery. Hier hängt die Scrollgeschwindigkeit von der Länge der Seite ab. Bei einem schmalen Browser scrollt der Bildschirm dann schneller als bei einem breiten. Könnte man bestimmt auch i-wie hinbekommen...

Wenn die Frage nicht unverschämt ist: Das Endlos-Scrollen muss ich ja i-wie abbrechen können. Meine erste Lösung ist, dass ich einen weiteren div "Abbr" eingebaut habe und dort über onclick die stop_Scroll()-Funktion aufgerufen wird:

HTML:
<div id="UpAndDn" style="position:fixed; right:30px; top:12px;">
  <a href="#" onclick="scroll_up_and_down()"><img title="Up And Down" alt="Up And Down" src="css/arrow_big_white_up_dn.png" /> </a>
</div>
<div id="Abbr" style="position:fixed; left:30px; bottom:12px;">
  <a href="#" onclick="stop_scroll();"><img title="Abbruch und Seite neu laden" alt="Abbr." src="css/arrow_big_cancel.png" /> </a>
</div>


function scroll_up_and_down() {
	var step = 1;										
	window.setInterval(function(){						
		var oldScrollTop = window.scrollY;				
		window.scrollBy(0, step);						
		if (oldScrollTop == window.scrollY) step *= -1;
	}, 1);											
};
function stop_scroll() {
	window.location.reload();
};

Schön finde ich die Lösung aber nicht.
Besser wäre bestimmt "clearInterval();" - da verstehe ich aber die Funktionsweise nicht bzw. setInterval wird automatisch gestartet (w3schools) - was ich ja eigentlich vermeiden möchte.
Ist es vllt. möglich, dass bei einem zweiten Klick auf div "UpAndDown" die Funktion scroll_up_and_down() angehalten wird? Beim nächsten Klick wieder gestartet wird usw.
 
Könnte man bestimmt auch i-wie hinbekommen...
Ja, kann man. Ist aber relativ nervig. Prinzipiell muss du die Länge der Seite auslesen und dann daraus die Animationsdauer berechnen.
Schön finde ich die Lösung aber nicht.
Ist sie auch nicht.
Besser wäre bestimmt "clearInterval();"
ja, wäre es.
Ist es vllt. möglich, dass bei einem zweiten Klick auf div "UpAndDown" die Funktion scroll_up_and_down() angehalten wird? Beim nächsten Klick wieder gestartet wird usw.
Klar ist das möglich. Zuerst musst du aber verstehen, wie window.clearInterval() funktioniert. Ist auch eigentlich nicht so schwierig. window.setInterval() gibt dir einfach eine Timer-ID zurück und diese musst du an clearInterval übergeben.

Um jetzt den Toggle-Effekt zu bekommen, musst du dir einfach irgendwo merken, ob gerade die Animation läuft. Z.B. so:
Code:
var scroll_up_and_down = function(){
	var timer = false;
	var step = 1;
	return function scroll_up_and_down(){
		if (timer){
			window.clearInterval(timer);
			timer = false;
		}
		else {
			timer = window.setInterval(function(){						
				var oldScrollTop = window.scrollY;				
				window.scrollBy(0, step);						
				if (oldScrollTop === window.scrollY || window.scrollY === 0){
					step *= -1;
				}
			}, 10);
		}
	};
}();
 
Zuletzt bearbeitet:
@ kkapsner: Vielen, vielen Dank.

Ich hab' deinen Code zwar nicht ans Laufen bekommen, aber dadurch den Lösungsansatz. Eingefügt habe ich noch einen Wechsel des div-Images.
Hier meine Endlösung:

HTML:
<div id="UpAndDn" style="display:block; position:fixed; right:30px; top:12px;">
    <a href="#" onclick="scroll_up_and_down()"><img title="Anklicken, um Seite auf und ab zu scrollen" alt="Up And Down" src="css/arrow_big_white_up_dn.png" /> </a>
</div>
<div id="Abbr" style="display:none; position:fixed; right:30px; top:12px;">
    <a href="#" onclick="scroll_up_and_down()"><img title="Anklicken, um Scrollen zubeenden" alt="Abbr." src="css/arrow_big_cancel.png" /> </a>
</div>

HTML:
<script type="text/javascript">
var scroll_up_and_down = function(){
	var timer = false;
	var step = 2;
	return function scroll_up_and_down(){
		if (timer){
			document.getElementById("Abbr").style.display = 'none';
			document.getElementById("UpAndDn").style.display = 'block';
			window.clearInterval(timer);
			timer = false;
		}
		else {
			document.getElementById("UpAndDn").style.display = 'none';
			document.getElementById("Abbr").style.display = 'block';
			timer = window.setInterval(function(){						
				var oldScrollTop = window.scrollY;				
				window.scrollBy(0, step);						
				if (oldScrollTop === window.scrollY || window.scrollY === 0){
					step *= -1;
				}
			}, 10);
		}
	};
}();
</script>

Meine Teil-Lösung mit jQuery sieht so aus:
HTML:
<div id="go_up" style="position:fixed; right:30px; bottom:12px;">
    <img title="Nach oben scrollen" alt="Nach oben scrollen" src="css/arrow_big_white_up.png" /> </a>
</div>
<div id="go_dn" style="position:absolute; right:30px; top:12px;">
    <img title="Nach unten scrollen" alt="Nach unten scrollen" src="css/arrow_big_white_dn.png" /> </a>
</div>

HTML:
<script type="text/javascript">
$(function (){
    $("#go_up").click(function (){ $('html, body').animate({ scrollTop: $("#top").offset().top },  400000, "linear"); }); 
    $("#go_dn").click(function (){ $('html, body').animate({ scrollTop: $("#ende").offset().top }, 400000, "linear"); });
});
</script>

Edit: Wollte gerade das Thema auf gelöst setzen. Wenn ich den ersten Beitrag erweitert bearbeite, gibt es diese Möglichkeit aber nicht....
 
Zuletzt bearbeitet:
Ups... habe oben ein Klammernpaar vergessen. Ist jetzt eingefügt.

- - - Aktualisiert - - -

Bei deiner Lösung hast du die globale Variable timer, die dir ev. Konflikte mit anderen Scripten produzieren kann. Deswegen hab' ich den zusätzlichen Scope eingebaut.
 
Zurück
Oben