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

[FRAGE] Position div id ermitteln für Bildwechsel

MrPaule75

New member
Position div id ermitteln für Bildwechsel (gelöst)

Hallo Community,

ich habe in meine Seite ein Script eingebaut, mit dem man vertikal von Inhaltsbereich zun nächsten springen kann (diese derzeit modernen Layouts). Links an der Seite habe ich zudem Punkte, welche diese Inhaltsbereiche darstellen (quasi wie Seitenzahlen), über die man auch vertikal springen kann.

"Unschön" ist jetzt aber, dass diese linken Punkte nur angezeigt sind. Schöner wäre es, wenn z.B. auch bei den jeweiligen Inhaltsbereichen, der jeweilige Punkt z.B. anders eingefärbt wäre.

Das Springen realisiere ich mit einem JS. Die steuere ich div IDs an (top, zwei, drei etc.). Um den Sprungpunkt links per css färben zu können, muss ich ja ermitteln auf welcher Position ich bin. Duch Koordinaten ist das vielleicht mgl., aber dann ja auch abhängig von der Browserhöhe. Kann man das vielleicht auch so umsetzen, wenn das div mit der ID# sichtbar ist?
Finde bei Google nichts, weiß derzeit aber auch nicht so recht, was das Schlagwort dafür ist.

Thanks
MrPaule
 
Zuletzt bearbeitet:
Ich würde das nicht mit Koordinaten machen ...
Ich weiß zwar nicht wie du das genau regelst bei dir, aber ich würde das menü so regeln, dass es eine Liste mit Punkten ist, und jeder Punkt hat eine id.
Dann habe ich eine JS-Funktion, welche den Wechsel bewirkt. Diese setzt dan das Listen Element mit der derzeit aktiven Seite auf class active.
Die class active färbe ich mit css.

HTML:
 <ul>
  <li class="bulletlist" id="0">.</li>
  <li class="bulletlist" id="1">.</li>
  <li class="bulletlist" id="2">.</li>
</ul>
Code:
var change = function(id){//Change slide zu id
var list= document.getElementsByClassName('bulletlist');
for (var i = 0; i < list.length; i++) {
  if(list[i].id!=id){//setzt alle Elemente auf classname bulletlist nur das aktive auf zusätzlich active (so bleibt immer nur 1 active)
   document.getElementById(id).className = "bulletlist"
  }else{
   document.getElementById(id).className = "bulletlist active"
  }
}
};
 
Hi,

erstmal vielen Dank für den Weg und den Tipp. Bin grade etwas arg beschäftigt, werde es aber dann ausprobieren.
Wollte jetzt aber mit einer Antwort warten, dass es den Anschein hat "der stellt eine Frage und reagiert nicht mehr".
Also vorab Merci!
 
Hallo uthred,

nochmals Danke!
ich habe das nun so umgesetzt, jedoch muss da noch ein Fehler sein oder ich sehe den Wald vor lauter Bäumen nicht...

JS in der html:
Code:
 <li class="bulletlist" id="0"><a href="#top" title="nach oben" class="bulletlist"></a></li>
 <li class="bulletlist" id="1"><a href="#zwei" title="nach oben" class="bulletlist"></a></li>
 <li class="bulletlist" id="2"><a href="#drei" title="nach oben" class="bulletlist"></a></li>
 <li class="bulletlist" id="3"><a href="#vier" title="nach oben" class="bulletlist"></a></li>
 <li class="bulletlist" id="4"><a href="#fuenf" title="nach oben" class="bulletlist"></a></li>

css
Code:
.bulletlist {display: block; height:10px; width:10px; line-height:20px; background-image:url('../images/img-sprungmarke01-of.png');}
.bulletlist :hover {display: block; height:10px; width:10px; background-image:url('../images/img-sprungmarke01-on.png');}
.bulletlist active {display: block; height:10px; width:10px; background-image:url('../images/img-sprungmarke01-on.png');}
ul.bulletlist {display:inline-block; list-style-type: none;}
li.bulletlist {margin-bottom:10px;}

Der hover funktioniert, die Sprünge auch, nur das bulletlist active bekomme ich zum Teufel nicht hin. Irgend etwas passt an der active-Klasse nicht, aber ich komme nicht drauf ...

Wegen meinem ersten Gedankengang per JS die "Sichtbarkeit" eines Elementes auf dem Screen auszulesen und dann die Klasse zu ändern lag daran, dass Dein Tip ja beim Klick auf die Springmarke funktioniert, aber wenn man mit dem Mausrad (oder dem Scrollbalken) die Seite runter scrollt, dieser Weg (Anzeige der Seite im bulletlist) ja nicht funktioniert - oder?

Danke & Grüße
 
OK, ich habe mal Deinen Tipp aufgenommen und etwas gegoogelt.

HTML
Code:
<body onscroll="scrollpos()">

<ul class="sprungmarken">
<li id="s0"><a href="#top" title="nach oben" class="bulletlist"></a></li>
<li id="s1"><a href="#zwei" title="nach oben" class="bulletlist"></a></li>
<li id="s2"><a href="#drei" title="nach oben" class="bulletlist"></a></li>
<li id="s3"><a href="#vier" title="nach oben" class="bulletlist"></a></li>
<li id="s4"><a href="#fuenf" title="nach oben" class="bulletlist"></a></li>
</ul>

<script>
function scrollpos() {
    top = document.body.scrollTop;
    //alert(top);
    if(document.body.scrollTop < 800) {   
        document.getElementById("s1").className = "bulletlist:active";
    } else if (document.body.scrollTop > 1000) {
        document.getElementById("s0").className = "bulletlist:active";
    } else if (document.body.scrollTop > 2000) {
        document.getElementById("s1").className = "bulletlist:active";
    } else if (document.body.scrollTop > 3000) {
        document.getElementById("s2").className = "bulletlist:active";
    } else if (document.body.scrollTop > 4000) {
        document.getElementById("s3").className = "bulletlist:active";
    } else {
        document.getElementById("s4").className = "bulletlist:active";
    }
}
</script>

CSS
Code:
.bulletlist:hover {background-image:url('../images/img-sprungmarke01-on.png');}
.bulletlist-active {background-image:url('../images/img-sprungmarke01-on.png');}

DiePosition s0 wird sogar angezeigt - der "Dötz" ist aktiv.
Anscheinend (ich Newbee) habe ich dann sicherlich etwas mit den else if's falsch gemacht.
Darf ich um einen Nasenstups anfragen - bitte?
 
Per .className kannst du keinen Pseudoselektor aktivieren und Doppelpunkte im CSS-Klassennamen sind keine gute Idee, da man sie nur schwer im CSS ansprechen kann. Ich würde also einfach "bulletlist active" verwenden und im CSS dann mittels .bulletlist.active darauf referenzieren.

PS: du musst natürlich immer auch alle anderen Elemente wieder auf "bulletlist" zurücksetzen. Sonst bleiben die ja "active".
 
Hallo kkapsner,

danke für Deinen Hinweis mit dem active, habe ich nun gemacht.

Ich muss jedoch leider nochmal wegen dem Script nachhaken. Irgendwie habe ich Knoten im Hirn.
Gestern abend, bevor ich den Hinweis im zweiten Absatz gelesen habe, kam mir die Überlegung, dass Scripte (Bedingungen) ja von oben nach unten gelesen werden. Demzufolge ich mit dem größten Wert beginnen muss.
Sage ich in Bedingung 1 "> 1000" (Pixel), so ist diese Bedingung ja auch später bei "> 2000" etc. erfüllt und die Schleife wird nicht weiter durchlaufen. Die Umstellung hatte jedoch nichts bewirkt. Ist diese Überlegung also falsch?

Gut - um mich heran zu tasten habe ich den Code erstmal verschlankt:
Code:
<script>
function scrollpos() {
    top = document.body.scrollTop;
    //alert(top);
    if(document.body.scrollTop > 2000) {   
        document.getElementById("s1").className = "bulletlist active";
    } else {document.getElementById("s0").className = "bulletlist active";
    }
}
</script>

Laienhaft einmal ausgedrückt:
- ist die (Web-) Seitenhöhe / Position größer 2000 Pixel, dann aktiviere Element id="s1"
- wenn nicht aktiviere Element id="s0" (also Seite 1 = Ansicht nach dem Laden 0 ganz oben)

Wenn ich die Seite neu lade, ist jedoch kein Element aktiv. Der Punkt "Seite1" wird erst aktiviert, wenn ich kurz gescrollt habe. Das ist natürlich unschön und erschließt sich mir nicht. Habe das Script am Seitencode-Ende, spielt das vielleicht eine Rolle (also vor dem /body).
Scrolle ich nach unten, müsste sich ab Position > 2000 Pixel) das Element "s1" aktivieren - macht es aber nicht. Also funktioniert es ja generell nicht - das mit dem Deaktivieren der Elemente, wenn ein Scrollbereich verlassen wird, ist dann nochmal ein anderes Thema.
Blick es gerade nicht mehr ...

Danke für Eure Unterstützung & Grüße

- - - Aktualisiert - - -

Ich bin jetzt nochmal in mich gegangen und habe nochmals im Web recherchiert.
"Im Prinzip" funktioniert es, wenn nicht ... siehe weiter unten.

Code:
<script>
window.onscroll = function() {myFunction()};
function myFunction() {
if (document.body.scrollTop > 1000 || document.documentElement.scrollTop > 1000) {
	document.getElementById("s1").className = "bulletlist active";
	document.getElementById("s0 s2 s3 s s5").className = "bulletlist";} 
else if (document.body.scrollTop > 2000 || document.documentElement.scrollTop > 2000) {
	document.getElementById("s2").className = "bulletlist active";
	document.getElementById("s0 s1 s3 s4 "s5").className = "bulletlist";} 
else if (document.body.scrollTop > 3000 || document.documentElement.scrollTop > 3000) {
	document.getElementById("s3").className = "bulletlist active";
	document.getElementById("s0 s1 s2 s4 s5").className = "bulletlist";} 
else if (document.body.scrollTop > 4000 || document.documentElement.scrollTop > 4000) {
	document.getElementById("s4").className = "bulletlist active";
	document.getElementById("s0 s1 s2 s3 s5").className = "bulletlist";} 
else if (document.body.scrollTop > 5000 || document.documentElement.scrollTop > 5000) {
	document.getElementById("s5").className = "bulletlist active";
	document.getElementById("s0 s1 s2 s3 s4").className = "bulletlist";} 
else {
      document.getElementById("s0").className = "bulletlist active";
      document.getElementById("s1 s2 s3 s4 s5").className = "bulletlist";} 
}
</script>

Sicherlich ist der Code nicht professionell und man kann das bestimmt schlanker lösen, aber ich bin kein Programmierer und eigentlich funktioniert es, ... weil ...

... mit den else if stimmt etwas nicht. Ich habe jetzt schon mehrere Tuts durchgelesen, aber ich komme nicht auf den Fehler. Klammern stimmt doch auch alles !?
Kann bitte vielleicht von Euch Profis jemand mal drüberlesen? Bitte ...

Zweiter Punkt, dass beim Laden der Seite der erste Seitenpunkt (s0)nicht aktiv wird. Kann das deswegen sein, da das Script die Scroll-Position ausliest und beim Seitenladen noch nicht gescrollt worden ist? Sobald ich scrolle wird "s0" nämlich aktiv. Hm ... wie könnte man das lösen? Vielleicht "s0" gleich als aktive Klasse anlegen und dann immer nur deaktivieren (bei den anderen Positionen)?

Grüße
MrPaule

Nachtrag:
habe gerade gesehen, dass ("s0" && "s1" && "s3" && "s4" && "s5") nicht geht. Einzeln ja, aber nicht mit && verknüpft. da muss ich wohl nochmal nachlesen ...
 
Zuletzt bearbeitet:
Hallo,

ich habe es nun selber hinbekommen. Sicherlich nicht Fine-Art-Coding, aber es funktioniert.
Für alle, die so etwas auch suchen nachfolgend der Code.

Code:
<script>
/* dieser Abschnitt ermittelt die Höhe des Browserfensters, um auch für css eine eigene Klasse (formatfüllende divs -> displayheight) zu generieren */
$(document).ready(function() {
  function setHeight() {
    windowHeight = $(window).innerHeight();
    $('.displayheight').css('height', windowHeight);
  };
  setHeight();
  
  $(window).resize(function() {
    setHeight();
  });
});

/* dieser Abschnitt schaltet die Seitenpunkte per clas aktiv oder passiv, abhängig von der Fensterhöhe */
window.onscroll = function() {myFunction()};
function myFunction() {
if (document.body.scrollTop > ((windowHeight)*6) || document.documentElement.scrollTop > ((windowHeight)*6)) {
      document.getElementById("s5").className = "pagelist active";
      document.getElementById("s6").className = "pagelist";
      document.getElementById("s4").className = "pagelist";
} else if (document.body.scrollTop > ((windowHeight)*5) || document.documentElement.scrollTop > ((windowHeight)*5)){
      document.getElementById("s4").className = "pagelist active";
      document.getElementById("s3").className = "pagelist";
      document.getElementById("s5").className = "pagelist";
} else if (document.body.scrollTop > ((windowHeight)*4) || document.documentElement.scrollTop > ((windowHeight)*4)){
      document.getElementById("s4").className = "pagelist active";
      document.getElementById("s3").className = "pagelist";
      document.getElementById("s5").className = "pagelist";
} else if (document.body.scrollTop > ((windowHeight)*3) || document.documentElement.scrollTop > ((windowHeight)*3)) {
      document.getElementById("s3").className = "pagelist active";
      document.getElementById("s2").className = "pagelist";
      document.getElementById("s4").className = "pagelist";
} else if (document.body.scrollTop > ((windowHeight)*2) || document.documentElement.scrollTop > ((windowHeight)*2)) {
      document.getElementById("s2").className = "pagelist active";
      document.getElementById("s1").className = "pagelist";
      document.getElementById("s3").className = "pagelist";
} else if (document.body.scrollTop > (windowHeight) || document.documentElement.scrollTop > (windowHeight)) {
      document.getElementById("s1").className = "pagelist active";
      document.getElementById("s0").className = "pagelist";
      document.getElementById("s2").className = "pagelist";
} else {
      document.getElementById("s0").className = "pagelist active";
      document.getElementById("s1").className = "pagelist";
      document.getElementById("s2").className = "pagelist";
      document.getElementById("s3").className = "pagelist";
      document.getElementById("s4").className = "pagelist";
      document.getElementById("s5").className = "pagelist";
}
}
/* dieser Abschnitt schaltet den ersten Seitenpunkt beim Laden der Seite aktiv. Mit windows.onscroll wird der erste Seitenpunkt nur aktiv, nachdem das erste Mal gescrollt wird. */
window.addEventListener('load', initFunction);
function initFunction() {
document.getElementById("s0").className = "pagelist active";
}
</script>

Danke für die Tipps und Hinweise.
 
Zurück
Oben