Interaction avec HTML/CSS Contrôle d'une balise HTML * Objectif de ce cours: animation et interaction * Contrôle possible d'une balise HTML en TypeScript * Récupération ou création d'une balise dans le document HTML * Balise HTML = objet de type "HTMLElement" * Contrôle de son style CSS via l'attribut "style" * Exemple: balise.style.backgroundColor = "#FFFF00"; * Mais l'écriture est parfois fastidieuse * Exemple: positionner une balise * Proposition: la classe "Sprite" * Masque l'écriture fastidieuse * Pour simplifier le contrôle d'une balise * Et fournit des méthodes adaptées à l'animation Association sprite-balise * Principe: un sprite est associé à une balise * La classe "Sprite" possède un attribut "balise" * Accessible via la méthode "getBalise" * sprite.getBalise().style.backgroundColor = "#FFFF00"; * Construction d'un sprite ==> fournir une balise * Un sprite ne peut pas exister sans balise * Récupération d'une balise HTML par identifiant * balise = document.getElementById("id"); * Ou création d'une nouvelle balise HTML * balise = document.createElement("type"); * Création d'un sprite: sprite = new Sprite(balise); Hiérarchie des balises * Document HTML = hiérarchie de balises * Balise racine = document * document ==> enfants <head> et <body> * <body> ==> enfants <h1>, <p>... * Possibilité d'ajouter ou retirer une balise enfant * sprite.ajouter(sprite_enfant); ? balise.appendChild(balise_enfant); * sprite.retirer(sprite_enfant); ? balise.removeChild(balise_enfant); * Possibilité de se déplacer dans la hiérarchie * sprite_parent = sprite.getParent(); ? balise_parent = balise.parentNode; * sprites_enfants = sprite.getEnfants(); ? balises_enfants = balise.childNodes; Positionner une balise * Plusieurs méthodes de positionnement * Toutes utiles en fonction des besoins * Positionnement statique * Comportement par défaut * Positionnement relatif * Translation par rapport à la position par défaut * Positionnement flottant * Placement le plus à gauche ou droite possible * Positionnement absolu * Placement par rapport à la position de son conteneur Positionnement relatif * Exemple: 3 éléments en-ligne * Sortie du flux normal de placement * element2.style.position = "relative"; * La zone du placement par défaut est conservée * Translation par rapport à la position initiale * element2.style.left = "xpx"; * element2.style.top = "ypx"; Positionnement absolu * Exemple: élément contenu dans un autre * Sortie du flux normal de placement * element2.style.position = "absolute"; * Translation par rapport... * Au conteneur si il est positionné * position: absolute/relative * A la page si le conteneur n'est pas positionné * position: static * float: left/right Superposition de balises * Des balises peuvent se chevaucher * Comment contrôler qui est devant l'autre ? * Notion de profondeur * Attribut "zIndex" * Plus la valeur est grande, plus la balise est en avant * Ordre de superposition par défaut * Non positionné (statique) * Flottant * Position relative * Position absolue * Modifiable uniquement pour les éléments positionnés (position relative ou absolue) Géométrie d'un sprite (1/2) * A la construction d'un sprite * Positionnement absolu forcé * this.balise_.style.position = "absolute"; * Déplacer un sprite * sprite.setX(x); ? balise.style.left = x + "px"; * sprite.setY(y); ? balise.style.top = y + "px"; * sprite.setXY(x,y); * Dimensionner un sprite * sprite.setLargeur(l); ? balise.style.width = l + "px"; * sprite.setHauteur(h); ? balise.style.height = h + "px"; * sprite.setDimension(l,h); Géométrie d'un sprite (2/2) * Localiser un sprite * Récupération délicate à partir de "balise.style" * D'où le choix de mémoriser la position dans le sprite * Méthodes: getX(), getY() * Connaître les dimensions d'un sprite * Idem localisation * Méthodes: getLargeur(), getHauteur() * Autres informations géométriques * Centre: getCentreX(), getCentreY() * Rectangle englobant: getRectangle() * Cercle englobant: getCercle() Aspect d'un sprite * Opacité (coefficient entre 0 et 1) * sprite.setOpacite(coef); ? balise.style.opacity = coef; * Rotation (en degré) * sprite.setRotation(angle); ? balise.style.transform = "rotate(" + angle + "deg)"; * Pivot de rotation: sprite.setPivotRotation(x,y); ? balise.style.transformOrigin = x + "px " + y + "px"; * Invisibilité * sprite.masquer(); ? balise.style.display = "none"; * sprite.montrer(); ? balise.style.display = "block"; * Accès aux informations * Méthodes: getOpacite(), getRotation(), estVisible() Sprite image * Création "from scratch" d'une balise de type "img" * balise = document.createElement("img"); * Balise image = objet de type "HTMLImageElement" * Affectation d'un fichier image * balise.src = "chemin"; * Dimensionnement * balise.style.width = largeur + "px"; * balise.style.height = hauteur + "px"; * Plus simple: associer un sprite à une balise image * sprite = new Sprite(document.createElement("img")); * sprite.setImage("chemin",largeur,hauteur); Sprite toile (1/2) * Sprite associé à une balise de type "canvas" * Possibilité de dessiner sur la balise * Un "contexte graphique" (ou "pinceau") est nécessaire * pinceau = sprite.getPinceau(); ? pinceau = balise.getContext("2d"); * Dessiner une figure * Départ: pinceau.beginPath(); * Positionner: pinceau.moveTo(x,y); * Tracer (ligne droite à partir de l'ancienne position): pinceau.lineTo(x,y); * Fin: type de tracé (traits et/ou remplissage) * Traits: pinceau.stroke(); * Remplissage: pinceau.fill(); Sprite toile (2/2) * Exemple d'un rectangle p.beginPath(); p.moveTo(x,y); p.lineTo(x+largeur,y); p.lineTo(x+largeur,y+hauteur); p.lineTo(x,y+hauteur); p.lineTo(x,y); p.stroke(); * Choisir l'aspect du tracé * Couleur du trait: p.strokeStyle = "#FFFF00"; * Epaisseur du trait: p.lineWidth = 2; * Couleur de remplissage: p.fillStyle = "#00FF00"; Balise audio * Contrôle direct d'une balise de type "audio" * Dans la page HTML * <audio id="id" src="fichier_son"></audio> * Dans le code TypeScript * Balise audio = objet de type "HTMLAudioElement" * Récupération: audio = document.getElementById("id"); * Lancement / reprise lecture: audio.play(); * Pause lecture: audio.pause(); * Positionnement (en secondes): audio.currentTime = n; * Etat: if (audio.paused) ... |