IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Mise en page CSS Discussion :

Centrage horizontal pour ma lightbox


Sujet :

Centrer un élément en CSS

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 273
    Points : 152
    Points
    152
    Par défaut Centrage horizontal pour ma lightbox
    Bonsoir

    Mon site contient de nombreuses images qui sont affichées en petit, un clique permet de les agrandir. Pour cela j'utilise une lightbox. Il y a très peu de codes mais malheureusement je n'y arrive quand même pas.
    Tout d'abord, voici ce que ça donne avec le code actuel :

    Nom : a.jpg
Affichages : 170
Taille : 300,6 Ko

    Malheureusement je pense que c'est pas centré sur tous les PC, de plus avec les images de taille différente ça fait moche :

    Nom : b.jpg
Affichages : 164
Taille : 133,4 Ko

    J'ai un peu modifié le code mais je suis obligé de jouer avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    width: 600 px; 
    margin-left: -315px;
    afin de centrer le tout, ce qui n'est vraiment pas pratique car ce n'est pas automatique en fonction de la taille de l'image. Voici ce que j'obtiens :

    Nom : c.jpg
Affichages : 171
Taille : 137,2 Ko

    Je souhaite donc que ma lightbox soit centrée horizontalement et verticalement et que ça s'adapte automatiquement à la taille de l'image. J'ai cherché plusieurs heures mais je suis vraiment perdu.

    Voici le CSS pour ce qu'on voit sur la dernière image :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    #shadowing{
    	display: none;
    	position: fixed;
    	top: 0%;
    	left: 0%;
    	width: 100%;
    	height: 100%;
    	background-color: #CCA;
    	z-index:10000;
    	opacity:0.6;
    	filter: alpha(opacity=50);
    }
     
    #box { 
    	display: none;
    	position: fixed;
    	height:auto;
    	max-height:auto !important;	
    	margin-left: auto;
        margin-right: auto;
    	text-align: center;
    	border: 2px solid black;
    	background-color: white;
    	z-index:10000;
    	background-color: #8E8E8E;
    	top: 50%;
        left: 50%;
        margin: -166px 0 0 -166px;
    	width: 600 px; 
    	margin-left: -315px;
    }
     
     
    #boxcontent{ 
    	left:0;
    	right:0;
    	bottom:0;
    	margin:0; 
    	padding: 8px;
    	overflow: auto;
    	width:100%;
    	height:100%;
    	z-index: 10000;
    }
     
    #boxtitle{ 
    	left:0%;
    	width:100%;
    	height:20px;
    	padding:0;
    	margin:auto;
    	color:black;
    	text-align:center;
    	z-index: 10000;
    }
    Sur ma page html j'ai également mis ces lignes :

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <div id="shadowing"></div>
    <div id="box">
        <div id="boxcontent"  onclick="closebox()">  </div> 
        <div id="boxtitle"> Titre </div>
    </div>

    Et enfin le JavaScript qui permet entre autre de placer le texte de mon choix sous l'image :

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    function openbox(url,titre){ 
    	var box = document.getElementById('box'); 
    	document.getElementById('shadowing').style.display='block';
     
    	var title = document.getElementById('boxtitle');
    	title.innerHTML = titre;
     
    	var content = document.getElementById('boxcontent');
    	content.style.padding="0";
     
    	content.innerHTML = "<img src=" + url + " />";
     
    	box.style.display='block';	
    }
     
     
    function closebox(){
    	document.getElementById('box').style.display='none';
    	document.getElementById('shadowing').style.display='none';
    }

    Et j'intègre le tout à ma page avec

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <center><img src="screens/52_reduit.jpg" onclick="openbox('screens/52_reelle.jpg','27 septembre 2014');" alt="mixmaster"/></center>

    Le problème est uniquement lié au CCS mais bon je vous le donne quand même.

    Auriez vous une idée ?

    Une piste ?

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de rodolphebrd
    Homme Profil pro
    Indépendant
    Inscrit en
    Novembre 2012
    Messages
    2 336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Indépendant
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 336
    Points : 5 443
    Points
    5 443
    Par défaut
    Bonjour,

    on peut voir la page en ligne ?
    Pensez à
    lire les règles du forum effectuer une recherche préalable
    utiliser la balise code (#) éditer votre code sur Codepen, Dabblet, Jsfiddle
    clore votre post avec le bouton

  3. #3
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 956
    Points : 44 116
    Points
    44 116
    Par défaut
    Bonjour,
    si tu gères cela en javascript, il te faut attendre que l'image soit chargé pour pouvoir redimensionner son conteneur.

  4. #4
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 273
    Points : 152
    Points
    152
    Par défaut
    Bonsoir

    Désolé j'avais oublié le plus important.

    Voilà : http://fan-de-mixmaster.legtux.org/s...hots_page1.php
    Là c'est le CSS qui pose problème (voir mes copie d'écran dans le premier message) lorsque l'image est plus petite.

    Bonne nuit

  5. #5
    Expert confirmé
    Avatar de rodolphebrd
    Homme Profil pro
    Indépendant
    Inscrit en
    Novembre 2012
    Messages
    2 336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Indépendant
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 336
    Points : 5 443
    Points
    5 443
    Par défaut
    J'appliquerais le style au DIV suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #boxcontent{
       position: fixed;
       left:0;
       right:0;
       margin:0 auto; 
       z-index: 10000;
       width: 810px;
    }
    Je supprimerais tous les styles du DIV #box en ne laissant que le border.

    Après il serait intéressant d'enlever toutes les déclarations qui ne servent à rien et de comprendre ce que tu écris. Et de commencer par le commencement c'est à dire les tutos du forum : Les meilleurs cours et tutoriels CSS
    Pensez à
    lire les règles du forum effectuer une recherche préalable
    utiliser la balise code (#) éditer votre code sur Codepen, Dabblet, Jsfiddle
    clore votre post avec le bouton

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 273
    Points : 152
    Points
    152
    Par défaut
    Bonjour

    J'ai fais ce que vous avez proposé mais maintenant il y a plusieurs problèmes :
    - Quand j'actualise la page je vois "Titre" en haut ainsi qu'un cadre au contour noir
    - Quand je clique sur une image elle est complètement en bas ce qui empêche de voir le titre qui est marqué dessous
    - Quand je clique sur une petite image (il y en a 4 sur la page) elle n'est pas du tout centrée.

    Effectivement, je ne maîtrise pas bien le CSS mais c'est quand même compliqué de mettre les bons paramètres dans chaque div afin que chaque image qu'importe sa taille s'affiche correctement au milieu avec le titre dessous et cela qu'importe la taille de l'écran du PC.

    Bonne soirée

  7. #7
    Expert confirmé
    Avatar de rodolphebrd
    Homme Profil pro
    Indépendant
    Inscrit en
    Novembre 2012
    Messages
    2 336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Indépendant
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 336
    Points : 5 443
    Points
    5 443
    Par défaut
    Il y a des tutos sur le sites qui peuvent t'éclairer : créer une fenêtre modale CSS3 + créer une fenêtre modale en CSS et jQuery
    Pensez à
    lire les règles du forum effectuer une recherche préalable
    utiliser la balise code (#) éditer votre code sur Codepen, Dabblet, Jsfiddle
    clore votre post avec le bouton

  8. #8
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 956
    Points : 44 116
    Points
    44 116
    Par défaut
    Centrer horizontalement/verticalement, via une feuille de style, n'est pas un réel soucis quand celui ci est dimensionné ce qui n'est malheureusement pas ton cas tout du moins au chargement de l'image.

    Il existe bien une solution en CSS3, je parle des flex-box et cela marche bien...MAIS...attendu du mauvais support de ces propriétés actuellement il ne paraît pas judicieux de les utiliser. Flexible Box Layout Module.

    Comme je le laissais entendre plus haut, la solution javascript, simple à mettre en oeuvre, pas forcément besoin de lightBox, t'obligeras à attendre le chargement de l'image pour dimensionner, avec les marges négatives par exemple, le conteneur de ton image.

  9. #9
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 273
    Points : 152
    Points
    152
    Par défaut
    Bonsoir

    Avec de l'aide concernant le raisonnement, j'ai mis en place une solution pour pallier au problème de centrage.
    Donc en résumé :

    Sur ma page html j'inclus un fichier javascript :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <script src="lightbox-image.js" type="text/javascript"></script>

    Sur la page html je met un bout de code qui va indiquer à la lightbox comment positionner les différentes div (moi je l'ai placé sous le menu) :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <div id="shadowing"></div>
    <div id="box">
        <div id="boxcontent"  onclick="closebox()">  </div> 
        <div id="boxtitle"> Titre </div>
    </div>

    Sur la page html j'insère les images ainsi :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <div id="screenshots"><img src="le lien vers l image taille reduite qui sera affichee" onclick="openbox('le lien vers l image taille reelle qui sera affichee dans la lightbox','un titre qui sera sous l image','la largueur de l image en nombre de pixels');"/></div>
    Je suis obligé d'insérer la largueur de l'image qui sera dans la lightbox car depuis le javascript je ne peux récupérer que la largueur de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <img src="le lien vers l image taille reduite qui sera affichee">
    hors il faut récupérer la largueur de celle qui sera dans la lightbox afin de la centrer.

    Ensuite dans le CSS :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    #shadowing{
    	display: none;
    	position: fixed;
    	top: 0%;
    	left: 0%;
    	width: 100%;
    	height: 100%;
    	background-color: #CCA;
    	z-index:10000;
    	opacity:0.6;
    	filter: alpha(opacity=50);
    }
     
    #box { 
    	display: none;
    	position: fixed;
    	text-align: center;
    	padding: 0px;
    	width: auto; 
    	height:auto;
    	max-width:auto !important; 
    	max-height:auto !important;
        left: 0px;
    	border: 2px solid black;
    	background-color: white;
    	z-index:10000;
    	background-color: #8E8E8E;
    }
     
     
    #boxcontent{ 
    	left:0;
    	right:0;
    	bottom:0;
    	margin:0; 
    	padding: 8px;
    	overflow: auto;
    	width:100%;
    	height:100%;
    	z-index: 10000;
    }
     
    #boxtitle{ 
    	left:0%;
    	width:100%;
    	height:20px;
    	padding:0;
    	margin:auto;
    	color:black;
    	text-align:center;
    	z-index: 10000;
    }
    Déjà mieux que mon système de marge négative que j'avais avant sachant que ça ne centrais pas sur les écrans différents du mien. Je n'ai pas mis de dans le code lié à la lightbox car il se trouve déjà dans le code de la div qui englobe tout le contenu de ma page.

    Pour finir, le javascript :

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    var largF = null;
    function openbox(url,titre,larg_lightbox)
    { 
        calclargueurecran();
    	var box = document.getElementById('box'); 
    	document.getElementById('shadowing').style.display='block';
     
    	var title = document.getElementById('boxtitle');
    	title.innerHTML = titre;
     
    	var content = document.getElementById('boxcontent');
    	content.style.padding="0";
     
    	content.innerHTML = "<img src=" + url + " />";
     
    	box.style.display='block';	
    	var l =(parseInt(largF,10)-(parseInt(larg_lightbox,10) ))/parseInt("2",10);
    	l=l+'px';
    	document.getElementById('box').style.left= l;
    }
     
     
    function closebox()
    {
    	document.getElementById('box').style.display='none';
    	document.getElementById('shadowing').style.display='none';
    }	
     
     
    function calclargueurecran()
    {
    if (typeof(window.innerHeight)=='number') 
    {
     
    largF = window.innerWidth;
    }
    else 
    {
    if (document.documentElement&&
    document.documentElement.clientHeight) {
     
    largF = document.documentElement.clientWidth;
    }
    else 
    {
    if (document.body&&document.body.clientHeight) {
    largF = document.body.clientWidth;
     
    }
    }
    }
    largF = largF - parseInt(19,10);
    }

    A la fin je retire 19 pixels pour la largueur de la scollbar de droite qui est incluse dans largF mais que je dois retirer pour centrer correctement. C'est de la bidouille mais ça centre correctement à 1 millimètre près, ce qui me suffit.
    Si vous ouvrez la même image que celle affichée sur la page html, vous pouvez utiliser la solution suivante : http://www.developpez.net/forums/d18...rc/#post128372 et ainsi larg_lightbox ne devra pas être passé en paramètre à la fonction mais pourra être calculé directement dans le javascript. Cependant, je le déconseille car l'image que moi j'affiche sur la page html a un poids plus faible et une taille plus faible que celle de la lightbox ce qui permet de diminuer le temps de chargement de la page. Après tout, ce n'est qu'un nombre à marquer en paramètre à la fonction, rien de compliqué à trouver dans les paramètres de l'image après avoir fait un clique droit dessus

    Voilà, j'espère que mon explication pourra aider quelqu'un qui a le même soucis.

    Bonne nuit

  10. #10
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 956
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 956
    Points : 44 116
    Points
    44 116
    Par défaut
    Déjà mieux que mon système de marge négative que j'avais avant sachant que ça ne centrais pas sur les écrans différents du mien.
    j'ai un peu des doutes !


    A la fin je retire 19 pixels pour la largueur de la scollbar de droite qui est incluse dans largF mais que je dois retirer pour centrer correctement. C'est de la bidouille mais ça centre correctement à 1 millimètre près, ce qui me suffit.
    Là je ne te le fais pas dire mais si cela te convient que ce passe t-il lorsque tu redimensionnes ta fenêtre lorsque la "lightBox" est visible ?


    Après tout, ce n'est qu'un nombre à marquer en paramètre à la fonction, rien de compliqué à trouver dans les paramètres de l'image après avoir fait un clique droit dessus
    Là encore il n'y a rien de vraiment pertinent et modulable, les dimensions de l'image sont facilement récupérables une fois l'image chargée. Que fais tu si tu changes l'image, tu modifies ton code HTML ?

    Je ne pense donc pas que tu mettes en oeuvre une méthode efficace!

  11. #11
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 273
    Points : 152
    Points
    152
    Par défaut
    Bonsoir

    Si je redimensionne la fenêtre lorsque la lightbox est visible, elle reste en place et fini par disparaître si on réduit trop. Il faudrait lancer la fonction de calcul de la largueur de la fenêtre pratiquement chaque seconde et déplacer la lightbox en fonction de ça ... bien trop compliqué pour moi.

    Je ne changerais pas l'image, pour chaque image que j'insère, je place le code HTML en mettant la largueur en paramètre à la fonction. Puisque chaque image a sa ligne de code je n'ai rien à modifier.

    Je suis d'accord que c'est loin d'être parfait mais comment faire mieux ?

    J'arrive à la limite de ma compréhension du javascript, déjà qu'avant je ne savais pratiquement rien coder dans ce langage mais maintenant ce n'est pas mieux ...

    Si vous me dites exactement quoi faire et comment voir même que vous me donnez mon code mais modifié pour que ça fonctionne si on redimensionne l'image et sans devoir marquer manuellement la largueur de chaque image, je veux bien faire l'effort de le comprendre pour y arriver seul la prochaine fois.

    Bonne soirée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Centrage horizontal avec firefox
    Par Starneo dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 24/04/2009, 12h39
  2. Centrage horizontal et position absolute
    Par SpaceFrog dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 06/04/2009, 11h18
  3. Centrage horizontal et vertical dans tous les onglets
    Par bibvba dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 22/04/2008, 09h30
  4. [CSS] Problème de centrage horizontal
    Par BnA dans le forum Mise en page CSS
    Réponses: 11
    Dernier message: 11/08/2006, 12h03
  5. [XSL-FO]centrage horizontal
    Par kroky dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 01/03/2006, 15h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo