sass画图

阅读 1

1天前

《像素之外:用Sass编织数字织锦》

凌晨两点的屏幕泛着幽蓝,我盯着设计稿里那幅流动的抽象画——渐变色块如潮汐漫过网格,菱形与三角在交点处生长出细刺,最边缘的线条像被风揉皱的绸带,带着若有若无的毛边。传统CSS的border-radiuslinear-gradient在复杂构图前显得力不从心,直到我想起抽屉里那把“代码刻刀”:Sass。

一、变量:调色盘里的星轨

我打开_variables.scss,这里早已不是简单的颜色变量仓库。顶部是全局的$color-palette,用map存储着从潘通年度色到自定义莫兰迪的12个色阶,每个色值都标注了明度与使用场景;往下是$grid-system,记录着基础网格的$base-unit: 8px,以及由它衍生的$gutter: $base-unit * 3$section-margin: $gutter * 4——这些数值像基因链般串联起整个画面的骨骼。

最妙的是$gradient-stops,我用@each循环生成了12组渐变节点:

$gradient-stops: ();
@for $i from 1 through 12 {
  $hue: 360 / 12 * ($i - 1); // 色相从0°到330°均匀分布
  $lightness: 50% + sin($i * 0.5) * 10%; // 正弦函数制造明暗波动
  $gradient-stops: append($gradient-stops, hsl($hue, 70%, $lightness), comma);
}

运行编译后,这串代码会展开成12个渐变停点,像被数学公式精确编排的彩虹碎片,为后续的色块填充埋下动态的伏笔。

二、混合器:形状的炼金术

画面的主体是一组交错的菱形网格。如果用纯CSS,每个菱形需要单独计算transform: rotate(45deg)overflow: hidden,还要处理边距重叠的问题。但在Sass里,我写了一个@mixin diamond($size, $color),用@content包裹内部内容,配合@include的参数传递,让菱形的生成变得像搭积木:

@mixin diamond($size: 40px, $color: #fff) {
  width: $size;
  height: $size;
  background: $color;
  transform: rotate(45deg);
  position: relative;
  overflow: hidden;
  &::before {
    content: '';
    position: absolute;
    top: -$size/2;
    left: -$size/2;
    width: $size*2;
    height: $size*2;
    background: linear-gradient(45deg, $gradient-stops);
    opacity: 0.8;
  }
}

// 使用时只需调用
.grid-item {
  @include diamond(80px, $color-palette('primary'));
  margin: $gutter;
}

更巧妙的是,我给混合器添加了@if条件判断:当$size小于30px时,自动调整$gradient-stops的色阶间隔,让小菱形的渐变更锐利;大于60px时,则增加box-shadow: 0 2px 8px rgba(0,0,0,0.1),模拟光线在厚玻璃上的折射效果。这种“会思考的样式”,让每个菱形都拥有了呼吸感。

三、循环与函数:生长的图案

画面的背景是动态生成的网格,要求每行的列数随屏幕宽度变化,且每个格子的边框粗细与位置相关。这时候,Sass的@for循环和数学函数派上了大用场。

首先用@function calculate-columns($screen-width)根据视口宽度计算列数:

@function calculate-columns($screen-width) {
  @return floor($screen-width / ($base-unit * 6)); // 每列占6个基础单位
}

然后在@media查询中嵌套@for循环生成网格:

.container {
  display: grid;
  gap: $gutter;
  
  @media (min-width: 1200px) {
    @for $col from 1 through calculate-columns(1200px) {
      .grid-#{$col} {
        grid-template-columns: repeat($col, 1fr);
        // 边框粗细随列数增加而递减
        border-width: 1px / $col;
      }
    }
  }
}

编译后的CSS会自动生成.grid-12.grid-20的类(假设1200px下最多20列),每个类的border-width从0.083px到0.05px渐变——这种“看不见的计算”,让网格在不同屏幕下都保持着微妙的平衡感。

四、动画:时间的诗

最让我惊喜的是用Sass控制动画的能力。画面中漂浮的小三角需要有随机的位移和旋转,但纯CSS的@keyframes需要为每个元素单独定义,维护成本极高。于是我用@mixin animate-triangle($delay, $duration)生成动画参数,配合@each循环为每个三角设置不同的延迟和时长:

$triangles: 8; // 共8个三角
@each $i from 1 through $triangles {
  .triangle-#{$i} {
    @include animate-triangle(
      $delay: ($i * 0.2s), // 延迟依次递增0.2秒
      $duration: (2s + random(1s)) // 时长在2-3秒间随机
    );
  }
}

@mixin animate-triangle($delay, $duration) {
  animation: float $duration infinite ease-in-out $delay;
  
  @keyframes float {
    0%, 100% {
      transform: translate(0, 0) rotate(0deg);
    }
    50% {
      transform: translate(random(20px) - 10px, random(15px) - 7.5px) rotate(random(30deg) - 15deg);
    }
  }
}

这里的关键是利用Sass的random()函数在编译时生成随机数——虽然最终CSS是静态的,但每个三角的动画参数都是独一无二的,就像被代码“随机”撒落的星子,在页面上跳着各自的生命之舞。

尾声:代码是另一种画笔

天快亮时,我按下编译键。浏览器里,渐变菱形随着鼠标移动微微旋转,网格线在视口边缘淡入淡出,小三角们正沿着各自的轨迹漂浮——这不是传统意义上的“图片”,而是由137行Sass代码编织的数字生命。

有人说Sass只是CSS的预处理器,但在我看来,它更像一支“元画笔”:变量是颜料管的编号,混合器是调色盘上的手法,循环是画笔的自动抖动,函数则是控制笔触力度的神经。当代码不再是冰冷的规则,而成为表达创意的媒介,我们便在像素之外,开辟了一片新的画布。

晨光透过百叶窗洒在屏幕上,那些由Sass生成的几何图形泛着暖金色的光晕。我关掉编辑器,突然明白:最好的设计工具,从来不是软件本身,而是让我们更接近“想要表达”的那把钥匙——无论是画笔、代码,还是此刻跳动的心跳。

精彩评论(0)

0 0 举报