2009-05-14 à 09:33:09

Pageframe

Vous avez déjà vu cet effet sur beaucoup de sites : il s'agit de présenter des informations sous forme d'onglets. Lorsque vous cliquez sur l'onglet, le contenu qui lui est lié apparaît. Un "pageframe" c'est quelque chose qui apparaît comme ce qui suit : Illustration d'onglets/pageframe

Cet article se propose de vous montrer comment réaliser cela en XHTML, javascript et CSS.

Bien, commençons par créer les onglets, les tabs, du pageframe. Pour cela nous allons créer un menu et notre menu sera codé sous forme de liste ordonnée :

<ol class="pageframe">
    <li><a href="#" onclick="show('p1','p1;p2;p3;p4');">Personal</a></li>
    <li><a href="#" onclick="show('p2','p1;p2;p3;p4');">Professional</a></li>
    <li><a href="#" onclick="show('p3','p1;p2;p3;p4');">Contact Details</a></li>
    <li><a href="#" onclick="show('p4','p1;p2;p3;p4');">Albums</a></li>
</ol>

Cette partie, si elle n'est pas complétée par des CSS, n'aura pas du tout la présentation voulue. Néanmoins, la structure de code qui vous est présentée est complète : rien d'autre n'est nécessaire pour afficher le "pageframe". C'est une partie importante du code qui est dès lors terminée.

Nous avons mis en évidence la classe CSS que nous avons réservée à la liste ordonnée (class="pageframe"). De même nous attirons votre attention sur l'appel de la fonction show() lors de l'événement de click (onclick()).

La classe CSS pageframe va nous permettre d'assigner un style particulier à la liste ordonnée. Voyons ceci de plus près :

    
ol.pageframe {  list-style-type :   none;
                width           :   700px;
                margin          :   0;
                padding         :   0;
                height          :   26px;
                border-bottom   :   1px solid #888;
}

À ce stade de notre code CSS, rien de bien spectaculaire se produit. On a évité la numérotation des éléments de la liste; nous avons remis à zéro marge et remplissage; nous avons spécifié une hauteur; nous avons spécifié un bord. Rien de bien passionnant. Continuons…

ol.pageframe li 
             {  display         :   inline-block;
                margin          :   0;
                padding         :   0;
                height          :   25px;
                line-height     :   25px;
                min-width       :   125px;
}

Cet ajout de code CSS permet de faire en sorte que chaque élément de la liste se présente l'un à côté de l'autre, que chaque élément a une hauteur de 25 pixels (c'est-à-dire 1 pixel de moins que le bloc <ol>...</ol>), que la hauteur d'une ligne est de 25 pixels également, et que la largeur minimale d'un élément est de 125 pixels. Tout cela a pour conséquence de faire en sorte que notre pageframe se présente sur une seule ligne et que chaque onglet a une taille déterminée (hauteur et largeur minimale).

Un peu plus de code CSS sera nécessaire pour créer les bords autour de chaque onglet. Voici comment faire :

ol.pageframe li a 
            {   text-decoration :   none;
                display         :   block;
                background      :   rgb(231,231,231);
                color           :   #666;
                text-align      :   center;
                border          :   1px solid #888;
                border-bottom   :   none;
}

Cette modification est aussi spectaculaire que la précédente : maintenant chaque onglet possède un bord. Une petite addition va nous permettre de déterminer l'apparence de l'onglet du pageframe lorsque la souris le survole :

ol.pageframe li a:hover
            {   background      :   rgb(245,245,245);
                color           :   #000;
                border-bottom   :   1px solid rgb(245,245,245);
}

Le tour est joué ! Nous avons bien construit un système de pageframe avec onglets. Que nous reste-t-il à implémenter ? Tout simplement qu'au click sur l'onglet, on active un contenu ou un autre. Pour cela nous allons vous montrer maintenant la totalité du code créé, à la fois le XHTML, le CSS et le javascript :

// CODE CSS
<style type="text/css">
body                {   background      :   #eee;
                        font            :   0.8em/1em "Lucida Grande",helvetica,verdana,arial,sans-serif;
                    }

ol.pageframe        {   list-style-type :   none;
                        width           :   700px;
                        margin          :   0;
                        padding         :   0;
                        height          :   26px;
                        border-bottom   :   1px solid #888;
                    }

ol.pageframe li     {   display         :   inline-block;
                        margin          :   0;
                        padding         :   0;
                        height          :   25px;
                        line-height     :   25px;
                        min-width       :   125px;
                    }

ol.pageframe li a   {   text-decoration :   none;
                        display         :   block;
                        background      :   rgb(231,231,231);
                        color           :   #666;
                        text-align      :   center;
                        border          :   1px solid #888;
                        border-bottom   :   none;
                      }

ol.pageframe li a:hover
                    {   background      :   rgb(245,245,245);
                        color           :   #000;
                        border-bottom   :   1px solid rgb(245,245,245);
                    }

div.pageframe-body  {   background      :   rgb(245,245,245);
                        width           :   678px; /* 700 - 2 x 10 du padding - 2 du bord */
                        padding         :   10px;
                        border          :   1px solid #888;
                        border-top      :   none;
                    }

div.pageframe-body  p
                    {   display         :   none;
                    }
</style>

// CODE JAVASCRIPT POUR L'ACTIVATION DES CONTENUS PAR ONGLET
<script type="text/javascript">

    function show( szID,szSections )
    {
        aSections = szSections.split(';');

        if ( aSections.length > 0 )
        {
            for ( var i = 0;i<aSections.length;i++ )
            {
                if ( ( oElement = document.getElementById( aSections[i] ) ) )
                {
                    oElement.style.display = 'none';
                }
            }
        }

        if ( ( oElement = document.getElementById( szID ) )  )
        {
            oElement.style.display = 'block';
        }
    }
</script>

// CODE XHTML
<ol class="pageframe">
    <li><a href="#" onclick="show('p1','p1;p2;p3;p4');">Personal</a></li>
    <li><a href="#" onclick="show('p2','p1;p2;p3;p4');">Professional</a></li>
    <li><a href="#" onclick="show('p3','p1;p2;p3;p4');">Contact Details</a></li>
    <li><a href="#" onclick="show('p4','p1;p2;p3;p4');">Albums</a></li>
</ol>

<div class="pageframe-body">
    <p id="p1" style="display:block;">

        Quae cum dixisset, Explicavi, inquit, sententiam meam, et eo quidem 
        consilio, tuum iudicium ut cognoscerem, quoniam mihi ea facultas, ut id 
        meo arbitratu facerem, ante hoc tempus numquam est data.

    </p>

    <p id="p2">

        Atque hoc loco, qui propter animi voluptates coli dicunt ea studia, quae 
        dixi, non intellegunt idcirco esse ea propter se expetenda, quod nulla 
        utilitate obiecta delectentur animi atque ipsa scientia, etiamsi 
        incommodatura sit, gaudeant.

    </p>

    <p id="p3">

        Sed quid attinet de rebus tam apertis plura requirere? Ipsi enim 
        quaeramus a nobis stellarum motus contemplationesque rerum 
        caelestium eorumque omnium, quae naturae obscuritate 
        occultantur, cognitiones quem ad modum nos moveant, et quid 
        historia delectet, quam solemus persequi usque ad extremum, cum 
        praetermissa repetimus, inchoata persequimur. Nec vero sum 
        nescius esse utilitatem in historia, non modo voluptatem.

    </p>

    <p id="p4">

        In quo enim maxime consuevit iactare vestra se oratio, tua 
        praesertim, qui studiose antiqua persequeris, claris et fortibus 
        viris commemorandis eorumque factis non emolumento aliquo, sed 
        ipsius honestatis decore laudandis, id totum evertitur eo 
        delectu rerum, quem modo dixi, constituto, ut aut voluptates 
        omittantur maiorum voluptatum adipiscendarum causa aut dolores 
        suscipiantur maiorum dolorum effugiendorum gratia.

    </p>
</div>

Ce code vous permet de créer des onglets/tabs sur les bons browsers du marché : Opera, Safari, Google Chrome, Firefox … et le nouvel Internet Explorer 8. Du moins cela a-t-il été testé sur ces navigateurs ! Et voilà la démonstration vivante des principes expliqués.

< Février 2012 >
Lu Ma Me Je Ve Sa Di
    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        
lifetime-episode

Nos autres articles

  1. Articles
    1. /articles-core.php
    2. /articles/core/MiFID/index.php
    3. /articles/core/SEPA/index.php
    4. /articles/core/accessibility-seo/index.php
    5. /articles/core/accessible-popups/index.php
    6. /articles/core/ajax/index.php
    7. /articles/core/blogs/index.php
    8. /articles/core/business-case/index.php
    9. /articles/core/closure-report/index.php
    10. /articles/core/cmmi/index.php
    11. /articles/core/css/index.php
    12. /articles/core/doctype/index.php
    13. /articles/core/dynamic-input/index.php
    14. /articles/core/dynamic-theme/index.php
    15. /articles/core/effort-de-gestion-de-projet/index.php
    16. /articles/core/error-handling-404/index.php
    17. /articles/core/estimations-programmeurs/index.php
    18. /articles/core/expressions-regulieres-php/index.php
    19. /articles/core/gestion-des-couleurs/index.php
    20. /articles/core/glossary/index.php
    21. /articles/core/ideal-team-duration/index.php
    22. /articles/core/image-transition/index.php
    23. /articles/core/inline-javascript/index.php
    24. /articles/core/investir/index.php
    25. /articles/core/it-budget/index.php
    26. /articles/core/javascript-animation/index.php
    27. /articles/core/junctions/index.php
    28. /articles/core/les-malheurs-IT/IT-soumis-business.php
    29. /articles/core/limites-de-la-croissance/club-de-rome.php
    30. /articles/core/link-rel-canonical/eviter-duplication-url-canonique.php
    31. /articles/core/link-rel/index.php
    32. /articles/core/longitude-latitude-google-maps/index.php
    33. /articles/core/meetings/index.php
    34. /articles/core/pack-and-go/index.php
    35. /articles/core/phases-de-projet/index.php
    36. /articles/core/php-server-variables/index.php
    37. /articles/core/pre-business-case/index.php
    38. /articles/core/project-management/principes-de-gestion-de-projet.php
    39. /articles/core/project-typology/index.php
    40. /articles/core/pso/index.php
    41. /articles/core/requirements management/index.php
    42. /articles/core/risk management/index.php
    43. /articles/core/rss/index.php
    44. /articles/core/scrum/index.php
    45. /articles/core/search-engine-optimization/accessibility-guidelines.php
    46. /articles/core/sepia/index.php
    47. /articles/core/sponsorship-meeting/index.php
    48. /articles/core/stylesheet-switching/index.php
    49. /articles/core/v-model/index.php
    50. /articles/core/vaesoli-transform-images/index.php
    51. /articles/core/wiki/index.php
    52. /articles/core/xhtml-tooltips/index.php
    53. /articles/core/xml-sitemap/index.php