SCSS如何将字符串转换为数字值

发布于 2025-01-30 00:08:18 字数 503 浏览 3 评论 0原文

我想使用以下功能使用字体大小的信息执行数学操作。我使用SASS Build-In String函数删除rem $ font-size的单元信息,但是我无法执行数学操作,因为值类型是字符串。

有没有办法将字符串值类型转换为SASS中的数字值类型?

@use "../abstracts/variables" as *;
@use "sass:math";

@function em($value, $font-size) {
   
  $length: str-length(#{$font-size}); //sample-think about it font-size 1.125rem

  $trim: ($length - 3);

  $data: str-slice(#{$font-size}, 1, $trim);

  $result: math.div($value, $data);

  @return $result + "em";
}

I want to perform mathematical operations using the font-size information with the function below. I remove the rem unit information of $font-size using the sass build-in string functions, but then I cannot perform mathematical operations because the value type is string.

Is there a way to convert a string value type to numeric value type in sass?

@use "../abstracts/variables" as *;
@use "sass:math";

@function em($value, $font-size) {
   
  $length: str-length(#{$font-size}); //sample-think about it font-size 1.125rem

  $trim: ($length - 3);

  $data: str-slice(#{$font-size}, 1, $trim);

  $result: math.div($value, $data);

  @return $result + "em";
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

╄→承喏 2025-02-06 00:08:18

最好使用助手函数删除$ font-size的单位,例如

@function stripUnit($number) {
    @if meta.type-of($number) == "number" and not math.is-unitless($number) {
      @return math.div($number, $number * 0 + 1);
    }
 
    @return $number;
}

@function em($value, $font-size) {
  $data: strip-unit($font-size);
  $result: math.div($value, $data);

  @return $result + "em";
}

It would probably be better to use a helper function to remove the unit of $font-size such as this one.

@function stripUnit($number) {
    @if meta.type-of($number) == "number" and not math.is-unitless($number) {
      @return math.div($number, $number * 0 + 1);
    }
 
    @return $number;
}

@function em($value, $font-size) {
  $data: strip-unit($font-size);
  $result: math.div($value, $data);

  @return $result + "em";
}
暗恋未遂 2025-02-06 00:08:18

但是,如果您尝试使用 stripunit 功能时会遇到问题,则在这样

But if you will have an issue when you are trying to use stripUnit function, like this

???? Build failed.

@parcel/transformer-sass: Undefined operation "2.625rem * 16px".
   ╷
93 │                 func.strip-unit($-fs-max) * 
conf.$font-size-root,
   │                 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   ╵
  src/styles/hero.scss 93:5   @use
  src/styles/index.scss 11:1  root stylesheet

  Error: Undefined operation "2.625rem * 16px".
     ╷
  93 │                 func.strip-unit($-fs-max) * 
  conf.$font-size-root,
     │                 
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     ╵
    src/styles/hero.scss 93:5   @use
    src/styles/index.scss 11:1  root stylesheet
      at Object.wrapException 
  (/Users/andrew/Sites/UspioLTD/node_modules/sass/sass.dart.js:1269:17)
      at Object.throwWithTrace0 
  (/Users/andrew/Sites/UspioLTD/node_modules/sass/sass.dart.js:24245:15)
      at 
  /Users/andrew/Sites/UspioLTD/node_modules/sass/sass.dart.js:76529:19
      at _wrapJsFunctionForAsync_closure.$protected 
  (/Users/andrew/Sites/UspioLTD/node_modules/sass/sass.dart.js:3939:15)
      at _wrapJsFunctionForAsync_closure.call$2 
  (/Users/andrew/Sites/UspioLTD/node_modules/sass/sass.dart.js:29731:12)
      at _awaitOnObject_closure0.call$2 
  (/Users/andrew/Sites/UspioLTD/node_modules/sass/sass.dart.js:29725:25)
      at Object._rootRunBinary 
  (/Users/andrew/Sites/UspioLTD/node_modules/sass/sass.dart.js:4327:18)
      at StaticClosure.<anonymous> 
  (/Users/andrew/Sites/UspioLTD/node_modules/sass/sass.dart.js:103109:16)
      at _CustomZone.runBinary$3$3 
  (/Users/andrew/Sites/UspioLTD/node_modules/sass/sass.dart.js:31132:39)
      at _FutureListener.handleError$1 
  (/Users/andrew/Sites/UspioLTD/node_modules/sass/sass.dart.js:29911:21)

In a code like:

$m: 768px;
$xl: 1202px;
$font-size-root: 16px;

@media (min-width: conf.$m) and (max-width: #{conf.$xl - 1}) {
    $-fs-min: 2rem;
    $-fs-max: math.div(42, 16) + rem;

    font-size: func.fluid(
        func.stripUnit($-fs-min) * conf.$font-size-root,
        func.stripUnit($-fs-max) * conf.$font-size-root,
        conf.$m,
        conf.$xl
    );
}

Just add a nuber unit 0 or 1 to your rem, em, px, and etc..., like this: + 0rem, * 1rem.

$m: 768px;
$xl: 1202px;
$font-size-root: 16px;

@media (min-width: conf.$m) and (max-width: #{conf.$xl - 1}) {
    $-fs-min: 2rem;
    $-fs-max: math.div(42, 16) + 0rem;

    font-size: func.fluid(
        func.stripUnit($-fs-min) * conf.$font-size-root,
        func.stripUnit($-fs-max) * conf.$font-size-root,
        conf.$m,
        conf.$xl
    );
}

Now the build is fine!

✨ Built in 2.78s
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文