28172 sujets

CSS et mise en forme, CSS3

Bonjour.

J’ai un problème avec l’utilisation des variables dans mes fichiers SCSS. Je pense que le problème vient de moi et surtout du fait que je ne maîtrise pas tout, loin s’en faut, dans la syntaxe SASS. Aussi, si une âme charitable pouvait soit m’aider, soit me dire que ce que j’essaye de faire est impossible, cela pourrait bien m’aider !

Besoin général :
une variable appelée dans une formule de calcul prend des valeurs différentes en fonction de l’endroit où l’on est dans le flux.

_functions.scss

$maVariable: null;

@mixin icoPosition() {
    @if $maVariable {
        background-position: 0 -54px * $maVariable;
    }
    @else {
        background-position: 0 0;
    }
}


_styles.scss

.selecteurSpecial01 {
    $maVariable: 1;
}
.selecteurSpecial02 {
    $maVariable: .5;
}


_icons.scss

.selecteurGeneral {
    @include icoPosition();
}


default.scss

@import '_functions.scss';
@import '_styles.scss';
@import '_icons.scss';

La fonction fonctionne (super !) mais le problème est que c’est la dernière déclaration de $maVariable qui l’emporte partout. Ainsi, partout mon background-position aura la même valeur !

Il y a-t-il une solution pour arriver à mes fins, avec ma méthode corrigée ou une toute autre méthode ?

Si besoin, je peux donner le cas précis qui est un peu plus complexe…
Modifié par Derwoed (02 Dec 2014 - 16:08)
Bonsoir,

Cela me rappelle un sujet dont le problème semblait similaire. Je me souviens qu'on avait conseillé à l'auteur du post de faire un reset de la variable en début de fonction ; justement pour éviter qu'elle garde la dernière valeur acquise.
Merci pour l'idée. Elle semble bonne, mais ne résout malheureusement pas mon problème, tout simplement, parce que j'avais oublié une règle de base des CSS : les déclarations sont statiques et ne peuvent donc être modifiées à la volée ! Donc, si je n'écris pas une règle CSS par cas, je me retrouve au final avec une seule règle CSS et évidemment cela ne fonctionne pas. Quel benêt ! Smiley confused

Au début, cela fonctionnait parce que je n'avais besoin que de deux règles (une pour tablettes et une pour smartphones) et que je les avais bien grâce à ma structure avec les media queries. Maintenant que j'ai besoin de plusieurs règles pour un même device, cela ne marche plus. Je vais donc revoir ça en profondeur. Si j'arrive à trouver quelque chose de concluant, je reviendrai le poster ici.
Salut,

Et si tu passais ta variable en paramètre de ton mixin ? Comme suit :

// Un mixin permet de passer des paramètres, dont on peut définir la valeur par défaut s'ils sont omis
@mixin icoPosition($maVariable: null) {
  @if $maVariable {
    background-position: 0 -54px * $maVariable;
  }
  @else {
    background-position: 0 0;
  }
}

// Exemples d'utilisation d'un mixin à paramètres définis par défaut et susceptibles d'être omis
.selecteurSpecial01 {
  @include icoPosition(1); // Génère background-position: 0 -54px
}
.selecteurSpecial02 {
  @include icoPosition(.5); // Génère background-position: 0 -27px
}
.selecteurGeneral {
  @include icoPosition(); // Génère background-position: 0 0
}

Soit dit en passant, si tu as un doute sur ton code SCSS, SassMeister est ton ami.
Grace à vous et à vos pistes qui m’ont aidé à l’architecturer, j’arrive au bout de ma fonction. Quand elle sera complètement finalisée et que j’en aurai le temps je reviendrai sur ce forum avec un nouveau fil pour la présenter, à la fois pour la partager et pour l’améliorer si des personnes ont de meilleures idées…

Merci.

PS : le but de cette fonction est de gérer les sprites SVG en les affichant à des tailles différentes à la fois sur la même page et en fonction de l’appareil cible (tablettes, smartphone).