Manipular el DOM amb JavaScript

Índex
- 1.Manipular la pàgina web
- 1.1.Les característiques del client
- 1.2.Les finestres
- 1.3.Els marcs
- 1.4.Navegació i menús
- 2.Formularis dinàmics
- 3.Posicionament dinàmic
- 3.1.Propietats CSS de posicionament
- 3.2.Una mica d'història: navegadors 4.x
- 3.2.1.Capes a Netscape 4
- 3.2.2.Capes a Internet Explorer 4
- 3.3.CSS-P en navegadors DOM W3C
- 3.4.Posicionament cross-platform
- 3.4.1.Detectar el navegador
- 3.5.Fonaments de l'animació
- 3.5.1.Posicionament
- 3.5.2.Pas i grandària del recinte
- 3.5.3.Temporització
- 3.6.Aplicacions simples de CSS-P
- 3.6.1.Animació en línia recta
- 3.6.2.Animació circular
- 3.6.3.Crear un menú desplegable amb jQuery
- 3.7.Manipulació dinàmica dels fulls d'estil
- Activitats
1.Manipular la pàgina web
-
Les característiques del client.
-
Les finestres.
-
Els marcs.
-
La navegació i el pas de variables.
1.1.Les característiques del client
1.1.1.Consultar el navegador
-
Netscape quan el client és Firefox, Safari o Chrome.
-
Microsoft Internet Explorer quan el client és Internet Explorer.
-
La subcadena MSIE identifica Internet Explorer i va seguida d'un espai i el número de versió del navegador.
-
La subcadena Gecko identifica el motor implementat en el navegador. Aquest motor s'utilitza en els navegadors Mozilla, Netscape, Firefox i Camino.
-
Si apareix la subcadena Safari i no apareix Chrome, s'està indicant que el motor implementat en el navegador és el de Safari.
-
La subcadena Opera identifica que el navegador és Opera.
-
La subcadena Chrome indica que el navegador és Chrome.
var agent = navigator.userAgent; if (agent.indexOf(subcadena) != -1)
1.1.2.Consultar el sistema operatiu
-
Win en el cas d'entorns Microsoft.
-
Mac en el cas d'entorns Macintosh.
-
X11 en el cas d'entorns basats en Unix.
1.1.3.Consultar si el navegador suporta W3C DOM
var fitxerCSS; if (document.implementation.hasFeature("CSS2","2.0")){ fitxerCSS = "estilCSS2.css"; } else { fitxerCSS = "estilCSS1.css"; } document.write(" ");(<link rel='stylesheet' type='text/css' href='"+fitxerCSS +"'>");
1.2.Les finestres
-
Modificar el marc de la finestra actual; encara que es pot redimensionar i situar la finestra del navegador, no es poden agregar o eliminar els components que formen el marc (barra de menú, estat, scroll, etc.). Això només es pot fer en finestres que es creen des d'un script.
-
Tancar la finestra principal des d'un script que s'executa en una subfinestra; si es fa la crida, apareix un quadre de diàleg que demana permís a l'usuari per a tancar-la.
-
Tancar finestres que no ha creat un script. De fet, no es pot accedir a finestres que no s'han creat des d'un script. No hi ha una array amb les finestres existents.
-
Accedir a propietats de Document des d'altres finestres que procedeixen d'altres dominis, és a dir, no es pot accedir a dades d'una pàgina HTML des d'una altra pàgina si aquestes dades no procedeixen del mateix domini.
-
Capturar la pulsació dels botons del navegador. Això permet controlar des d'un script el comportament del navegador i és realment perillós.
-
Canviar l'adreça de la barra d'adreces; només es pot carregar una pàgina nova, però en canvi amb una pàgina carregada no es pot modificar l'URL d'aquesta pàgina (d'alguna manera, se n'estaria suplantant la identitat).
-
Modificar elements de la llista de favorits.
1.2.1.Posicionar i maximitzar la finestra principal
<html> <head> <script type="text/javascript"> function obriF() { finestra=window.open('','','width=200,height=100'); finestra.document.write("La meva finestra"); } function maximitza() { finestra.moveTo(0,0); finestra.resizeTo(screen.availWidth,screen.availHeight); finestra.focus(); } </script> </head> <body> <input type="button" value="Crea la finestra" onclick="obriF()" /> <br /><br /> <input type="button" value="Maximitza finestra" onclick="maximitza()" /> </body> </html>
-
En primer lloc, se situa la finestra a la part superior esquerra amb la sentència moveTo(0,0).
-
En segon lloc, es canvia la grandària al valor màxim disponible d'amplària i alçària. Aquests dos valors s'aconsegueixen a partir de les propietats availWidth i availHeight de l'objecte Screen.
1.2.2.Crear una finestra nova i assignar-hi el focus
var novaFinestra = window.open("Pàgina1.html", "Nova pàgina", "status,menubar,height=400,width=300");
var novaFinestra; function portaLaFinestra(url){ if (!novaFinestra || novaFinestra.closed) { novaFinestra = window.open(url, "Nova", "status, height=200, width=300"); } else { novaFinestra.focus(); } }
1.2.3.Comunicació entre finestres
<html> <script type="text/JavaScript"> //Es defineix una variable global que emmagatzemarà una referència a la finestra var novaFinestra; //La funció següent genera i omple de contingut la finestra nova function creaFinestra(){ //Comprovem que no estigui creada if (!novaFinestra || novaFinestra.closed) { novaFinestra = window.open("","Nova", "status, height=200, width=300"); //Endarrerim l'escriptura 50 ms per evitar problemes setTimeout("pintaFinestra()",50); } else if (novaFinestra.focus) { //La finestra és oberta i és accessible; es porta al primer pla novaFinestra.focus(); } } function pintaFinestra(){ //Muntem el contingut de la finestra nova var contingut = "<html><head><title>Segona finestra</title></head>"; contingut += "<body><h1>Finestra creada des d'un script</h1>"; contingut += "</body></html>"; //S'escriu l'HTML en el document nou de la finestra novaFinestra.document.write(contingut); novaFinestra.document.close(); } </script> </head> <body> <form> <input type="button" value="Crea finestra" id= "BT1" onclick="creaFinestra();"/> </form> </body> </html>
window.opener.document.forms[0].BT1.value
if (typeof window.opener == "object") { //La finestra ha estat oberta per un script }
1.3.Els marcs
-
Encadenant les crides window.frames[1].frames[0] s'accedeix a un marc situat en dos nivells en la jerarquia.
-
Amb la propietat parent s'accedeix al contenidor superior del marc que fa la crida: parent.frames[1], que fa referència al segon frame de l'estructura.
-
Amb la propietat top s'accedeix al contenidor suprem, és a dir, el que és a dalt de tot de la jerarquia.
-
No es pot accedir a les propietats d'un document des d'un altre marc si les pàgines pertanyen a dominis diferents.
-
No es pot canviar l'URL de la barra d'adreces; aquesta mostra l'adreça del document que conté l'estructura dels marcs i no l'adreça de la pàgina d'un dels marcs.
-
No es pot introduir en l'array de Favorits l'URL d'un dels documents carregat en un dels marcs; l'URL és el de la pàgina que conté l'estructura de marcs.
1.3.1.Crear un marc buit
<html> <head> <script type="text/JavaScript"> function marcBuit(){ return "<html><body></body></html>"; } </script> </head> <frameset rows= "50,*"> <frame name="frame1" id="frame1" src="menu.html"> <frame name="frame2" id="frame2" src="JavaScript:parent.marcBuit()"> </frameset> </html>
1.3.2.Assegurar que una pàgina carrega l'estructura de marcs
if (top.location.href == self.location.href) { top.location.href ="conjuntMarcs.html"; }
1.3.3.Canviar el contingut d'un marc des d'un altre
parent.altreFrame.location.href = "novaPàgina";
parent.altreFrame.document.write = "Introduïm aquí el codi HTML que vulguem";
function carregaMarcs(url1, url2) { parent.altreFrame1.location.href = url1; parent.altreFrame2.location.href = url2; return false; }
1.3.4.Substituir una estructura de marcs per una pàgina
top.location.href = "novaPàgina.html"
1.3.5.Evitar que una pàgina es carregui en un marc
if (top != self) { top.location.href = location.href; }
1.4.Navegació i menús
1.4.1.Carregar una pàgina nova o un enllaç intern
location.href = "https://www.uoc.edu";
location.hash = "fase3";
-
Cada opció de la llista desplegable ha d'emmagatzemar en la propietat value la destinació associada al valor.
-
S'ha d'associar un controlador d'esdeveniments a l'objecte Select que llanci la funció que realment obre la destinació nova seleccionada.
-
S'ha de crear la funció que manejarà l'esdeveniment anterior i que s'encarregarà de carregar la pàgina nova al navegador.
<select name="destinacions" id="destinacions" onchange="navega(this)"> <option value = "">Tria la teva destinació:</option > <option value="https://www.barbados.com/">Illes Barbados</option > <option value="https://www.formentera.es">Formentera</option> </select>
function navega(eleccio){ var url = destinacions.options[destinacions.selectedIndex].value; if (url) { location.href = url; } }
document.getElementById("destinacions").onchange = navega;
function navega(esdeveniment){ esdeveniment=(esdeveniment) ? esdeveniment : ((event) ? event : null); if (esdeveniment) { var element = (esdeveniment.target) ? esdeveniment.target : ((esdeveniment.srcElement) ? esdeveniment.srcElement : null); if (element && element.tagName.toLowerCase() == "select" && element.value) { location.href = element.value; } } }
1.4.2.Pas de variables entre pàgines
<script type="text/JavaScript"> function guardaDades() { var dades = document.forms[0].nom.value; assignaCookie("Nom",dades,30); } </script>
<body onunload = "guardaDades()">
<script type = "text/JavaScript"> function recuperaValors() { extreuCookies(); var nom = cookies["Nom"]; } </script>
<body onload = "recuperaValors()">
<script type = "text/JavaScript"> function emmagatzemaDades() { top.nom = document.forms[0].nom.value; } </script>
<body onunload="emmagatzemaDades()">
<script type="text/JavaScript"> function llegeixValors(){ if (typeof top.nom != "undefined") { document.forms[0].nom.value = top.nom; } } </script>
<body onload="llegeixValors()">
<script type="text/JavaScript"> function navega(url) { var dadesApassar = document.forms[0].nom.value; location.href = url + "?" + encodeURIComponent(dadesApassar); } </script>
<a href="paginaFinal.html" onclick="navega('paginaFinal.html'); return false">...</a>
<script type="text/JavaScript"> function llegeixDades() { var buscaCadena = decodeURIComponent(location.search.substring(1, location.search.length)); if (buscaCadena.length > 0) { document.forms[0].userName.value = buscaCadena; } } </script>
<body onload="llegeixDades()">
2.Formularis dinàmics
-
Controlar el cursor i el focus.
-
Controlar els camps del formulari.
-
Validar camps.
2.1.Controlar el cursor i el focus
2.1.1.Enviar el cursor a un camp determinat
<body onload="document.formulari.camp.focus()">
<body onload="document.formulari.camp.focus(); document.formulari.camp.select() " >
function assignaFocus(nomForm, nomCamp) { var element = document.forms[nomForm].elements[nomCamp]; element.focus(); element.select(); }
2.1.2.Avançar el focus amb la tecla Retorn
<input type="text" name="camp1" id="camp1" onkeypress="return seguentFocus(this.form, 'camp2', event)">
-
En primer lloc, s'ha de comprovar que la tecla pitjada és Retorn, que té els codis ASCII 13 i 3.
-
En segon lloc, aplica el focus al camp següent que s'ha passat com a paràmetre de la funció:
function seguentFocus(form, seguentCamp, evt) { evt = (evt) ? evt : event; var codCaracter = (evt.charCode) ? evt.charCode : ((evt.which) ? evt.which : evt.keyCode); if (codCaracter == 13 || codCaracter == 3) { form.elements[seguentCamp].focus(); return false; } return true; }
2.1.3.Enviar formularis amb la tecla Retorn
<html> <head> </head> <body> <form id="formulari"> <P> <LABEL for="nom">Nom: </LABEL> <INPUT type="text" id="nombre"><BR> <LABEL for=" cognom">Apellido: </LABEL> <INPUT type="text" id="cognom"><BR> <LABEL for="correuelectronic"> correu electrònic: </LABEL> <INPUT type="text" id="email"><BR> <INPUT type="radio" name="sexe" value="Home" onkeypress="return tramesaAmbEnter(event)"> Home<BR> <INPUT type="radio" name="sexe" value="Dona" onkeypress="return tramesaAmbEnter(event)"> Dona<BR> </P> </form> <script type="text/javascript"> function tramesaAmbEnter(evt){ evt = (evt) ? evt : event; var destinacio = (evt.target) ? evt.target : evt.srcElement; var codCaracter = (evt.charCode) ? evt.charCode : ((evt.which) ? evt.which : evt.keyCode); if (codCaracter == 13 || codCaracter == 3) { formulari.submit(); } } </script> </body> </html>
onkeypress="return tramesaAmbEnter(event)"
2.1.4.Tabulació automàtica
<html> <head> </head> <body> <form id="formulari" onsubmit="return false"> Número de la targeta: <input type="text" id="nt1" size="5" maxlength="4" onkeyup="mouFocus(this, 'nt2', event)" /> <input type="text" id="nt2" size="5" maxlength="4" onkeyup="mouFocus(this, 'nt3', event)" /> <input type="text" id="nt3" size="5" maxlength="4" onkeyup="mouFocus(this, 'nt4', event)" /> <input type="text" id="nt4" size="5" maxlength="4" /> </form> <script type="text/javascript"> function mouFocus(camp, seguent, evt){ evt = (evt) ? evt : event; var codCaracter = (evt.charCode) ? evt.charCode : ((evt.keyCode) ? evt.keyCode : (( evt.which) ? evt.which : 0)); if (codCaracter >31 && camp.value.length == camp.maxLength) { camp.form.elements[seguent].focus(); } } </script> </body> </html>
2.2.Control dels camps del formulari
2.2.1.Desactivar camps
document.formulari.campText.disabled = true;
document.formulari.campText.disabled = false;
2.2.2.Ocultar i mostrar controls
<form name="qüestionari"> ... <p>3. Vols conèixer els models nous?<br /> <input type="radio" id="resp0" name="resposta" onclick="gestDecision(event)" />No <input type="radio" id="resp1" name="resposta" onclick="gestDecision(event)" />Sí <div id="coneixerModels" style="display:none; margin-left:20px"> </p> <p> 3a. Quina és la teva marca preferida? <select name="models"> <option value="">Tria'n un:</option > <option value="1">Ferrari</option> <option value="2">Mercedes</option> <option value="3">BMW</option> </select> </p> </div> <p>4. Quants anys té el teu vehicle actual? <select name="edatVehicle"> <option value="">Tria una opció:</option> <option value="1">Menys de 3 anys:</option> <option value="2">Entre 3 i 7 anys</option> <option value="3">Més de 7 anys</option> </select> </p> ... </form>
function gestDecision(evt) { evt = (evt) ? evt : event; var camp = (evt.target) ? evt.target : evt.srcElement; var capa = document.getElementById("coneixerModels"); if (camp.id =="resp1") { capa.style.display = "block"; } else { capa.style.display = "none"; } }
2.2.3.Permetre només un tipus de dades en un camp
function nomesNumeros(evt){ evt = (evt) ? evt : event; var codCaracter = (evt.keyCode) ? evt.keyCode : (evt.which) ? evt.which : 0; if (codCaracter >31 && (codCaracter <48 || codCaracter >57)) { alert("Introdueix només valors numèrics!!!"); return false; } return true; }
function nomesLletres(evt){ evt = (evt) ? evt : event; var codCaracter = (evt.keyCode) ? evt.keyCode : (evt.which) ? evt.which : 0; if (codCaracter >31 && (codCaracter <65 || codCaracter >90) && (codCaracter <97 || codCaracter >122)) { alert("Introdueix només lletres!!!"); return false; } return true; }
function nomesYoN(evt){ evt = (evt) ? evt : event; var codCaracter = (evt.keyCode) ? evt.keyCode : (evt.which) ? evt.which : 0; if (codCaracter > 31 && codCaracter != 78 && codCaracter != 89 && codCaracter != 110 && codCaracter != 121) { alert("Introdueix només els valors 'Y' o 'N'"); return false; } return true; }
<input type="text" name="valor" size="2" maxlength="1" onkeypress="return nomesYoN(event)" /> (Y/N)
Caràcters no imprimibles |
Caràcters imprimibles |
|||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Nom |
Dec. |
Hex. |
Car. |
Dec. |
Hex. |
Car. |
Dec. |
Hex. |
Car. |
Dec. |
Hex. |
Car. |
Nul |
0 |
00 |
NUL |
32 |
20 |
Espai |
64 |
40 |
@ |
96 |
60 |
` |
Inici de capçalera |
1 |
01 |
SOH |
33 |
21 |
! |
65 |
41 |
A |
97 |
61 |
a |
Inici de text |
2 |
02 |
STX |
34 |
22 |
" |
66 |
42 |
B |
98 |
62 |
b |
Final de text |
3 |
03 |
ETX |
35 |
23 |
# |
67 |
43 |
C |
99 |
63 |
c |
Final de transmissió |
4 |
04 |
EOT |
36 |
24 |
$ |
68 |
44 |
D |
100 |
64 |
d |
enquiry |
5 |
05 |
ENQ |
37 |
25 |
% |
69 |
45 |
E |
101 |
65 |
e |
acknowledge |
6 |
06 |
ACK |
38 |
26 |
& |
70 |
46 |
F |
102 |
66 |
f |
Campaneta (beep) |
7 |
07 |
BEL |
39 |
27 |
' |
71 |
47 |
G |
103 |
67 |
g |
backspace |
8 |
08 |
BS |
40 |
28 |
( |
72 |
48 |
H |
104 |
68 |
h |
Tabulador horitzontal |
9 |
09 |
HT |
41 |
29 |
) |
73 |
49 |
I |
105 |
69 |
i |
Salt de línia |
10 |
0A |
LF |
42 |
2A |
* |
74 |
4A |
J |
106 |
6A |
j |
Tabulador vertical |
11 |
0B |
VT |
43 |
2B |
+ |
75 |
4B |
K |
107 |
6B |
k |
Salt de pàgina |
12 |
0C |
FF |
44 |
2C |
, |
76 |
4C |
L |
108 |
6C |
l |
Retorn |
13 |
0D |
CR |
45 |
2D |
- |
77 |
4D |
M |
109 |
6D |
m |
Shift fora |
14 |
0E |
SOTA |
46 |
2E |
. |
78 |
4E |
N |
110 |
6E |
n |
Shift dins |
15 |
0F |
SI |
47 |
2F |
/ |
79 |
4F |
O |
111 |
6F |
o |
Escapada línia de dades |
16 |
10 |
DLE |
48 |
30 |
0 |
80 |
50 |
P |
112 |
70 |
p |
Control dispositiu 1 |
17 |
11 |
DC1 |
49 |
31 |
1 |
81 |
51 |
Q |
113 |
71 |
q |
Control dispositiu 2 |
18 |
12 |
DC2 |
50 |
32 |
2 |
82 |
52 |
R |
114 |
72 |
r |
Control dispositiu 3 |
19 |
13 |
DC3 |
51 |
33 |
3 |
83 |
53 |
S |
115 |
73 |
s |
Control dispositiu 4 |
20 |
14 |
DC4 |
52 |
34 |
4 |
84 |
54 |
T |
116 |
74 |
t |
neg acknowledge |
21 |
15 |
NAK |
53 |
35 |
5 |
85 |
55 |
U |
117 |
75 |
u |
Sincronisme |
22 |
16 |
SYN |
54 |
36 |
6 |
86 |
56 |
V |
118 |
76 |
v |
Final bloc transmès |
23 |
17 |
ETB |
55 |
37 |
7 |
87 |
57 |
W |
119 |
77 |
w |
Cancel·lar |
24 |
18 |
CAN |
56 |
38 |
8 |
88 |
58 |
X |
120 |
78 |
x |
Final mitjà |
25 |
19 |
EM |
57 |
39 |
9 |
89 |
59 |
Y |
121 |
79 |
y |
Substitut |
26 |
1A |
SUB |
58 |
3A |
: |
90 |
5A |
Z |
122 |
7A |
z |
Escapada |
27 |
1B |
ESC |
59 |
3B |
; |
91 |
5B |
[ |
123 |
7B |
{ |
Separador arxius |
28 |
1C |
FS |
60 |
3C |
< |
92 |
5C |
\ |
124 |
7C |
| |
Separador grups |
29 |
1D |
GS |
61 |
3D |
= |
93 |
5D |
] |
125 |
7D |
} |
Separador registres |
30 |
1E |
RS |
62 |
3E |
> |
94 |
5E |
^ |
126 |
7E |
~ |
Separador unitats |
31 |
1F |
US |
63 |
3F |
? |
95 |
5F |
_ |
127 |
7F |
DEL |
2.3.Validar camps
<input type = "text" size = "30" id = "correuE" onchange = "esCorreuOK(this)" />
-
noBuit(): comprova que el camp de text conté com a mínim un caràcter;
-
esNumeric(): comprova que el contingut del camp de text és un valor numèric;
-
longitud(): comprova que el camp conté exactament dotze caràcters;
-
esCorreuE(): comprova que el contingut del camp té el format d'una adreça electrònica.
function noBuit(elem) { var cadena = elem.value; if(cadena == null || cadena.length == 0) { alert("Atenció, el camp és obligatori.") return false; } else { return true; } }
function esNumeric(elem) { var cadena = elem.value; var unDecimal = false; var unCaracter = 0; //S'assegura que el contingut és en format string cadena = cadena.toString(); for (var i = 0; i < cadena.length; i++) { unCaracter = cadena.charAt(i).charCodeAt(0); // Es comprova si té un signe negatiu en el primer caràcter if (unCaracter == 45) { if (i == 0) { continue; } else { alert("Només el primer caracter pot ser el signe negatiu."); return false; } } // Es comprova el punt decimal if (unCaracter == 46) { if (!unDecimal) { unDecimal = true; continue; } else { alert("Només un punt decimal en un número."); return false; } } //No s'admeten caràcters fora del rang 0-9 if (unCaracter <48 || unCaracter >57) { alert("Introdueix només números."); return false; } } return true; }
function longitud(elem,long) { var cadena = elem.value; var long = parseInt(long); if (cadena.length != long) { alert("El camp no conté els "+ long +" caràcters requerits"); return false; } else { return true; } }
function esCorreuE(elem) { var cadena = elem.value; cadena = cadena.toLowerCase(); if (cadena.indexOf("@") >1) { var addr = cadena.substring(0, cadena.indexOf("@")); var domini = cadena.substring(cadena.indexOf("@") +1, cadena.length); // Cal almenys un domini en la cadena de l'adreça if (domini.indexOf(".") == -1) { alert("Verifica que el domini és correcte"); return false; } // Es revisa caràcter per caràcter for (var i = 0; i < addr.length; i++) { unCaracter = addr.charAt(i).charCodeAt(0); // En aquesta porció no es permet el punt if ((i == 0 && (unCaracter == 45 || unCaracter == 46)) || (i == addr.length -1 && unCaracter == 46)) { alert("Verifica la porció del nom d'usuari"); return false; } //Es comproven caràcters vàlids (- . _ 0-9 a-z) if (unCaracter == 45 || unCaracter == 46 || unCaracter == 95 || (unCaracter >47 && unCaracter <58) || (unCaracter >96 && unCaracter <123)) { continue; } else { alert("Verifica la porció del nom d'usuari."); return false; } } for (i = 0; i < domini.length; i++) { unCaracter = domini.charAt(i).charCodeAt(0); if ((i == 0 && (unCaracter == 45 || unCaracter == 46)) || ((i == domini.length -1 || i == domini.length -2) && unCaracter == 46)) { alert("Verifica el domini de l'adreça."); return false; } if (unCaracter == 45 || unCaracter == 46 || unCaracter == 95 || (unCaracter > 47 && unCaracter < 58) || (unCaracter > 96 && unCaracter < 123)) { continue; } else { alert("Verifica el domini de l'adreça."); return false; } } return true; } alert("L'adreça de correu no és correcta. Si us plau, comproveu-ho."); return false; }
-
En primer lloc, es comprova que la @ és a la cadena de text; si no hi és, no es continua la validació.
-
En segon lloc, es comprova que el . que defineix el domini de primer nivell és a la cadena de text; si no hi és, no es continua la validació.
-
En tercer lloc, es recorre caràcter per caràcter la primera part de la cadena de text que correspon a l'usuari del compte de correu, i es comprova que la formen caràcters vàlids en un compte de correu.
-
En quart lloc, es recorre la part corresponent del domini del compte de correu i es valida que té un domini i un subdomini.
3.Posicionament dinàmic
-
Es poden modificar els atributs de posicionament, quan s'ha carregat la pàgina, utilitzant esdeveniments o scripts que ha definit el programador.
-
Es poden encavalcar elements HTML a la pàgina web.
-
Es poden ocultar i mostrar elements HTML a la pàgina web.
-
Es poden moure elements i fins i tot fer algunes animacions.
3.1.Propietats CSS de posicionament
-
static: és el valor predeterminat i indica que l'element no es pot posicionar.
-
absolute: aquest valor fa que l'element quedi fora del flux d'HTML i la posició queda relativa a la cantonada superior esquerra de la pàgina. Els objectes poden quedar superposats sobre altres elements del flux de la pàgina.
-
relative: aquest valor fa que l'element ocupi el mateix lloc que ocuparia si no estigués posicionat i es desplaça de la posició el valor que s'hi indica.
clip: rect(top right bottom left);
<div id="tallada" style="position:absolute; left:100; top:250; width: 400; height: 100; background-color: #CC9966; layer-background-color: #CC9966; border: 1px none #000000; clip: rect(30 330 80 130)" >
-
hidden: oculta la capa.
-
visible: mostra la capa, si és visible.
-
inherit: indica si la visibilitat s'hereta del contenidor superior.
3.2.Una mica d'història: navegadors 4.x
3.2.1.Capes a Netscape 4
Propietat |
Descripció |
---|---|
clip |
Referència a l'objecte Clip de retallada de la capa. Aquest objecte es defineix amb les propietats top, right, bottom i left. |
left |
Posició de la coordenada x de la capa. |
top |
Posició de la coordenada y de la capa. |
pageX |
Posició de la coordenada x de la capa relativa a la pàgina. |
pageY |
Posició de la coordenada y de la capa relativa a la pàgina. |
visibility |
Indica la visibilitat de la capa, i admet els valors show i hide. |
zIndex |
Indica l'ordre d'encavalcament de la capa. |
<layer name="capaNN" pageX="100" pageY="100" width="100" height="50" bgcolor="#ffff99">Capa creada amb layer! </layer>
<div id="capaNN" style="position: absolute; top: 100px; left: 100px; width: 100px; height: 50px; background-color: #ffff99">Capa creada amb div!</div>
document.layers['capaNN'];
-
moveBy(incrementX,incrementY): provoca un desplaçament de la capa a partir dels valors passats com a paràmetres;
-
moveTo(x,y): situa la capa en les coordenades indicades en els paràmetres x i y;
-
moveToAbsolute(x,y): situa la capa en les coordenades absolutes indicades en els paràmetres x i y;
-
moveAbove(capa): situa la capa actual sobre la capa passada com a paràmetre;
-
moveBelow(capa): situa la capa actual sota la capa passada com a paràmetre;
-
resizeBy(incrementX,incrementY): incrementa la grandària de la capa amb els valors passats en els paràmetres incrementX i incrementY;
-
resizeTo(alt,ample): especifica la grandària de la capa amb els valors passats en els paràmetres alt i ample.
3.2.2.Capes a Internet Explorer 4
<div id="capaIE" style="position: absolute; top: 100px; left: 100px; width: 100px; height: 100px; background-color: "#ffff99">Capa creada amb div!</div>
document.all['capaIE'].style.left += 10; document.all['capaIE'].style.backgroundColor = 'orange';
background-color - backgroundColor
3.3.CSS-P en navegadors DOM W3C
<div id="capaDOM" style="position: absolute; top: 100px; left: 100px; width: 100px; height: 100px; background-color: " ffff99">Capa creada amb div!</div>
document.getElementById("capaDOM").style.backgroundColor = "orange";
3.4.Posicionament cross-platform
3.4.1.Detectar el navegador
function hidden(nomCapa) {} function show(nomCapa){} function setX(nomCapa,coorX){} function setY(nomCapa,coorY){} function setZ(nomCapa, indexZ){} function setHeight(nomCapa, alt){} function setWidth(nomCapa, ample){}
function getElement(nomCapa){ return document.getElementById(nomCapa); }
function hide(nomCapa){ //Es recupera la referència a la capa i s'assigna l'atribut hidden var capa = getElement(nomCapa); capa.style.visibility = 'hidden'; } function show(nomCapa){ //Es recupera la referència a la capa i s'assigna l'atribut visible var capa = getElement(nomCapa); capa.style.visibility = 'visible'; } function setX(nomCapa,x){ //Es recupera la referència a la capa i s'assigna la coordenada var capa = getElement(nomCapa); capa.style.left=x+"px"; } function setY(nomCapa, y){ //Es recupera la referència a la capa i s'assigna la coordenada var capa = getElement(nomCapa); capa.style.top=x+"px"; } function setZ(nomCapa, zIndex){ //Es recupera la referència a la capa i s'assigna el valor var capa = getElement(nomCapa); capa.style.zIndex = zIndex; } function setHeight(nomCapa, height){ //Es recupera la referència a la capa i s'assigna el valor var capa = getElement(nomCapa); capa.style.height = height; } function setWidth(nomCapa, width){ //Es recupera la referència a la capa i s'assigna el valor var capa = getElement(nomCapa); capa.style.width = width; }
3.5.Fonaments de l'animació
-
Posicionament.
-
Definició del recinte.
-
Definició del moviment.
-
Temporització.
3.5.1.Posicionament
function getX(nomCapa){ var capa = getElement(nomCapa); return(parseInt(capa.style.left)) } function getY(nomCapa){ var capa = getElement(nomCapa); return(parseInt(capa.style.top)) }
posX = getX("bola"); setX("bola",posX+10);
3.5.2.Pas i grandària del recinte
pas = pas*-1;
var limitSup =100; var limitInf =400; var limitEsq =100; var limitDret =600;
3.5.3.Temporització
var repeteix = setInterval("mou()",1000);
clearInterval(repeteix);
3.6.Aplicacions simples de CSS-P
3.6.1.Animació en línia recta
-
L'identificador de la capa que es mou.
-
La coordenada x de la posició inicial.
-
La coordenada y de la posició inicial.
-
La coordenada x de la posició final.
-
La coordenada y de la posició final.
-
La velocitat del moviment.
animaRecta("capa1", 100, 100, 300, 300, 10);
// Es crea un objecte anima que disposa d'un conjunt //de propietats relacionades amb el moviment var anima = new Object(); //Se inicialitza l'objecte anima function initAnima() { anima = {capa:"", valorX:0, valorY:0, finX:0, finY:0, pasoX:0, pasoY:0, distX:0, distY:0, MoviX:0, MoviY:0, vel:1, cami:1, interval:null }; } // Es defineix la funció animaRecta function animaRecta(capa, iniciX, iniciY, finalX, finalY, pas) { initAnima(); anima.capa = capa; anima.valorX = iniciX; anima.valorY = iniciY; anima.finX = finalX; anima.finY = finalY; anima.distX = Math.abs(finalX - iniciX); anima.distY = Math.abs(finalY - iniciY); anima.vel = (pas) ? pas : 1; //S'assigna la posició inicial de l'element document.getElementById(capa).style.left = iniciX + "px"; document.getElementById(capa).style.top = iniciY + "px"; //Es calcula la longitud de la línea entre l'inici i el final de les coordenades anima.cami = Math.sqrt((Math.pow((iniciX - finalX), 2)) + (Math.pow((iniciY - finalY), 2))); //Es calcula la mida en píxels dels passos al llarg dels eixos anima.pasX = parseInt(((anima.finX - anima.valorX) / anima.cami) * anima.vel); anima.pasY = parseInt(((anima.finY - anima.valorY) / anima.cami) * anima.vel); //S'inicia la crida respectiva a l'animació anima.interval = setInterval("executaAnimacio()", 10); } // Calcula els passos següents i els assigna a les propietats function executaAnimacio() { if ((anima.MoviX + anima.pasX) <= anima.distX && (anima.MoviY + anima.pasY) <= anima.distY) { var x = anima.valorX + anima.pasX; var y = anima.valorY + anima.pasY; document.getElementById(anima.capa).style.left = x + "px"; document.getElementById(anima.capa).style.top = y + "px"; anima.MoviX += Math.abs(anima.pasX); anima.MoviY += Math.abs(anima.pasY); anima.valorX = x; anima.valorY = y; } else { document.getElementById(anima.capa).style.left = anima.finX + "px"; document.getElementById(anima.capa).style.top = anima.finY + "px"; clearInterval(anima.interval); } }
3.6.2.Animació circular
-
L'identificador de la capa que es mou.
-
La coordenada x del punt de començament/final del cercle.
-
La coordenada y del punt de començament/final del cercle.
-
Un valor sencer parell que indiqui el nombre de punts que s'han de pintar en el cercle.
-
Un valor sencer del radi relatiu del cercle.
animaCirc("circula", 120, 120, 18, 5);
// Es crea un objecte anima, que disposa d'un conjunt //de propietats relacionades amb el moviment var anima = new Object(); //S'inicialitza l'objecte Anima function initAnima() { anima = {capa:"", valorX:0, valorY:0, finX:0, finY:0, pas:1, punts:1, radi:1, interval:null }; } //Es completa l'objecte anima amb els paràmetres i valors calculats necessaris function animaCirc(capa, iniciX, iniciY, punts, radi) { initAnima(); anima.capa = capa; anima.finX = anima.valorX = iniciX; anima.finY = anima.valorY = iniciY; anima.punts = punts; anima.radi = radi; //Assigna la posició inicial dels elements document.getElementById(capa).style.left = iniciX + "px"; document.getElementById(capa).style.top = iniciY + "px"; //Comença la repetició de l'animació anima.interval = setInterval("executaAnimacioC()", 10); } function executaAnimacioC() { if (anima.pas < anima.punts) { var x = anima.finX + Math.round(Math.cos(anima.pas * (Math.PI/(anima.punts/2))) * anima.radi); var y = anima.finY + Math.round(Math.sin(anima.pas * (Math.PI/(anima.punts/2))) * anima.radi); document.getElementById(anima.capa).style.left = x + "px"; document.getElementById(anima.capa).style.top = y + "px"; anima.finX = x; anima.finY = y; anima.pas++; } else { document.getElementById(anima.capa).style.left = anima.valorX + "px"; document.getElementById(anima.capa).style.top = anima.valorY + "px"; clearInterval(anima.interval); } }
3.6.3.Crear un menú desplegable amb jQuery
<ul class="menu"> <li><a href="#">Inici</a></li> <li><a href="#">Tipus i Requisits</a> <ul> <li><a href="#">Jubilaci&oacute;</a></li> <li><a href="#">Pensi&oacute;</a></li> <li><a href="#">Jubilaci&oacute; per invalidesa</a></li> <li><a href="#">Jubilaci&oacute; per edat avan&ccedil;ada</a></li> </ul> </li> <li><a href="#">Reajustaments</a></li> <li><a href="#">Contacte</a></li> </ul>
ul.menu { float:right; display:block; margin-top: 38px; list-style-type:none; } .menu li { line-height:18px; font-size:13px; position:relative; float:left; } .menu li a { color: #000; text-transform:uppercase; padding: 5px 20px; text-decoration:none; } .menu li a:hover { background: #9c0101; color: white; }
.menu li ul { display:none; position:absolute; top:20px; width: 240px; background-color: #f4f4f4; padding:0; list-style-type:none; }
.menu li ul li { width: 200px; border: 1px solid #9c0101; border-top:none; padding: 10px 20px; } .menu li ul li:first-child { border-top: 1px solid #9c0101; } .menu li ul li a { width: 240px; margin: 0; padding:0; } .menu li ul li a:hover { width: 240px; margin: 0; color: #9c0101; background:none; }
<script type="text/javascript" src="jquery-1.7.2.min.js"></script>
$("div"); // obté tots els nodes DIV de l'arbre DOM $("#layout"); // obté el node amb l'atribut id = "layout" de l'arbre DOM $(".myStyle"); // obté els nodes els atributs class dels quals tinguin el valor "myStyle" dins // de l'arbre DOM $("<li>home</li>"); // crea un node de tipus li amb un text embegut "home" $("div#content"); // obté el node de tipus div l'identificador del qual sigui "content" $("<li>home</li>").wrapInner("<a>"); // crea un node li i insereix una àncora $("div#content").text("Aquest és el nou contingut de la capa"); // obté el node div amb id = // content i modifica el text que // conté la capa.
$("li"); //Selectors CSS $(document);// Elements DOM $("<li>home</li>"); // HTML $(function(){});//Funcions
-
clic() i dbclick(): afegeix un esdeveniment al clic del ratolí.
-
keypress() i keydown(): afegeix un esdeveniment quan es prem el teclat.
-
hover(): afegeix dos esdeveniments a l'acció de passar el punter del ratolí sobre un component, el primer dels quals és passar-hi pel damunt i el segon, deixar-lo.
-
toogle(): intercanvia entre un comportament o un altre quan es produeix l'esdeveniment.
-
text() i html(): retornen o assignen el text com un String o html com si treballéssim amb innerHTML.
-
attr() i removeAttr(): accedeix, modifica i elimina un atribut d'un node.
-
addClass(), removeClass() i toogleClass(): afegeix, elimina o intercanvia les classes css.
-
css(): retorna o assigna una propietat css a un node.
<script type="text/javascript"> // la funció ready associada al document assegura que el codi s'executa. //quan la pàgina està totalment carregada en el client. $(document).ready(function() { //s' obtenen tots els enllaços i s'associa una funció a l'esdeveniment onclick. $("a").clic(function(event){ // quan es produeixi l'esdeveniment s'assigna un estil css de color de fons a l'enllaç. $(this).css({backgroundColor:'xarxa'}); }); }); </script>
<script type="text/javascript" src="jquery-1.7.2.min.js"></script> <script type="text/javascript"> $(document).ready(function() { //s'executa la funció quan la pàgina està carregada, $('ul li:has(ul)').hover( //s'assigna en primer lloc el controlador de l'esdeveniment //en passar el punter del ratolí per l'opció del menú. function(i) { $(this).find('ul').css({display: "block"}); //es mostra l'opció del menú. }, //la funció següent s'executarà quan el punter del ratolí abandona l'enllaç. function(i) { $(this).find('ul').css({display: "none"}); //s'amaga l'opció del menú. } ); }); </script>
3.7.Manipulació dinàmica dels fulls d'estil
Navegador |
Suport CSS1 |
Suport CSS2 |
---|---|---|
Netscape 4 |
Escàs |
No consta |
Internet Explorer 4 |
Escàs |
No consta |
Internet Explorer 5 |
Lleugerament, però amb problemes |
No consta |
Internet Explorer 5.5 |
Total, però amb problemes |
No consta |
Netscape 6 |
Total |
Gairebé total |
Internet Explorer 6 |
Total |
Gairebé total |
Mozilla 1.0 |
Total |
Gairebé total |
Opera 7.0 |
Total |
Gairebé total |
3.7.1.Motius per a fer servir CSS
-
CSS és un llenguatge estàndard de disseny per al web i, per tant, aplicable a altres formats com l'XML. Controla els colors, la tipografia, la mida i el lloc on hi ha elements i imatges.
-
CSS és molt senzill de programar, de manera que no és imprescindible fer servir editors especialitzats.
-
CSS permet d'estalviar amplada de banda, ja que un sol arxiu CSS pot definir l'estètica de tot un web complex.
-
CSS redueix les operacions d'actualització i manteniment, ja que els encarregats de continguts no s'han de preocupar de l'aspecte final. A més, els canvis globals es poden fer en poca estona: només s'ha de modificar un arxiu CSS i es modifica l'aspecte de tot el web.
3.7.2.Canviar un full d'estil
<link id="estilPerDefecte" rel="stylesheet" type="text/css" href="estil.css" />
document.getElementById("estilPerDefecte").href="estilNou.css";
document.styleSheets[1].disabled = true;
3.7.3.Llegir valors de les propietats del full
function getElementStyle(elemID, IEStyleProp, CSSStyleProp) { var elem = document.getElementById(elemID); if (elem.currentStyle) { return elem.currentStyle[IEStyleProp]; } else if (window.getComputedStyle) { var compStyle = window.getComputedStyle(elem, ""); return compStyle.getPropertyValue(CSSStyleProp); } return ""; }