css - SCSS 过渡属性覆盖

标签 css sass css-transitions mixins

我使用@mixin 为元素添加不同的过渡属性。假设我的 .scss 中有这个:

@mixin transition($prop, $sec){
  -webkit-transition: $prop $sec;
  -moz-transition: $prop $sec;
  -ms-transition: $prop $sec;
  -o-transition: $prop $sec;
  transition: $prop $sec;
}

然后我调用:

.sample{
  @include transition(background-color, 0.2s);
  @include transition(margin, 0.3s)
}

.sample 只有边距过渡,但我还想要背景颜色过渡:有没有简单的方法让它工作?

重要的是我有不同的电话

最佳答案

SASS 无法连接属性,我不知道是否存在 CSS 外部工具来完成此任务。 Sass 的创建是为了提高 CSS 功能,而不是让程序员养成不良的编程习惯。当您可以将它们全部保存在一个语句中时,我真的不知道创建多个 CSS 声明语句的目的。将所有转换保存在一个语句中可以显着改善您的结构、工作流程和 Sass 代码的性能。

好吧,就是说了,正如您之前提到的“让可怕的事情发生吧”。

这里有两种不同的 mixin,一种用于简写转换声明,另一种用于长形式,它们在处理甚至加载时间上的差异可以忽略不计,唯一明显的区别在于代码的风格。

长格式混合

@mixin transition($properties, $durations, $timing-function: null, $delay: null) {
  $declarations: (property, $properties),
                 (duration, $durations),
                 (timing-function, $timing-function),
                 (delay, $delay);
  
  @each $declaration in $declarations {
    @if nth($declaration, 2) {
      $output: ();
        @each $val in nth($declaration, 2) {
          $output: append($output, $val, comma);
        }
      @each $prefix in '-webkit-', '-moz-', '-ms-', '-o-', '' {
        #{$prefix}transition-#{nth($declaration, 1)}: $output;
      }
    }
  } 
}

它类似于@LeBen mixin,但您可以使用 include 和不带引号的逗号分隔参数:

@include transition(background-color margin, 0.2s 0.3s);

简写形式

@mixin transition($declarations...) {
  @each $prefix in '-webkit-', '-moz-', '-ms-', '-o-', '' {
    #{$prefix}transition: $declarations;
  }
}

这是在您的代码中实现它的方法

@include transition(background-color 0.2s, margin 0.3s);

现在,要解决“不同调用”的问题,我认为处理它们的唯一方法是使用 append()列表功能。

让我们来看例子。我将使用速记混合形式,因为它更容易实现。

假设您有四个页面,三个部分(_variables.scss_page1.scss_page2.scss_page3 .scss) 和一个导入另一个的 style.scss 文件:

_VARIABLES.SCSS

// Here comes the variable declaration
$transition-list: color 1s;

_PAGE1.SCSS

// Using append($list, $val, $separator:auto) list function
// we can add some items to $transition-list
$transition-list: append($transition-list, margin 2s, comma);

_PAGE2.SCSS

// You can add also the output of a function
@function example(){
  @return unquote("background-color 1s")
}

$transition-list: append($transition-list, example(), comma);

STYLE.SCSS

// You can add new values into the same page
$transition-list: append($transition-list, padding 4s, comma);

$transition-list: append($transition-list, border 10s, comma);

// And finally you only need to use the include to generate the final transition
example {
  @include transition($transition-list);
}

正如我之前所说,我不推荐使用这种方法,这不是一个好的做法。

关于css - SCSS 过渡属性覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23202250/

相关文章:

jquery - CSS3 与 jQuery 的转换只能在暂停后工作?

html - 问题关闭响应式菜单

sass - 在PHPStorm中使用SASS解决 Assets 位置问题

css - 包含 bootstrap.css.map 的正确方法?

sass - 创建源映射时 Gulp 错误 ("CssSyntaxError")

javascript - 创建 HTML 元素并在创建后添加动画

html - 如何在本地环境中通过 CSS 显示图像?

html - Div Gallery - 尝试将 div 显示与 "left"对齐,并允许响应高度

javascript - 文本框仅允许数字和逗号

html - 当多个运行时,是否可以检测到最后一个 CSS 转换的结束?