2
votes

SASS: Unités incompatibles: 'vw' et 'px'

Comment résoudre le problème des unités incompatibles?

Incompatible units: 'vw' and 'px'.
node_modules\@ionic\app-scripts\dist\util\helpers.js:253.replace(/&/g, '&')

L'entrée est:

@include square-size(10vw, 40px, 70px);

Problème:

@mixin square-size($size, $min: $size, $max: $size) {
  $clamp-size: min(max($size, $min), $max);
  width: $clamp-size;
  height: $clamp-size;
}

Mais si j'utilise calc (1vw - 1px) cela fonctionne. (pas de problème d'unité). par exemple. max (calc (1vw - 1px)) ne fonctionne pas. Parce que pas de nombre pour max .

Dans mon cas, je veux qu'un mixin carré la taille d'un élément. Y compris la pince. min-width , max-width , etc. ne fonctionnent pas. Ce sera un rect ou une ellipse. Parce qu'il ne garde pas le rapport hauteur / largeur. Je veux un élément avec une taille dynamique mais avec une taille min et max .

Je comprends que l'unité dynamique vw (Viewport) doit être présent après la compilation sass. Par conséquent, il n'est pas possible de convertir la valeur en une unité fixe. Mais n'y a-t-il aucun moyen?


1 commentaires

Puisque Sass est compilé sur le serveur, pas dans le navigateur - les unités vw (et autres unités relatives) ne peuvent pas être converties en quelque chose, vous pouvez faire des calculs avec. calc () est calculé par le navigateur, pas par Sass. Pour cette raison, vous devez soit obtenir des valeurs absolues pour effectuer des calculs avec Sass, soit convertir vos équations en expressions calc () à calculer dans le navigateur.


5 Réponses :


1
votes

Vous pouvez le faire comme ceci en utilisant min-width / height et max-width / height pour éviter de mélanger les unités:

@mixin square-size($size, $min: $size, $max: $size) {
  min-width: $min;
  max-width: $max;    
  min-height: $min;
  max-height: $max;    
  width: $size;
  height: $size;
}
.class {
    @include square-size(10vw, 40px, 70px);
} 


2 commentaires

Merci d'avoir répondu. Mais c'est exactement ma mise en œuvre actuelle. Mais comme je l'ai écrit ci-dessus, il en résultera un rect ou une ellipse dans certains cas. Parce que min-width et min-height et max-width et max-height ne conservent pas les proportions . Je suis désolé si ces informations ne sont pas claires dans la description ci-dessus. Merci quand même. :)


Avez-vous essayé de l'exécuter? Il produira toujours des carrés - essayez de lui donner un second regard :) Voici un exemple de stylo: codepen. io / jakob-e / pen / REBzKw



5
votes

Vous devrez contourner le compilateur scss et utiliser un littéral à la place.

@mixin square-size($size, $min: $size, $max: $size) {
  $clamp-size: #{'min(max(#{$size}, #{$min}), #{$max})'};
  width: $clamp-size;
  height: $clamp-size;
}


1 commentaires

C'est la bonne solution, mais je l'ai négligée la première fois, car je ne pouvais pas voir où les changements pertinents.



0
votes

Pour cela, au lieu de SCSS @include

.foo {
    width:clamp(10vw, 40px, 70px);
    height:clamp(10vw, 40px, 70px);
}

utilisez une meilleure fonction css "clamp":

.foo {
  @include square-size(10vw, 40px, 70px);
}


5 commentaires

Le problème est que si vous avez utilisé SCSS pour un projet entier, SCSS ne compilera pas clamp (), min () ou max () en raison de l'erreur ci-dessus.


C'est du pur CSS. Cela fonctionne très bien. SCSS ne lance pas d'erreur. En vain me mettre un moins.


Ce que vous avez écrit est purement css, mais OP pose des questions sur SCSS - votre code devrait être en ligne ou en tant que fichier .css séparé


J'utilise ce code CSS dans mon SCSS et cela fonctionne très bien, pas de problème avec le compilateur. Une personne pense qu'il existe une solution en SCSS, mais une solution de surface en CSS - c'est plus facile, meilleur, plus élégant!


Mon scss lance une erreur, car CLAMP est une fonction scss qui demande moins / plus d'options que les 3 en css - Si vous exécutez l'ancien scss, il existe de nombreuses fonctions qui ne sont plus pertinentes pour le css moderne, mais échouent car elles les interpréter comme des fonctions. La mise à jour de SCSS peut parfois être une rupture de projet, donc la fonction unquote () est un moyen d'envelopper la pince css dans scss sans avoir à faire face au diable. :)



3
votes

J'ai pu corriger l'erreur dans React SASS en utilisant la fonction calc.

font-size: calc(max(8vw, 30px));


0 commentaires

5
votes

Si vous ne pouvez pas le contourner d'une autre manière, SCSS a une fonction pour ignorer les choses entre guillemets:

width: max(50px, 5rem);

Cela sera compilé sans les guillemets et sera valide CSS.

width: unquote("max(50px, 5rem)");

Ce sera étrange d'avoir ceci dans votre scss, mais c'est un moyen infaillible de permettre au CSS moderne de ne pas interrompre vos fonctions scss

p >


0 commentaires