43 votes

Jquery redimensionnement de l'image

J'aimerais lancer une discussion sur le redimensionnement des images à l'aide de jQuery.

C'est ma contribution : Mais je pense que je suis loin de la solution. Et pour le recadrage ? Qui peut m'aider ?

$(document).ready(function() {
    $('.story-small img').each(function() {
    var maxWidth = 100; // Max width for the image
    var maxHeight = 100;    // Max height for the image
    var ratio = 0;  // Used for aspect ratio
    var width = $(this).width();    // Current image width
    var height = $(this).height();  // Current image height

    // Check if the current width is larger than the max
    if(width > maxWidth){
        ratio = maxWidth / width;   // get ratio for scaling image
        $(this).css("width", maxWidth); // Set new width
        $(this).css("height", height * ratio);  // Scale height based on ratio
        height = height * ratio;    // Reset height to match scaled image
    }

    // Check if current height is larger than max
    if(height > maxHeight){
        ratio = maxHeight / height; // get ratio for scaling image
        $(this).css("height", maxHeight);   // Set new height
        $(this).css("width", width * ratio);    // Scale width based on ratio
        width = width * ratio;    // Reset width to match scaled image
    }
});

}) ;

0 votes

Avez-vous une idée de la raison pour laquelle cela ne fonctionne pas avec var maxWidth = $(document).width(); . Jetez un coup d'œil : jsfiddle.net/KHdZG/16

2 votes

Étant donné que jQuery/javascript s'exécute dans le client, si un fichier sur le serveur fait 2 Mo, le navigateur doit quand même télécharger la totalité des 2 Mo avant de rendre une image 100x100. Est-ce exact ?

27voto

Vous devez recalculer la largeur et la hauteur après la première condition. Voici le code de l'ensemble du script :

$(document).ready(function() {
    $('.story-small img').each(function() {
    var maxWidth = 100; // Max width for the image
    var maxHeight = 100;    // Max height for the image
    var ratio = 0;  // Used for aspect ratio
    var width = $(this).width();    // Current image width
    var height = $(this).height();  // Current image height

    // Check if the current width is larger than the max
    if(width > maxWidth){
        ratio = maxWidth / width;   // get ratio for scaling image
        $(this).css("width", maxWidth); // Set new width
        $(this).css("height", height * ratio);  // Scale height based on ratio
        height = height * ratio;    // Reset height to match scaled image
    }

    var width = $(this).width();    // Current image width
    var height = $(this).height();  // Current image height

    // Check if current height is larger than max
    if(height > maxHeight){
        ratio = maxHeight / height; // get ratio for scaling image
        $(this).css("height", maxHeight);   // Set new height
        $(this).css("width", width * ratio);    // Scale width based on ratio
        width = width * ratio;    // Reset width to match scaled image
    }
});

2 votes

Tu as oublié de fermer la fonction externe avec }) ;

0 votes

Pourquoi définir la hauteur et la largeur dans les dernières lignes des blocs if ? Après avoir fait height = height * ratio; ne remplacez-vous pas alors cela par var height = $(this).height(); juste à l'extérieur du bloc if ? Merci.

11voto

Nathan Long Points 30303

Quelques suggestions :

  • Faites-en une fonction dans laquelle vous pouvez passer une taille maximale ou minimale, plutôt que de la coder en dur ; cela la rendra plus réutilisable.
  • Si vous utilisez l'option de jQuery .animate comme .animate({width: maxWidth}) il devrait automatiquement mettre à l'échelle l'autre dimension pour vous.

1 votes

L'utilisation de la méthode jQuery .animate ne permet de modifier l'échelle qu'en fonction d'une seule dimension. En d'autres termes, je ne peux pas définir une largeur et une hauteur maximales.

2 votes

@davekaro - à partir de la documentation : "On peut, par exemple, animer simultanément la largeur et la hauteur..." api.jquery.com/animate

0 votes

J'ai bien vu qu'il fallait utiliser .animate() de cette façon. Je n'étais pas du tout conscient qu'il fallait mettre à l'échelle l'autre dimension, ce qui permet de conserver un rapport d'aspect correct.

6voto

Tyler Points 78

Bon départ. Voici ce que j'ai trouvé :

$('img.resize').each(function(){
    $(this).load(function(){
        var maxWidth = $(this).width(); // Max width for the image
        var maxHeight = $(this).height();   // Max height for the image
        $(this).css("width", "auto").css("height", "auto"); // Remove existing CSS
        $(this).removeAttr("width").removeAttr("height"); // Remove HTML attributes
        var width = $(this).width();    // Current image width
        var height = $(this).height();  // Current image height

        if(width > height) {
            // Check if the current width is larger than the max
            if(width > maxWidth){
                var ratio = maxWidth / width;   // get ratio for scaling image
                $(this).css("width", maxWidth); // Set new width
                $(this).css("height", height * ratio);  // Scale height based on ratio
                height = height * ratio;    // Reset height to match scaled image
            }
        } else {
            // Check if current height is larger than max
            if(height > maxHeight){
                var ratio = maxHeight / height; // get ratio for scaling image
                $(this).css("height", maxHeight);   // Set new height
                $(this).css("width", width * ratio);    // Scale width based on ratio
                width = width * ratio;  // Reset width to match scaled image
            }
        }
    });
});

Cela présente l'avantage de vous permettre de spécifier à la fois la largeur et la hauteur tout en permettant à l'image d'être mise à l'échelle proportionnellement.

5voto

FWH Points 2043

Jetez un coup d'oeil à Jcrop. Je l'utilise et il est très bon.

http://deepliquid.com/content/Jcrop.html

5voto

Miehz Points 31
$(function() {
  $('.mhz-news-img img').each(function() {
    var maxWidth = 320; // Max width for the image
    var maxHeight = 200;    // Max height for the image
    var maxratio=maxHeight/maxWidth;
    var width = $(this).width();    // Current image width
    var height = $(this).height();  // Current image height
    var curentratio=height/width;
    // Check if the current width is larger than the max

    if(curentratio>maxratio)
    {
        ratio = maxWidth / width;   // get ratio for scaling image
        $(this).css("width", maxWidth); // Set new width
        $(this).css("height", height *ratio); // Scale height based on ratio
    }
    else
    { 
        ratio = maxHeight / height; // get ratio for scaling image
        $(this).css("height", maxHeight);   // Set new height
        $(this).css("width", width * ratio);    // Scale width based on ratio
    }
  });
});

0 votes

Une explication aurait été appréciée ici

3 votes

Il y a des commentaires pas besoin d'explication Bonne solution Miehz :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X