Fixer/Défixer un élément Bouton_activeFixer/Défixer un élément Bouton_hoverFixer/Défixer un élément Fb-hoverFixer/Défixer un élément Fb-active
CSSActif, le forum, n'est plus maintenu. Il est néanmoins disponible pour consultation. Pour des outils pratiques, rendez-vous sur:

Découvrez CSSActif, une collection d'outils et de tutoriels interactifs pour les développeurs Web — HTML, CSS, JavaScript et bien plus!

Derniers sujets
» Fiche de Présentation RPG
Fixer/Défixer un élément EmptySam 30 Mar 2024, 22:07 par Peyton972

» [RPG] Fiche personnage avec bannière
Fixer/Défixer un élément EmptySam 30 Mar 2024, 22:06 par Peyton972

» Structure de Qui Est En Ligne (1)
Fixer/Défixer un élément EmptyLun 04 Mar 2024, 23:20 par Peyton972

» Qui Est En Ligne - Utopia
Fixer/Défixer un élément EmptyDim 24 Déc 2023, 18:16 par romee

» Pack forum complet "Androïd Sylver" RPU (N°2)
Fixer/Défixer un élément EmptyJeu 02 Nov 2023, 06:42 par Hydrar

» Formulaire de connexion rapide amélioré
Fixer/Défixer un élément EmptySam 04 Mar 2023, 18:57 par Krager

» Avatar centré dans le profil
Fixer/Défixer un élément EmptySam 11 Fév 2023, 06:04 par Krager

» Vos partenaires dans le footer
Fixer/Défixer un élément EmptyMar 07 Fév 2023, 08:40 par Oxtran

Le Deal du moment : -20%
-20% Récupérateur à eau mural 300 ...
Voir le deal
79 €

Partagez
 

Fixer/Défixer un élément

Voir le sujet précédent Voir le sujet suivant Aller en bas 
james1920
james1920
{ Membre actif }
{ Membre actif }

Masculin Messages : 422



Fixer/Défixer un élément Empty

Fixer/Défixer un élément


Informations générales

Description :
Dans ce tutoriel nous verrons comment fixer/défixer un élément sur la page, par simple clic. Cela nécessitera de faire appel à du CSS (pour créer les styles fixé/défixé) et à un soupçon de JS (pour pouvoir appliquer alternativement ces styles à notre élément).

En avant !

Démo :
A la fin de ce tutoriel, nous verrons comment réaliser une barre de navigation qui se fixe/défixe par simple clic sur un bouton :

Etat défixé < > Etat fixé

Testé sur :
Firefox, Chrome, Safari, Opera, Internet Explorer

Crédits :
Proposé par James le 24/02/2011 | Validé par Haribot

Mise(s) à jour :
Mise à jour le 05/08/2012 par Espeon

Le tutoriel


La théorie par l'exemple


Pour commencer ce tutoriel, je vais vous expliquer le principe (simple) de l'effet que nous souhaitons réaliser et nous allons le tester sur un exemple.

Un élément défixé est un élément par défaut, positionné dans la page, qui bouge en même temps qu'elle, lorsque vous faites défiler celle-ci : il reste à la place qui est la sienne par rapport aux autres éléments.
Un élément fixé est un élément qui est positionné par rapport à la fenêtre de votre navigateur internet préféré. Que vous montiez ou descendiez dans la page, l'élément reste au même endroit sur votre écran.

Pour fixer un élément, on fait appel au CSS. C'est la propriété position qui, lorsqu'elle prend la valeur fixed, applique cet effet. Ainsi, on peux fixer un élément ayant la classe .fixe de la manière suivante :
Code:
.fixe {
  position: fixed;
}

A propos de position:

Une fois fixé, il faut positionner l'élément comme bon vous semble. C'est là qu'interviennent les propriétés top, left, right et bottom. Elles prennent comme valeur la distance que vous souhaitez placer entre votre élément et respectivement le haut, la gauche, la droite et le bas de votre écran.
Il va de soi qu'il est inutile de détailler les 4 propriétés, 2 suffisent amplement à positionner votre élément. Nous allons voir ça dans l'exemple qui suit.

Enfin, pour switcher entre les deux états (fixé/défixé) d'un élément lors d'un clic, il nous faut faire appel à un soupçon de javascript ! Cool

C'est ce que nous allons tester tout de suite !

Le CSS


Commençons par le CSS. Nous allons créer 2 éléments différents, que nous repérons avec les sélecteurs suivants :
  1. Le premier définira notre élément exemple, nous utiliserons une div qui définit un élément bloc quelconque, repéré par l'identifiant #exemple.
  2. Le second est une simple classe .fixe permettra de fixer tout élément qui comporte cette classe.


Code:
/* Design général de notre élément, pour le visualiser sur l'exemple */
div#exemple {
  background-color: red;
  width: 100px; /* largeur de l'élément */
  height: 100px; /* hauteur de l'élément */
  margin: 0; /* marge extérieure de l'élement */

  /* Position de l'élément sur la page lorsqu'il est fixé */
  top:0px;
  left:0px;
}

/* La partie intéressante pour fixer un élément */
.fixe {
  position: fixed;
}

Pour placer ces codes dans la feuille de style de votre forum, rendez-vous sur Panneau d'Administration > Affichage > Couleurs > Feuilles de style CSS.

Lorsque l'élément est fixé sur la page, il se positionne à un endroit fixe de votre écran et y reste. Comme je vous l'ai expliqué, c'est à positionner l'élément lorsqu'il est fixé que servent les propriétés top et left.

Ici à 0 (en haut à gauche de l'écran donc), il ne tient qu'à vous de leur attribuer une valeur, positive ou négative, pour placer votre élément à une certaine distance du haut (top) et de la gauche (left) de votre page.

Je vous rappelle également qu'au lieu de top, vous pouvez utiliser bottom pour placer plutôt votre élément par rapport au bas de la page; au lieu de left vous pouvez utiliser right pour placer votre élément par rapport à la droite de la page plutôt qu'à sa gauche.


Le Javascript


Nous allons utiliser certaines fonctionnalités qui dépendent de la librairie jQuery. Pas de panique, cette librairie (très puissante et très connue), qui nous met à disposition un certain nombre de fonctions, est incluse par défaut dans FA.

Ainsi, vous avez simplement à vous préoccuper d'installer le code suivant dans vos scripts : Panneau d'Administration > Modules > Gestion des codes javascript.

Code:
$(document).ready(function() {
    /* Element sur lequel on va appliquer l'effet - Modifiable */
    var element = 'div#exemple';

    /* Inutile de toucher au code ci-dessous */
    $(element).click(function() {
        if($(this).hasClass('fixe')) {
            $(this).removeClass('fixe');
        } else {
            $(this).addClass('fixe');
        }
    });
});

Vous remarquerez la présence de var element = 'div#exemple';. En effet, dans mon cas, je cible une div d'identifiant exemple. Mais si votre élément à vous diffère, il ne tient qu'à vous de changer ce sélecteur (qui est le même qu'en CSS je vous ferai remarquer), sans toucher au coeur du code (qui peut rebuter certains d'entre vous, même si au fond il n'est pas bien complexe).


Pour ceux qui s'intéressent au code:

Tester l'effet


Nous allons enfin tester notre splendide effet. Pour cela il nous faut rajouter dans le HTML une div d'identifiant #exemple.

Pour ma part, je suis allé dans Panneau d'Administration > Affichage > Page d'Accueil > Généralités pour mettre dans le message d'accueil le code suivant :
Code:
<div id="exemple"></div>

Validez et testez à présent sur votre forum. En cliquant sur le carré rouge fraîchement créé, celui-ci doit aller se ficher en haut à gauche de votre écran et y rester. Cliquez à nouveau dessus pour le replacer où il était !

Voilà sur le principe, à présent, nous allons voir une mise en pratique qui peut être intéressante. Il nous faudra changer un chouïa le script JS pour ne plus avoir à cliquer sur l'élément mais sur un bouton extérieur afin de fixer/défixer notre élément, mais ne vous en faites pas, je fournis les codes complexes. Wink

Application pratique - Barre de navigation


Nous allons donc mettre en pratique notre exemple pour créer une barre de navigation fixable/défixable sur votre forum. Si vous avez tout compris jusque là, ça ne devrait pas être bien plus complexe.

Maintenant que la théorie est passée, je vous conseille de reprendre à 0 et d'effacer les modifications CSS/JS/Templates que vous venez de faire pour tester l'effet. Autant repartir sur quelque chose de propre.

Vous êtes prêt ? C'est parti...


Vous l'aurez compris, il va nous falloir toucher à 3 choses :
  1. Les templates afin d'y apporter les modifications sur le HTML : la structure du forum
  2. Le CSS pour y placer notre style spécifique et définir l'apparence de nos éléments (fixé/défixé)
  3. Le JS pour passer dynamiquement d'un élément fixé à un élément défixé lors d'un événement (le clic).


Petite amélioration cependant, nous allons cette fois rajouter un bouton au bout de la barre de navigation afin de fixer/défixer celle-ci. En effet, ce sera toujours mieux d'éviter que l'effet ne se lance tout seul dès lors qu'on clique sur la barre de navigation (ce qui ne serait pas génial).

Pour cet exemple pratique, je suis allé chercher 2 images de cadenas ouvert et fermé afin d'illustrer l'état fixé/défixé de la barre. Ces images sont hébergées sur CSSActif, mais rien ne vous empêche je vous conseille d'adapter la pratique à votre forum et de remplacer mes images par les vôtres.

Cadenas fermé : http://upload.cssactif.com/image/97lock.png
Cadenas ouvert : http://upload.cssactif.com/image/18unlock.png
Origine des icônes : http://dryicons.com


Le Template


Rendez-vous dans Panneau d'Administration > Affichage > Templates > Général et choisissez le template qui fait intervenir votre barre de navigation : overall_header.

Il nous faut repérer notre barre. Ce ne devrait pas être trop complexe quand on sait qu'il s'agit de repérer le mot clef suivant : {GENERATED_NAV_BAR}.

Vous devriez avoir quelque chose comme ça :
Code:
<table cellspacing="0" cellpadding="0" border="0" align="{MENU_POSITION}">
   <tr>
      <td align="{MENU_POSITION}"{MENU_NOWRAP}>{GENERATED_NAV_BAR}</td>
   </tr>
</table>

Nous allons faire 2 choses ici :
  1. Placer un identifiant sur la barre de navigation, afin de pouvoir la fixer par la suite. Nous l'appellerons fix-navbar pour qu'il soit explicite (bonne pratique) et unique (principe d'un identifiant)
  2. Ajouter une cellule en bout de barre contenant une simple image. Nous lui mettrons un identifiant fix-control histoire d'y accéder rapidement par la suite également.


Ce qui nous donne, si vous avez tout suivi :
Code:
<table id="fix-navbar" cellspacing="0" cellpadding="0" border="0" align="{MENU_POSITION}">
   <tr>
      <td align="{MENU_POSITION}"{MENU_NOWRAP}>{GENERATED_NAV_BAR}</td>
      <td><img id='fix-control' src='' /></td>
   </tr>
</table>



Le CSS


Passons au style maintenant. Rendez-vous dans Panneau d'Administration > Affichage > Couleurs > Feuilles de style CSS.

Il s'agit ici de :
  1. Créer une classe .fixe qui définira la position fixée de notre élément
  2. Eventuellement styliser notre barre de navigation, si besoin.


Dans mon cas, le CSS est le suivant :
Code:
.fixe {
  position: fixed;    /* Fixe l'élément */

  /*
    Spécifique à mon forum d'exemple.
    Je rajoute une marge à gauche de 78px pour compenser 
    celle perdue lorsque la position passe en valeur fixed
  */
  margin-left: 78px;
}

#fix-navbar {
  /* A vous de styliser la barre comme bon vous semble, via l'identifiant que nous y avons placé ! */
  background-color: grey;    /* Je choisis de mettre un fond gris pour que vous puissiez voir l'exemple */
  bottom: 0;    /* Je choisis de fixer ma barre en bas de mon écran dans mon cas */
}

Normalement, ça ne nécessite pas plus d'explication et vous devriez être capable de placer seul la barre si vous avez suivi le tuto jusque là !

Le Javascript


Rendez-vous dans Panneau d'Administration > Modules > Gestion des codes Javascript.

Cette fois, nous allons modifier un chouïa le script pour :
  1. Distinguer le bouton (sur lequel on clique) de l'élément à fixer (la barre toute entière)
  2.  Changer également l'image du cadenas, en fonction de l'état (fixé ou non) de la barre.


Cela nous donne :
Code:
$(document).ready(function() {
    /* Variables modifiables */
    var element = '#fix-navbar';
    var control = '#fix-control';
    var iconFixe = 'http://upload.cssactif.com/image/97lock.png';
    var iconDefixe = 'http://upload.cssactif.com/image/18unlock.png';

    /* Inutile de modifier le code ci-dessous */
    $(control).attr('src',iconFixe);  /* Charge l'image par défaut du bouton */
    $(control).click(function() {
        if($(element).hasClass('fixe')) {
            $(control).attr('src',iconFixe);
            $(element).removeClass('fixe');
        } else {
            $(control).attr('src',iconDefixe);
            $(element).addClass('fixe');
        }
    });
});

Bien entendu, je vous laisse personnaliser les variables suivantes :
  • element : il s'agit de l'identifiant de l'élément à fixer (ici l'identifiant de notre barre de navigation)
  • control : il s'agit de l'identifiant de notre élément qui contrôle le changement d'état (ici l'identifiant de notre image-bouton)
  • iconFixe : il s'agit de l'URL de l'image à cliquer pour fixer la barre (ici, cadenas fermé)
  • iconDefixe : il s'agit de l'URL de l'image à cliquer pour défixer la barre (ici, cadenas ouvert)


Dans mon cas, j'ai choisi de mettre un cadenas fermé lorsque la barre est défixée, ouvert lorsqu'elle est fixée, pour exprimer l'état dans lequel sera la barre lorsque vous cliquerez sur le bouton. C'est un choix personnel, il est tout à fait envisageable de faire l'inverse, en changeant rapidement les url des variables correspondantes iconFixe et iconDefixe.


Attention : pour appliquer le script sur l'ensemble de votre forum, n'oubliez pas de cocher la case "Sur toutes les pages".


Et voici, ça devrait fonctionner à présent Paix


Pour terminer sur les mots de l'auteur d'origine de ce tutoriel :
James a écrit:
Je crois que vous avez maintenant tout.

Bonne continuation, James.
MessageSujet: Fixer/Défixer un élément   Fixer/Défixer un élément EmptyJeu 24 Fév 2011, 13:02
Revenir en haut Aller en bas
http://www.i-love-harvard.com/
Kaiji
Kaiji
Blanche-Neige
Blanche-Neige

Féminin Messages : 5578



Fixer/Défixer un élément Empty
FAQ


Q
Lorsque j'applique ton tutoriel, ma barre de navigation se retrouve EN DESSOUS de mon forum. Que faire ?

R
C'est probablement dû au fait que vous ayez déjà bidouillé votre forum, en changeant son positionnement pour le compte d'un autre tuto peut-être.

Une solution à cela est de faire passer la barre de navigation au-dessus de votre forum, en jouant sur son index. Essayez donc de rajouter la propriété z-index à votre classe .fixe :
Code:
.fixe {
    ...
    z-index: 100;  /* Pour que la barre de navigation reste au-dessus du forum */
}


Pour toute question sur ce tutoriel, merci de poster une demande d'aide ici :
http://www.css-actif.com/f17-aide-css-xhtml
MessageSujet: Re: Fixer/Défixer un élément   Fixer/Défixer un élément EmptyVen 22 Juil 2011, 08:34
Revenir en haut Aller en bas
Espeon
Espeon
Administrateur
Administrateur

Masculin Messages : 1819



Fixer/Défixer un élément Empty
07-08-12 : Tutoriel (profondément) revu et mis à jour
MessageSujet: Re: Fixer/Défixer un élément   Fixer/Défixer un élément EmptyMar 07 Aoû 2012, 06:44
Revenir en haut Aller en bas
Contenu sponsorisé




Fixer/Défixer un élément Empty
MessageSujet: Re: Fixer/Défixer un élément   Fixer/Défixer un élément Empty
Revenir en haut Aller en bas
 

Fixer/Défixer un élément

Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1

 Sujets similaires

-
» Fixer un élément sur la page
» Fixer un élément sur la page (messages)
» [résolu] problème pour fixer mes header
» <Navigation> Fixer la barre de navigation
» Sortir un élément du bodyline

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
CSSActif :: Tutoriels de CSSActif :: ForumActif Pas à pas :: Le Header-

Partenaires Or


← Page précédente   ↑ Aller en haut Copyright © CSSActif 2009 - 2013 Tous droits réservés
Créer un forum | ©phpBB | Forum gratuit d'entraide | Signaler un abus | Forum gratuit