2 4 9 32 0 0 0

Bilder präsentieren über Diavorschau


Bild 1
Bild 2
Bild 3
Bild 4
Bild 5
Bild 6
Bild 7
Bild 8
Bild 9
Bild 10
Bild 11
Bild 12
../images_reihe/pic01_01.jpg 462
Kletterrosen am Haus

Mit dem Klick im Dia wird das jeweilige Bild aufgerufen. Die Diavorschau ist vertikal verschiebbar bis der jeweilge Pfeil verschwindet.

Obwohl das alles recht simpel daherkommt, wird die Erklärung doch recht umfangreich. UND! Ohne die Positionsübergabe der verschobenen Diareihe an das Elternfenster also die index.php, dass im iframe die main.php beinhaltet, würde die Verschiebung bei Anklicken immer wieder auf den Nullpunkt zurückspringen. WEIL: Der URL-Anhang PHP die Seite neu laden lässt.

Die Werte, die zur Berechnung benutzt werden, sind neben dem Bild unten zu sehen und nur zur Ansicht. Entscheidend sind die in das Elternfenster übertragenen Werte. Diese werden in span-Elementen gespeichert. Firefox erlaubt, wenn die Erweiterung „Web Developer“ geladen ist, über das Item „Erzeugten Quelltext anzeigen“ einen Einblick auf die Wertübertragung, der InternetExplorer mittels der F12-Taste, Chrome hat auch sowas über „Weitere Tools ▸ Entwicklertools“, Opera bietet über Steuerung+Shift+i diese Möglichkeit. Für Safari habe ich nichts dergleichen finden können. Ist aber auch nicht weiter schlimm. Die Wichtigsten können das.
Und nun folgt wieder, was zu erklären ist.
Begonnen wird wie in allen Beispielen mit dem Hauptthema „Bilder präsentieren“ mit dem Erfassen der Bilder. Es wird die Datei "../komponenten/picdir.php" vor allem anderen inkludiert. Diese ist in Teil1 bereits beschrieben. In den folgenden Elementen:

26 bis 33: dieser Seite
<section id="diaschau">
 <div id="aufundab">
  <span id="auf">&#x25B2;</span>
  <br /><span id="ab">&#x25BC;</span>
 </div>
 <div id="thumbnails" ><div id="dia" class="drag" >
  <?php 
  include "../komponenten/dia.php" ;
  echo $dia ;
  ?>
</div></div>
und 49: 
</section>
	

werden die erforderlichen Kindelemente deklariert und es erfolgt die Ausgabe von dia.php

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
/*dia 75px 56px*/
$ar_bildtitel = array() ;
asort ($ar_pic) ;
$dia '' ;
while (list (
$key$val) = each ($ar_pic)) {
 if (
$key == || $key == 0) {
 
$bild $val ;
 
$rahmen "class='thn_aktiv'" ;
 }
 
$pw $ar_picW[$key] ;
 
$ph $ar_picH[$key] ;
 
// an einer festen Breite orientieren
 
$koef $pw 74  ;  
 
$koef round($koef 10 ) / 10 ;
 
$pwk round($pw/$koef) ;
 
$pwk_k round(74/$pwk*100)/100 ;
 
$pwk round($pw/$koef).'px' ;
 
$phk round($ph/$koef)-;
 
$phk .= 'px' ;
 if ( 
$key == $thn ) {
    
$bild $val ;
    
$rahmen "class='thn_aktiv'" ;
 } else 
$rahmen "class='thn'" ;
 
$exif exif_read_data($val0true);
 
$ar_bildtitel[$key] = $exif["IFD0"]["ImageDescription"] ;
 echo 
"
 <style type='text/css'>
 #dia figure { clip: rect(0 
$pwk $phk 0); margin-bottom: 3px;} 
 </style>"
;
 
// Die anzuzeigenden Elemente zusammenbauen und die $style-Eigenschaft für #dia figure anwenden
$dia .= "<figure $rahmen >" ;
$dia .= "<a href='?k=$dir&s=$file&ogr=$og&grz=$grz&fnr=$filenr&thn=$key&a=$anav&m=$move'>" ;
$temp "height='$phk' width='$pwk' onclick='BILD(\"$val\", $key)'" ;
$dia .= "<img id='thn_$key' src='$val$temp border='0' alt='Bild $key'>" ;
$dia .= "</a>" ;
$dia .= "</figure>" ;
}
?>

In 1: wird lediglich das Idealmaß eines Dias notiert. Das wird so aber nicht vorkommen.
In 8: wird dem ersten Dia die CSS-Klasse eines aktivierten Dias übergeben.
Von 13 bis 19: werden die Bilder auf Diagröße zugeschnitten und die Größen für die 28: bestimmt.
20 bis 23: Wenn der Schlüssel mit der Bildnummer übereinstimmt, ist es ein ausgewähltes Dia und ansonsten nicht.
21: Die Variable $bild erhält für die Elemente:

41 bis 44: dieser Seite
<div class='kontroll'>
  <span id="startbild"><?php echo $bild ; ?></span>
  <span id="bildW"><?php echo $ar_picW[$thn] ; ?></span>
</div> 

den Pfad zur Darstellung. Die IDs bildpfad und bildW werden später im JavaScript benötigt.

46 bis 49: dieser Seite
<div id="bildcontain">
  <div id="bild"></div>
  <div id="bildtitel" class="southerni"><?php echo $ar_bildtitel[$thn] ; ?></div>
</div>
Die southerni-CSS-Klasse bestimmt den Schrifttyp .woff

In 25: wird der Bildtext aus der Bilddatei gelesen.
In 32: sind im URL-Anhang &a=$anav&m=$move, die nicht zum regulären Gebrauch gehören. Sie dienen dem Verhalten bei Verwendung der alternativen Navigation: PHP Sammelsurium Navigation
Bevor es mit Javascript weitergeht, soll aber noch CSS beschrieben sein. Dafür stelle ich die dia.css noch vor.

00
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/* DATEI: dia.css */
#diaschau { position: absolute; top: 30px; left: 50px; bottom: 0; width: 900px; height: 600px; 
    z-index: 2; overflow: hidden; }
#thumbnails { background-image: url(../imagesglobal/Filmstreifen.jpg); 
    background-repeat: repeat-y; 
    position: absolute; top: 20px; left: 20px; bottom: 30px; width: 110px; height: auto; z-index: 2; 
    overflow: hidden; border: solid 1px black; }
#bildcontain{ position: absolute; top: 0; left: 135px; width: 710px; height: 100%; z-index: 1; }
#bild { text-align: center; position: absolute; top: 0; left: 30px; width: 600px; height: 600px; }
#dia{ position: absolute; top: 0; left: 17px; width: 76px; height: auto; margin: 0; padding: 0; cursor: move; }
/* individualisieren #dia figure { clip: rect(0 75px 56px 0); } */
.drag{ position: absolute; cursor: move; }
#aufundab{ position: absolute; top: 40%; left: 0; width: 20px; height: auto; }
#auf{ font-size: 16px; left: 0; width: 13px; }
#ab{ font-size: 16px; width: 13px; }
.bildformat { border-color: #999 black black #999; border-style: solid; border-width: 2px; }
#bildtitel{ font-size: 18px; background-color: rgba(255,255,100,0.4); 
    text-align: center; position: absolute; top: 2px; left: 30px; width: 600px; height: 28px; 
    z-index: 3; padding-top: 5px; }
#dia > .thn_aktiv { text-align: center; position: relative; left: 0; margin: 0 0 4px; padding: 0; 
    border-color: #be0000 #ece #ece #be0000; border-style: solid; border-width: 1px; }
#dia > .thn { text-align: center; position: relative; margin: 0 0 4px; padding: 0; border: solid 1px gray; }
#dia > figure { position: relative; margin-bottom: 3px; display: block; }

Eine Erläuterung hierzu vielleicht:.
In 10: ist die Anweisung auskommentiert, weil dies mittels PHP geschehen soll. Bei gleichformatigen Bildern und gleichem Seitenverhältnis wäre es allerdings ok und könnte so stehen bleiben. So ist es aber nicht.

Da nun zwar mehr JavaScript folgt, als PHP zur Anwendung kommt, möchte ich den Themenkreis rund um Bilder dennoch nicht zerreißen. Dies Beispiel hätte also auch gut im Hauptthema JavaScript gepasst.

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* bilder.js */
var dateipfad document.getElementById("startbild").innerHTML ;
var 
Bild = new Image();
Bild.src dateipfad ;  
var 
bildbereich document.getElementById("bild");

function 
BILD(bildidentbildnr){
  
Bild.src bildident ;
  
bildbereich.lastChild.src=Bild.src
  
bildnr_alt bildnr ;
}

function 
BILDINIT() {
  if (
document.createElement && bildbereich.appendChild) {
  var 
img document.createElement("img");
  
img.setAttribute("src"Bild.src);
  
bildbereich.appendChild(img);
  
img.className "bildformat" ;
  
bildnr_alt =  ;
  }  
}
BILDINIT() ;

Die Funktion BILD(bildident, bildnr) wird aus der Datei dia.php 33: aufgerufen. Ob es hier etwas zu erklären gibt, weiß ich nicht. Die externe Datei bilder.js wird am Ende der Datei referenziert, da alle anzusprechenden Elemente bereits erfasst sein müssen. So wie auch das nächste Script drag.js. Da es sich hierbei um eine anonyme Funktion handelt, wird sie nicht explizit aufgerufen. Manchmal wundere ich mich immer noch, wie das geht, aber es funktioniert und auf neudeutsch: es funzt! Auch hier stütze ich mich auf eine bereits beschriebene Funktion, die ich für meine Bedingungen anpassen musste. Das betrifft alle Wertweitergaben an das Elternfenster sowie folglich auch deren aktuelle Abfrage.

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/* drag.js anonyme Funktion*/
( function(){
var 
dragObject null
var 
start = [ ] ;
var 
pos = [ ] ;
var 
poskor ;
var 
ypos ;
var 
ypos ;
var 
auf ;
var 
ab ;
var 
opac ;
var 
restdia 80 // Wieweit darf das dia-Element noch rausgucken
var obj_auf document.getElementById("auf") ;
var 
obj_ab document.getElementById("ab") ;
var 
dia_h document.getElementById("dia").offsetHeight ;
var 
th_h document.getElementById("thumbnails").offsetHeight ;
ab th_h restdia ;
auf dia_h restdia ;
var 
thy ;
function 
DRAG_START(e){
// Position des Elements
  
start GET_POS(this);
// Position des Events
  
var evt_pos GET_EVENT_POS(e);
  
parent.document.getElementById("lydrag").innerHTML evt_pos[0]*;
// Die Startposition: das muss außerhalb des iFrames erfasst werden, 
// wie auch dia_Abstand zum Elternelement "thumbnails" 
  
ypos document.getElementById("dia").offsetTop ;
  
parent.document.getElementById("top").innerHTML ypos ;
  
parent.document.getElementById("ly").innerHTML start[0] ;
  
document.getElementById("ly").innerHTML start[0] ;
  if ( 
ypos != parent.document.getElementById("ly").innerHTML ){
   
start[0] -= parent.document.getElementById("ly").innerHTML  
  }else{
   
start[0] -= evt_pos[0];
  } 
  
start[0] -= evt_pos[0];
// nicht verwirren lassen. ich bin schon verwirrt genug, 
// dass ich nach der wenn-Abfrage start[0] wie wenn gleich nochmals start[0] -= evt_pos[0]; anweisen muss.
// Kommentiere ich entweder Zeile 32, 34 oder 36 aus, springt das dia-element unkontrolliert.
// Ich nehme es also so hin. Eine Erklärung hab ich nicht!
  
document.getElementById("top").innerHTML ypos ;
  
document.getElementById("drag").innerHTML evt_pos[0] ;
// Das Dragobjekt bestimmen, das hätte auch mit document.getElementById("dia") gemacht werden können.
  
dragObject this;
  
document.onmouseup END_DRAG ;
  
document.onmousemove DO_DRAG 
  
thy document.getElementById("thumbnails").offsetTop ypos -20 ;
// ist wichtig, da ansonsten nicht gedraggt wird.
  
return false;
}

function 
DO_DRAG(e) {
 if(!
dragObject) return;
// Position des Events
  
pos GET_EVENT_POS(e);
  
dragObject.style.left 17 'px';
  
poskor parent.document.getElementById("lydrag").innerHTML*1  ;
  
ypos = (pos[0]*1)+(start[0]*1)+poskor ;
  
dragObject.style.top ypos 'px';
  
thy document.getElementById("thumbnails").offsetTop ypos -20 ;  
  
parent.document.getElementById("top").innerHTML ypos ;
// das ist nur eine Kontrollweitergabe. Sie diente zur Beobachtung der Dreickpfeile
  
parent.document.getElementById("wert").innerHTML "auf ab "+auf+' '+ab+' / '+thy ;
// Bedingung nicht aus dem Diabereich rausschieben zu können. Dat kricht man sonst nich mehr anjefasst.
// UND die Pfeile verändern ihr Aussehen bis sie ganz verschwinden.
// Ich weiß doch, dass ich verspielt bin. Ich finde es halt hüpsch! Und ist auch was von mir.
// Nur kupfern finde ich blöde und uninteressant!
  
PFEIL() ;
// Ausgabe an Tabelle neben dem Bild - braucht man nicht, ist nur zur Demonstration.
  
document.getElementById("top").innerHTML parent.document.getElementById("top").innerHTML ;
  
document.getElementById("drag").innerHTML poskor ;
  
document.getElementById("ly").innerHTML thy ;
  return 
false;
}
function 
PFEIL (){
if (( 
ab ypos ) < 200 ){
  
opac = ( ab ypos )/200 ;
  
obj_ab.style.opacity opac;
  
obj_ab.style.MozOpacity opac;
  
obj_ab.style.filter "alpha(opacity=" + (opac*100) + ")"
   if ( 
ab <= thy )  {
    
obj_ab.style.visibility "hidden" ;
    
dragObject.style.top ab 'px';
    
parent.document.getElementById("top").innerHTML ab ;
   } else 
obj_auf.style.visibility "visible" ;
  }
  if (( 
auf ypos ) < 200 ){
  
opac = ( auf ypos )/200 ;
  
obj_auf.style.opacity opac;
  
obj_auf.style.MozOpacity opac;
  
obj_auf.style.filter "alpha(opacity=" + (opac*100) + ")";
   if ( 
auf <= thy*-)  {
    
dragObject.style.top =  -(dia_h restdia) + 'px';
    
obj_auf.style.visibility "hidden" ;
    
parent.document.getElementById("top").innerHTML = -auf ;
   } else 
obj_auf.style.visibility "visible" ;
  }
}
// Ab hier - ist nichts mehr von mir. Reime dich oder ich schlag dich.
// Das haben einfach klügere Leute entwickelt.
function END_DRAG(e) {
  
document.onmouseup null;
  
document.onmousemove null;
  
dragObject null
  
return false;
}
window.onload = function() {
  var 
all document.getElementsByTagName('*');
  for(var 
0all.lengthi++)
  if(
all[i].className && all[i].className.indexOf('drag') > -1){
   
all[i].onmousedown DRAG_START;
   
all[i].style.cursor 'move';
  };
}
// Hilfsfunktionen: // Rueckgabewert: [top, left] 
function GET_POS(o) {
    var 
0;
    var 
;
    if(
typeof o.offsetTop != 'undefined'){
         
+= o.offsetTop;
         
+= o.offsetLeft;
    }
    return [
tl];
}
function 
GET_EVENT_POS(e) {
    if(!
ewindow.event;
    var 
e.pageY e.pageY e.clientY window.document.body.scrollTop;
    var 
e.pageX e.pageX e.clientX window.document.body.scrollLeft;
    return [
tl];
}
window.onblur = function(){END_DRAG();};
    
window.document.onmouseout = function(e)
    {
    if(!
eewindow.event;
    var 
target e.target || e.srcElement;
    
window.status = (target.tagName);
    if( 
target && target == dragObject) { END_DRAG(e);}
    };
})() 
// Ende der anonymen Funktion

Ok, nachvollziehen kann ich das Script im Urzustand, aber um Himmelswillen nicht darauf kommen! Ich finde allerdings auch die Quelle nicht mehr, um auf den oder die Urheber hinzuweisen.
Jetzt folgt nur noch interner JavaScript, um nach jedem Neuladen der Seite alle Bedingungen vorher zu fixieren.

134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
    <script type="text/javascript" language="JavaScript" src="../js/bilder.js"></script>
    <script type="text/javascript" src="../js/drag.js"></script>
<script type="text/javascript">
var tpos = parent.document.getElementById("top").innerHTML ;
var obj_dia = document.getElementById("dia") ;
obj_dia.style.top = tpos + 'px';
var ypos = parent.document.getElementById("top").innerHTML *1 ;
var drag = parent.document.getElementById("lydrag").innerHTML ;
var ly = parent.document.getElementById("ly").innerHTML ;
document.getElementById("top").innerHTML = ypos ;
document.getElementById("drag").innerHTML = drag ;
document.getElementById("ly").innerHTML = ly ;
//Dreipfeile initialisieren
var obj_auf = document.getElementById("auf") ;
var obj_ab = document.getElementById("ab") ;
var restdia = 80 ; // auch hier nochmals bestimmen, wie die Dreieckpfeile zu behandeln sind.
var dia_h = document.getElementById("dia").offsetHeight ;
var th_h = document.getElementById("thumbnails").offsetHeight ;
var ab = (th_h*1) - restdia ;
var auf = (dia_h*1) - restdia ;
var thy = (document.getElementById("thumbnails").offsetTop *1) + (ypos *1) -20 ;
// die Funktion enthält nur noch die Eigenschaften für Deckkraft und Sichtbarkeit.
function PFEIL (){
 if (( ab - ypos ) < 200 ){
  opac = ( ab - ypos )/200 ;
  obj_ab.style.opacity = opac;
  obj_ab.style.MozOpacity = opac;
  obj_ab.style.filter = "alpha(opacity=" + (opac*100) + ")"; 
   if ( ab <= thy ) {
    obj_ab.style.visibility = "hidden" ;
   } else obj_auf.style.visibility = "visible" ;
 }
 if (( auf + ypos ) < 200 ){
  opac = ( auf + ypos )/200 ;
  obj_auf.style.opacity = opac;
  obj_auf.style.MozOpacity = opac;
  obj_auf.style.filter = "alpha(opacity=" + (opac*100) + ")";
   if ( auf <= thy*-1 )    {
    obj_auf.style.visibility = "hidden" ;
   } else obj_auf.style.visibility = "visible" ;
 }
}
PFEIL() ;
//bw 600 manuell ohne Abfrage, da es statisch bleiben wird.
var obj_bw = document.getElementById("bildW").innerHTML ;
var bildx = (600-obj_bw)/2+30 ; //Bild horizontal zentriert anordnen
var obj_bt = document.getElementById("bildtitel") ;
obj_bt.style.left = bildx+'px'

Und somit sind wir am Ende.




Dokument geändert am: 14. Dez. 2017 16:41