Comment coder une liste de tâches amusantes avec PHP et AJAX

Pour le tutoriel Tuts + Premium de cette semaine, nous allons travailler avec différentes technologies. En fin de compte, nous allons créer une liste de tâches qui vous permettra, à vous ou à votre utilisateur, de créer, mettre à jour et supprimer des éléments de manière asynchrone. Pour ce faire, nous utiliserons les fonctionnalités AJAX de PHP et de jQuery. Je pense que vous constaterez que ce n'est pas aussi difficile que vous pourriez le penser initialement. Je vais vous montrer exactement comment!

Ce tutoriel comprend un screencast disponible pour les membres Tuts + Premium.



Étape 1: Création d'une nouvelle base de données

Comme vous pouvez l’imaginer, nous ne pouvons pas enregistrer, supprimer et mettre à jour des enregistrements dans un environnement statique. Donc, nous devons créer une base de données MySql qui stockera les informations.

Si vous utilisez PHPMyAdmin, accédez au panneau de configuration en visitant http: // localhost / phpmyadmin.


Dans la zone de texte "Créer une nouvelle base de données", tapez "db" et cliquez sur "Créer". Ensuite, vous devrez créer une table. Tapez "todo" et "3" pour "nombre de champs".


Créer nos colonnes

Nous allons maintenant avoir besoin d'ajouter les colonnes appropriées.

  • identifiant : identifiant unique pour identifier chaque ligne.
  • Titre : Le titre de notre article.
  • la description : Une description détaillant ce que nous devons faire!

Assurez-vous que les options de chaque champ correspondent à celles affichées dans l'image suivante..


Insérer des lignes de test

Maintenant que nous avons créé notre base de données, ajoutons rapidement quelques lignes de test. Cliquez sur votre base de données "db"; puis choisissez "Parcourir". Vous serez amené à un écran qui répertorie le contenu de chaque ligne de votre base de données. De toute évidence, cette section est vide pour le moment. Choisissez "Insérer" et ajoutez quelques colonnes. Tapez ce que vous souhaitez ici.




Screencast complet



Étape 2: La classe Db


Bien que cela ne soit absolument pas nécessaire, je trouve qu'il est plus facile de gérer mes fonctions lorsque je les regroupe dans une classe. Compte tenu de cela, nous allons maintenant créer une classe "Db" qui contiendra plusieurs fonctions.

  • __construction : Cette fonction s'exécute automatiquement dès que l'objet est instancié.
  • delete_by_id () : Supprime la ligne nécessaire en transmettant son identifiant unique.
  • update_by_id () : Met à jour la ligne en lui passant son identifiant unique.

Ouvrez l'éditeur de code de votre choix et créez un nouveau fichier appelé "db.php". Dans ce document vierge, collez les lignes de code suivantes.

 classe Db private $ mysql; function __construct () $ this-> mysql = new mysqli ('localhost', 'root', 'yourPassword', 'db') ou die ('problem');  // end class

Pour créer une nouvelle classe, nous utilisons la syntaxe présentée ci-dessous..

 classe 'myClass' 

En utilisant uniquement le code ci-dessus, nous avons créé avec succès une nouvelle classe. Il ne fait rien pour l'instant, mais c'est quand même une classe!

__construction()

La méthode __construct () (conversation de classe pour "fonction") est appelée "méthode magique". Il s'exécutera immédiatement après l'instanciation d'un cours. Nous allons utiliser cette méthode pour établir notre connexion initiale à la base de données MySql.

 function __construct () $ this-> mysql = new mysqli ('localhost', 'root', 'yourPassword', 'db') ou die ('problem'); 

Si vous n'êtes pas familier avec la programmation orientée objet, cela peut être un peu intimidant au début. Heureusement, ce n'est pas trop difficile à comprendre. Nous voulons que notre connexion mysql soit disponible pour toutes les méthodes de notre classe. Compte tenu de cela, il ne serait pas judicieux de stocker la variable $ mysql dans une fonction spécifique. Au lieu de cela, il devrait s'agir d'une propriété de classe.

 private $ mysql;

Accéder aux propriétés à partir de méthodes

Dans une méthode, nous ne pouvons pas simplement accéder à notre propriété en tapant "$ mysql". Nous devons d'abord faire référence à l'objet.

 $ this-> mysql

Assurez-vous de prendre note du fait que, lorsque vous accédez à une propriété, vous pouvez laisser le symbole du dollar.

Mysqli


Il est préférable d'utiliser mysql amélioré (mysqli) plutôt que la méthode traditionnelle mysql_connect lors de la connexion à une base de données. Non seulement c'est plus rapide, mais cela nous permet également d'utiliser une approche POO.

Lors de la création d'une nouvelle instance de la classe mysqli, il faut passer quatre paramètres.

  • hôte : 'localhost'
  • Nom d'utilisateur : racine
  • mot de passe : 'votre mot de passe'
  • nom de la base de données : db

Cela devrait le faire pour le moment. Nous reviendrons dans notre classe au cours de ce tutoriel pour ajouter de nouvelles méthodes. Rappelez-vous simplement, lorsque nous créons une nouvelle instance de cette classe…

 nécessite 'db.php'; $ db = new Db ();

… Nous ouvrons automatiquement une connexion à notre base de données, grâce à la méthode magique __construct ().

Le balisage


Nous devons maintenant créer notre balisage pour la page d'accueil. Ajoutez une nouvelle page à votre solution et enregistrez-la sous "index.php". Ensuite, collez ce qui suit.

      Ma liste de choses à faire     

Ma liste de tâches

  • Faire

Une analyse

Dans l'en-tête de notre document, je fais référence au CDN de Google pour accéder à jQuery. C'est facilement la méthode préférée lors de l'utilisation de jQuery. Ensuite, je fais référence à un fichier 'scripts.js' que nous allons créer plus tard dans ce tutoriel..

Voyons rapidement à quoi sert chaque div.

  • récipient : Emballage standard.
  • ul # tabs : Notre navigation. Nous utiliserons Javascript pour ajouter les onglets supplémentaires. Je vais expliquer pourquoi sous peu.
  • principale : Wrap pour le contenu principal.
  • faire : Onglet 1.
  • addNewEntry : Onglet 2

Étape 4: CSS


Ce n'est pas un tutoriel CSS, en soi. Vous êtes libre de revoir la feuille de style que j'ai utilisée. C'est dans le paquet de téléchargement. Si vous souhaitez un examen plus approfondi, regardez le screencast.


Étape 5: Récupération des enregistrements

Maintenant que nous sommes connectés à la base de données et que nous avons créé notre balisage / CSS, écrivons du code qui extraira les lignes de la base de données..

Dans le "todo" div, insérez le texte suivant.

 
mysql-> query ($ query); if ($ results-> num_rows) while ($ row = $ results-> fetch_object ()) $ title = $ row-> title; $ description = $ row-> description; $ id = $ row-> id; écho '
'; $ data = << Titre $

$ description

D E
EOD; echo $ data; écho '
'; // fin alors echo "

Il n'y a aucun article. Ajouter un maintenant!

";?>

Une analyse

  • Utilisez 'require' pour accéder à notre classe Db.
  • Créer une nouvelle instance de la classe Db.
  • Créez une requête. Cela va récupérer tous les enregistrements de la table "todo", et les trier dans un ordre croissant.
  • Nous devons maintenant exécuter notre requête. $ db-> mysql-> requête ($ requête). $ db référence l'objet. $ mysql fait référence à la classe mysqli. $ query est une méthode de la classe mysqli qui nous permet de passer une requête. Ici, nous passons dans la chaîne que nous venons de créer.
  • $ results-> num_rows retournera le nombre total de lignes reçues de la base de données. Si un ou plusieurs sont renvoyés, nous utiliserons ensuite une instruction while pour parcourir les lignes..
  • Créez une variable temporaire appelée $ row qui fera référence aux informations, pour chaque itération. Nous créons ensuite trois variables qui font référence à leurs contreparties respectives dans la base de données..
  • Chaque article sera enveloppé dans une div avec une classe de "item".
  • Ensuite, nous utilisons heredocs pour formater notre tâche. Heredocs offre un moyen simple et organisé de mélanger html et php. Pour en savoir plus, n'oubliez pas de donner votre avis sur ce screencast.
  • Enroulez le titre dans les balises h4; la description dans les balises p.
  • L'utilisateur a besoin d'un moyen de modifier et de supprimer chaque élément. Nous avons donc créé deux balises d'ancrage qui nous permettront de le faire. Nous y reviendrons plus tard.
  • Écho nos informations heredocs, et fermez le ".item" div.
  • Si aucune ligne n'a été renvoyée de la base de données, echo "Il n'y a aucun élément. Ajoutez-en un maintenant!".

Espérons que tout cela ait du sens. À ce stade, vous devriez avoir quelque chose comme ce qui suit:


Étape 6: Ajouter un nouvel élément


Nous voulons également que l'utilisateur puisse insérer de nouveaux enregistrements. Créons un formulaire qui permettra cette chose même.

 

Ajouter une nouvelle entrée

Il s'agit de votre formulaire standard. Nous avons ajouté des entrées pour un titre et une description. Lorsque le bouton de soumission est cliqué, les informations saisies seront publiées dans "addItem.php". Créons cette page maintenant.


Étape 7: AddItem.php

Créez un nouveau document et enregistrez-le sous le nom "addItem.php". Collez dans le code suivant:

 mysql-> prepare ($ query)) $ stmt-> bind_param ('ss', $ _POST ['title'], $ _POST ['description']); $ stmt-> execute (); en-tête ("location: index.php");  else die ($ db-> mysql-> error); 
  • Consultez notre classe de base de données.
  • Instancier la classe.
  • Si le bouton d'envoi portant le nom "addEntry" existe, exécutez le code suivant.
  • Créer une nouvelle requête. Vous remarquerez que j'utilise des points d'interrogation comme valeurs. Il est préférable d’utiliser des instructions préparées lors de la mise à jour de notre base de données. C'est un excellent moyen de se protéger contre l'injection sql.
  • Préparez notre variable mysql en passant la requête que nous venons de créer.
  • S'il a été préparé avec succès, liez les paramètres appropriés. Le premier paramètre demande les types de données pour chaque élément. J'ai utilisé '' pour faire référence à "chaîne". Les deux autres paramètres récupèrent les valeurs de titre et de description du tableau super global POST.
  • Exécuter la déclaration.
  • Enfin, redirigez l'utilisateur vers la page d'accueil.

Étape 7: Mettre à jour les éléments


Grâce aux fonctionnalités AJAX de jQuery, permettons à l'utilisateur de mettre à jour chaque élément sans publication. Créez un nouveau fichier dans un dossier "js" et appelez-le "scripts.js". Rappelez-vous, nous avons déjà référencé ce fichier dans notre balisage.

 $ (function () $ ('. editEntry'). click (function () var $ ceci = $ (ceci); var ancienTexte = $ ceci.parent (). parent (). trouver ('p'). text (); var id = $ this.parent (). parent (). find ('# id'). val (); $ this.parent (). parent (). find ('p'). empty ( ).ajouter(''); $ ('. newDescription'). blur (function () var newText = $ (this) .val (); $ .ajax (type: 'POST', url: 'updateEntry.php', data: 'description = '+ newText +' & id = '+ id, succès: fonction (résultats) $ this.parent (). parent (). find (' p '). empty (). append (newText);); ) retourne faux; ); );

Si vous revenez à notre balisage sur index.php, vous verrez:

 
D E

Décoder chaque ligne

 $ ('. editEntry'). click (function () 

Avec jQuery, il faut écouter lorsque la balise d'ancrage avec une classe "editEntry" est cliquée.

 var $ this = $ (this);

Ensuite, nous mettons en cache $ (this) - qui fait référence à la balise d'ancrage sur laquelle l'utilisateur a cliqué.

 var oldText = $ this.parent (). parent (). find ('p'). text ();

Nous devons stocker la description originale. Nous demandons à la balise anchor de trouver le div parent et recherchons la balise p - qui contient le texte de description. Nous saisissons cette valeur en utilisant "text ()".

 var id = $ this.parent (). parent (). find ('# id'). val ();

Afin de mettre à jour la bonne ligne dans notre base de données, j'ai besoin de savoir quel est l'identifiant de cette ligne spécifique. Si vous vous référez à votre code, vous verrez un champ de saisie masqué contenant cette valeur..

 

Une fois encore, nous utilisons "find" pour accéder à cette entrée cachée, puis saisissons sa valeur.

 $ this.parent (). parent (). find ('p'). empty (). append ('');

Nous devons maintenant permettre à l'utilisateur de saisir une nouvelle description. C'est pourquoi ils ont cliqué sur "Modifier l'entrée", n'est-ce pas!? On trouve la balise description P, on la vide, puis on ajoute une textarea. Nous utilisons "empty ()" pour nous assurer de nous débarrasser de tout le texte; ce n'est plus nécessaire. La valeur de cette zone de texte sera égale à oldText - à titre de commodité.


 $ ('. newDescription'). blur (function () 

Recherchez cette nouvelle zone de texte et, lorsque l'utilisateur quitte la zone de texte, exécutez une fonction..

 var newText = $ (this) .val ();

Capturer le nouveau texte que les utilisateurs saisissent dans cette zone de texte.

 $ .ajax (type: 'POST', url: 'updateEntry.php', data: 'description =' + newText + '& id =' + id, succès: function (résultats) $ this.parent (). parent () .find ('p'). empty (). append (newText););

Appelez la fonction .ajax et transmettez quelques paramètres. Le type sera "POST". L'URL à accéder est "updateEntry.php". Les données à transmettre à cette page sont le newText que l'utilisateur a entré et l'identifiant unique de cette ligne dans la base de données. Lorsque la mise à jour est effectuée avec succès, exécutez une fonction et mettez à jour l'ancien texte avec le nouveau texte.!

 retourne faux;

Renvoie false pour s'assurer que cliquer sur la balise d'ancrage ne dirige pas l'utilisateur ailleurs.


Étape 7b: Le PHP

N'oubliez pas que nous avons appelé notre page PHP 'updateEntry' avec jQuery, mais nous ne l'avons pas encore créée! Faisons cela maintenant. Créez une nouvelle page appelée "updateEntry.php" et collez-la dans la suite.

 update_by_id ($ _ POST ['id'], $ _POST ['description']); ?>

Comme auparavant, nous référençons notre classe de base de données, puis nous l'instancions. Ensuite, nous créons une nouvelle variable, appelée $ response, et la rendons égale à tout ce qui est renvoyé par la méthode "update_by_id ()". Nous n'avons pas encore créé cette méthode. C'est le bon moment pour le faire.

Ajout d'une nouvelle méthode à notre classe

Revenez à votre page db.php et ajoutez une nouvelle méthode en bas.

 function update_by_id ($ id, $ description) $ query = "MISE À JOUR SET description =? WHERE id =? LIMIT 1"; if ($ stmt = $ this-> mysql-> prepare ($ query)) $ stmt-> bind_param ('si', $ description, $ id); $ stmt-> execute (); retourne 'bon travail! Mis à jour'; 

Cette méthode accepte deux paramètres: l'id et la description de l'élément. Donc, lorsque nous appelons cette méthode, nous devons nous rappeler de transmettre ces deux paramètres! Nous commençons par créer notre requête: mettez à jour la table "todo" et changez la description pour tout ce qui est passé - mais mettez à jour uniquement la ligne où l'id est égal au paramètre passé.

Comme la dernière fois, nous utiliserons des instructions préparées pour mettre à jour notre base de données. C'est le moyen le plus sûr! Préparez notre requête, liez les paramètres (chaîne et entier, ou 'si'), puis exécutez. Nous renvoyons une chaîne générique, mais ce n'est vraiment pas obligatoire. Maintenant notre mise à jour devrait fonctionner parfaitement!


Étape 8: Supprimer des éléments


Créons également une manière asynchrone agréable pour l'utilisateur de supprimer des entrées. Lorsqu'ils cliquent sur le bouton de suppression d'un élément, nous supprimons la division et mettons à jour la base de données pour refléter la suppression. Ouvrez votre fichier javascript et ajoutez ce qui suit:

 // Supprimer la balise d'ancrage cliqué sur $ ('a.deleteEntryAnchor'). Click (function () var thisparam = $ (this); thisparam.parent (). Parent (). Find ('p'). Text ('Please Attendez… '); $ .ajax (type:' GET ', url: thisparam.attr (' href '), réussite: function (résultats) thisparam.parent (). Parent (). FadeOut (' slow ') ;) return false;);

Décodage

 $ ('a.deleteEntryAnchor'). click (function () 

Lorsque la balise d'ancrage avec une classe de "deleteEntryAnchor" est cliquée, exécutez une fonction.

 var thisparam = $ (this);

Cache $ (this) as thisparam.

 thisparam.parent (). parent (). find ('p'). text ('Veuillez patienter…');

Changez le texte de la description en "Please Wait". Nous devons faire cela pour donner à l'utilisateur des informations en retour, juste au cas où cela prend plus de temps que prévu.

 $ .ajax (type: 'GET', url: thisparam.attr ('href'), succès: function (résultats) thisparam.parent (). parent (). fadeOut ('slow');)

Comme la dernière fois, nous passons quelques paramètres qui accèdent à "delete.php". Plutôt que de coder en dur la page dans la valeur de l'URL, j'accède à attr ('href') - ce qui équivaut à 'delete.php? Id = $ id'.

Nous n'avons pas besoin d'un paramètre "DATA", car toutes les informations appropriées sont contenues dans la chaîne de requête de l'URL. Une fois que la suppression est effectuée avec succès, nous trouvons le parent '.item' div, et le perdons progressivement.

Delete.php

Nous avons appelé notre page de suppression avec jQuery, mais nous n'avons pas encore créé PHP. Créez votre nouvelle page et ajoutez le code suivant.

 delete_by_id ($ _GET ['id']); en-tête ("Location: index.php");

Vous devriez être habitué à ces procédures maintenant. Créez une nouvelle instance de notre classe et appelez la méthode "delete_by_id". Une fois l'opération terminée, redirigez l'utilisateur vers "index.php". Comme vous l'avez peut-être deviné, nous devons créer une nouvelle méthode dans notre classe db. Revenez à db.php et ajoutez votre nouvelle fonction.

Méthode Delete_by_id ()

 function delete_by_id ($ id) $ query = "SUPPRIMER de la tâche WHERE id = $ id"; $ result = $ this-> mysql-> query ($ query) ou die ("il y avait un problème, man."); if ($ result) retourne 'yay!'; 

Cette méthode acceptera un paramètre - l'id. Rappelez-vous que pour mettre à jour une ligne, nous devons connaître l’identifiant unique de cette ligne. Sinon, il mettra à jour chaque ligne. Nous supprimons toutes les lignes de la table, où l'id est égal à ce qui est transmis. Chaque ligne ayant son propre identifiant unique, une seule sera affectée. Ensuite, nous passons cette requête à notre objet mysql. Encore une fois, le retour est inutile; C'est juste pour s'amuser.


Étape 9: Extra jQuery

Nous avons terminé tout notre travail PHP! La dernière étape consiste à ajouter un peu de jQuery pour que tout fonctionne un peu mieux. En haut de votre fichier Javascript, juste après la méthode document.ready, ajoutez le code suivant:

 // N'affiche pas l'onglet addNewEntry lors du chargement de la page. $ ('# addNewEntry'). css ('display', 'none'); // Nous utilisons jQuery pour créer nos onglets. Si Javascript est désactivé, ils ne fonctionneront pas. Compte tenu de // ceci, nous devrions ajouter nos onglets, afin qu'ils ne s'affichent pas s'ils sont désactivés. $ ('# tabs'). append ('
  • Nouvel article
  • '); // Cache la description de chaque tâche. Afficher uniquement la balise h4 pour chacun. $ ('div.item'). children (). not ('h4'). hide (); // L'ensemble de l'élément div est cliquable. Pour fournir ce retour, nous changeons le curseur de la souris. // Quand on clique sur cette div, nous allons basculer l'affichage de visible à caché à chaque clic. // Cependant, lorsque l'utilisateur clique sur le bouton "mettre à jour", le div se ferme lorsqu'il clique à l'intérieur de la zone de texte // pour modifier sa description. Ce code détecte si la cible du clic était la zone de texte. Si c'était le cas, nous ne ferions rien. $ ('div.item'). css ('curseur', 'pointeur'). cliquez sur (fonction (e) if (! $ (e.target) .is ('textarea')) $ (this). children (). not ('h4'). slideToggle (); $ (this) .children ('h4'). toggleClass ('expandDown'););

    J'ai assez bien commenté chaque étape. Donc, je m'abstiendrai de me répéter. Votre fichier final scripts.js devrait ressembler à ceci.

     $ (function () // Ne pas afficher l'onglet addNewEntry lors du chargement de la page. $ ('# addNewEntry'). css ('display', 'none'); // Nous utilisons jQuery pour créer nos onglets Si Javascript est désactivé, ils ne fonctionneront pas. // Compte tenu de cela, nous devrions ajouter nos onglets afin qu'ils ne s'affichent pas s'ils sont désactivés. $ ('# Tabs'). Append ('
  • Nouvel article
  • '); // Cache la description de chaque tâche. Afficher uniquement la balise h4 pour chacun. $ ('div.item'). children (). not ('h4'). hide (); // L'ensemble de l'élément div est cliquable. Pour fournir ce retour, nous changeons le curseur de la souris. // Quand on clique sur cette div, nous allons basculer l'affichage de visible à caché à chaque clic. // Cependant, lorsque l'utilisateur clique sur le bouton "mettre à jour", le div se ferme lorsqu'il clique à l'intérieur de la zone de texte // pour modifier sa description. Ce code détecte si la cible du clic était la zone de texte. Si c'était le cas, nous ne ferions rien. $ ('div.item'). css ('curseur', 'pointeur'). cliquez sur (fonction (e) if (! $ (e.target) .is ('textarea')) $ (this). children (). not ('h4'). slideToggle (); $ (this) .children ('h4'). toggleClass ('expandDown');); // ajouter un nouvel élément, cliquez sur $ ('# tabs li'). cliquez sur (function () $ ('# tabs li'). removeClass ('selected'); $ (this) .addClass ('selected'); if ($ (this) .attr ('id') == 'newitem_tab') $ ('# todo'). css ('display', 'none'); $ ('# addNewEntry'). css (' display ',' block '); else $ (' # addNewEntry '). css (' display ',' none '); $ (' # todo '). css (' display ',' block '); renvoie false;); $ ('# todo div: first'). children ('h4'). addClass ('expandDown'). end (). children (). show (); // Supprimer la balise d'ancrage cliqué sur $ ('a.deleteEntryAnchor'). Click (function () var thisparam = $ (this); thisparam.parent (). Parent (). Find ('p'). Text ('Please Attendez… '); $ .ajax (type:' GET ', url: thisparam.attr (' href '), réussite: function (résultats) thisparam.parent (). Parent (). FadeOut (' slow ') ;) return false;); // Édite un élément de manière asynchrone $ ('. EditEntry'). Click (function () var $ ceci = $ (ceci); var ancienTexte = $ this.parent (). Parent (). Find ('p'). text (); var id = $ this.parent (). parent (). find ('# id'). val (); console.log ('id:' + id); $ this.parent (). parent () .find ('p'). empty (). append (''); $ ('. newDescription'). blur (function () var newText = $ (this) .val (); $ .ajax (type: 'POST', url: 'updateEntry.php', data: 'description = '+ newText +' & id = '+ id, succès: fonction (résultats) $ this.parent (). parent (). find (' p '). empty (). append (newText);); ) retourne faux; ); );

    Étape 10: attendez! la mise en page est bizarre dans IE6.

    Nous ne pouvons pas appeler un jour pour l'instant! Ce plaisir ole Internet Explorer 6 pose quelques problèmes de mise en page.


    1. Les pngs de fond sont en 24 bits. IE6 ne le supporte pas nativement. Nous aurons besoin d'importer un script pour y remédier.
    2. Les onglets de navigation ne s'affichent pas au bon endroit.
    3. Chaque div.item ne s'affiche pas correctement lorsqu'il est développé.
    4. Nos boutons d’édition et de suppression sont trop loin à droite de notre div.

    La solution

    Bien que nous puissions aimer, nous ne pouvons pas ignorer ce navigateur pour l'instant. Heureusement, vous constaterez que la plupart des problèmes d'IE6 peuvent être résolus assez facilement. Premièrement, nous devons importer un script qui résoudra notre problème de transparence alpha. Dean Martin a un fichier Javascript fantastique qui met IE6 aux normes. En ajoutant simplement "-trans" à la fin de nos noms de fichiers au format png 24 bits, nous pourrons résoudre notre problème. Assurez-vous de visiter le dossier images et éditer les noms.

     

    Le CDN de Google vient à la rescousse en fournissant une version hébergée du script IE7. Cela corrige notre problème de transparence, mais nous avons encore quelques bizarreries.


    Notez que, dans notre déclaration conditionnelle, nous avons également importé un fichier "ie.css". Créez ce fichier maintenant et collez-le:

     corps marge: 0; rembourrage: 0;  #tabs height: 100%;  #main height: 100%;  #main div.item width: 100%; débordement caché; position: relative; 

    Vous constaterez que l'ajout de "position: relative", "débordement: masqué" et "hauteur: 100%" résoudra 90% des problèmes d'IE6. Maintenant, notre mise en page fonctionne parfaitement dans tous les navigateurs!


    Vous avez terminé!


    Il y avait beaucoup à couvrir ici. J'espère que je me suis expliqué suffisamment à fond. Sinon, le screencast associé est fait pour ça! Assurez-vous de l'examiner pour éliminer les zones floues. Si vous avez encore des questions, il suffit de me demander! Merci beaucoup d'avoir lu.