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 :

Transformations CSS pour adapter une image


Sujet :

CSS

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 8
    Par défaut Transformations CSS pour adapter une image
    Bonjour,
    Je veux utiliser les transformations CSS pour ajuster dynamiquement une image et la positionner exactement entre 2 divs (eux-mêmes dépendant de la fenêtre du navigateur).
    Voici le code de la fonction d'adaptation que j'utilise :
    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
    function majImg ()
    {
    	var div = document.getElementById('img0');
    	var imgh, botmenu, topkeying;
    	var data, imgtranslate, imgscale;
     
    	// the image height
    	imgh = div.naturalHeight; 
    	// the upper limit to fit the image
    	botmenu = document.getElementById('menu').offsetTop + document.getElementById('menu').offsetHeight;
    	// the lower limit to fit the image
    	topkeying = document.getElementById('keyingzone').offsetTop;
     
    	// the scaling factor
    	imgscale = (topkeying - botmenu) / imgh;
    	// the translate factor
    	imgtranslate =  (imgh * (1 - imgscale)) / 2;
     
    	data = 'scale('+imgscale+','+imgscale+') translate(0px,'+imgtranslate+'px)';
    	div.style.transformOrigin = "center center"; 
    	div.style.webkitTransform = data; 
    	div.style.mozTransform    = data; 
    	div.style.msTransform     = data; 
    	div.style.oTransform      = data; 
    	div.style.transform       = data;
     
    }

    L'appli de test est dispo ici : http://vb-photo.com/tmp/
    L'image semble être bien redimensionnée (mais pas sûr à 100%) mais le positionnement n'est pas bon. Pourquoi à votre avis ?

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 212
    Par défaut
    Bonjour,
    y a t-il une raison particulière pour que tu réalises cela avec une transformation quand il me semble que le CSS de base suffit !?!

  3. #3
    Membre chevronné
    Profil pro
    Chef Gérant
    Inscrit en
    Octobre 2005
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Chef Gérant
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2005
    Messages : 230
    Par défaut
    Citation Envoyé par NoSmoking Voir le message
    Bonjour,
    y a t-il une raison particulière pour que tu réalises cela avec une transformation quand il me semble que le CSS de base suffit !?!
    En effet, on pense tout de suite a background-size .

    couplé a display:flex (ou table) et un height de 100% herité de html on peut faire ceci: http://codepen.io/gc-nomade/pen/advQpe .. si j'ai compris l'effet voulu.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <nav>test</nav>
    <div class="deco"></div>
    <form><input type="text" value="input"/></form>
    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
    html, body {
      height:100%;
    }
    body {
      display:flex;
      flex-direction:column;
      text-align:center;
      font-size:2em;
      line-height:1.6em;
    }
    .deco {
      background:url(http://vb-photo.com/tmp/J20100002001.jpg) no-repeat bottom center;
      flex:1;
      background-size:auto 100%
    }
    /* voyons voir */
    * {
      box-shadow:inset 0 0 0 1px purple;
    }

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 8
    Par défaut
    Bonjour et un grand merci à vous deux
    Votre solution marche très bien effectivement (je ne connaissais pas flex).

    En fait, après l'ajustement de l'image je dois ajouter une fonction de rotation de l'image (par pas de 90°) et de zoom (à plusieurs profondeurs) centré sur un point variable de l'image.
    Et donc je pensais faire tout ça avec une transformation (en ajoutant un facteur de zoom au scaling existant + une rotation).
    Est-ce compatible avec votre solution ? ou bien y a-t-il moyen de le faire autrement ?

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 212
    Par défaut
    ou bien y a-t-il moyen de le faire autrement ?
    as tu regardé du coté de l'API Canvas, j'avais mis un exemple sur le forum : Edition photo dans un canvas, regarde au post #6.

  6. #6
    Membre chevronné
    Profil pro
    Chef Gérant
    Inscrit en
    Octobre 2005
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Chef Gérant
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2005
    Messages : 230
    Par défaut
    re,

    Sinon, coté css , rotate et scale devrait le faire. http://codepen.io/gc-nomade/pen/JGGPmx démo rapide basé sur radio + :checked ... juste pour la demo

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 8
    Par défaut
    Merci à tous pour toutes ces pistes
    Avec tout ça, je pense que je vais m'en sortir.

    CCyrillus, à quoi correspond le facteur 0.175 ? Comment l'as-tu déterminé ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #r90:checked ~ .deco {
      transform: rotate(90deg) scale(0.715);
    }

  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 212
    Par défaut
    CCyrillus, à quoi correspond le facteur 0.1750.715 ? Comment l'as-tu déterminé ?
    c'est à quelque chose près le rapport hauteur/largeur, 1024/1440.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 8
    Par défaut
    ok, je comprends.
    Merci

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 8
    Par défaut
    J'ai repris l'exemple de CCyrillus pour commencer à l'intégrer dans mon appli.
    Mon souci c'est que l'image à afficher est variable et donc je dois pouvoir la changer dynamiquement.
    Pour ça, j'ai supprimé la déclaration background dans le css
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #imgdata {
    	overflow: hidden;	
    	flex:1;
    	background-size: auto 100%;
    }
    et je l'ai remplacée par la ligne suivante dans une page js :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    document.getElementById('imgdata').style.background = "url(http://vb-photo.com/tmp/J20100002001.jpg) no-repeat bottom center";
    Résultat : je vois bien l'image mais en tout petit et il n'y a plus aucun effet de redimensionnement.
    Qu'Est-ce que je n'ai pas bien fait ?

  11. #11
    Membre chevronné
    Profil pro
    Chef Gérant
    Inscrit en
    Octobre 2005
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Chef Gérant
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2005
    Messages : 230
    Par défaut
    Citation Envoyé par vibrasol Voir le message
    Résultat : je vois bien l'image mais en tout petit et il n'y a plus aucun effet de redimensionnement.
    Qu'Est-ce que je n'ai pas bien fait ?
    difficile de te dire avec si peu d'infos.(css et html), peut tu faire un codepen avec ton bug, les boules de cristal ne sont plus ce qu'elles étaient ?

    Sinon, as tu, par exemple, ajouté une bordure ou un ombrage interne à #imgdata , histoire de bien voir la surface qu'il couvre ? Quel(s) navigateur(s) ?

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 8
    Par défaut
    J'ai modifié le codepen initial en exportant la déclaration du background dans JS : http://codepen.io/vibra/pen/mVPMOM

  13. #13
    Membre chevronné
    Profil pro
    Chef Gérant
    Inscrit en
    Octobre 2005
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Chef Gérant
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2005
    Messages : 230
    Par défaut
    ou bien tu déclare à nouveau l'ensemble des propriétés : http://codepen.io/anon/pen/VeaqgM (background-size inclus)

    ou tu ne changes que le background-image:http://codepen.io/anon/pen/dGMwrz

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 8
    Par défaut
    Ok je comprends,
    Mais c'est pas évident de savoir ce qu'on est obligé de déclaré ensemble !
    Merci beaucoup.

  15. #15
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 8
    Par défaut
    J'ai intégré le code dans mon source et ça marche bien pour l'affichage de l'image.
    En revanche, j'ai un pb avec la rotation.
    Pour que ça puisse s'adapter selon les images, je dois remplacer le facteur 0.715 par le rapport h/l de l'image courante.
    Mais je n'arrive pas à récupérer ces valeurs à partir de l'image background chargée.
    Y a-t-il un moyen ou bien il faut charger l'image dans src pour pouvoir en récupérer les dimensions ?

  16. #16
    Membre chevronné
    Profil pro
    Chef Gérant
    Inscrit en
    Octobre 2005
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Chef Gérant
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2005
    Messages : 230
    Par défaut
    effectivement, coté navigateur il faut récupérer l'image dans une balise img, attendre qu'elle soit chargée (onload) pour enfin connaitre les dimensions et en calculer le ratio.

    sinon, coté serveur c'est plus rapide et plus sur.

    ++

Discussions similaires

  1. Lien pour TELECHARGER une image plutôt que pour l'ouvrir
    Par nabab dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/01/2005, 18h07
  2. Réponses: 13
    Dernier message: 23/12/2004, 18h01
  3. Réponses: 7
    Dernier message: 21/10/2004, 09h13
  4. Comment faire pour afficher une image ds une dbgrid
    Par totomaze dans le forum Bases de données
    Réponses: 2
    Dernier message: 16/10/2004, 15h31
  5. Mkisofs - problème pour créer une image
    Par tomnie dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 04/08/2004, 11h44

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