You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在CSS中创建细腻复杂的蛋壳质感渐变?

创建细腻复杂渐变的最佳方案

输入图片描述

请问创建图中这类细腻复杂渐变的最佳方案是什么?我尝试查看该元素的CSS,但它可能是通过Canvas JavaScript设置的。
我不确定这是线性渐变,还是由多层不同透明度的渐变叠加而成。
看起来左上角有一块靛蓝色区域,左下角有一块桃色区域。

我的尝试代码

body{
    background: rgb(229,232,236);
background: linear-gradient(90deg, rgba(229,232,236,1) 0%, rgba(229,232,236,1) 35%, rgba(231,217,219,1) 74%, rgba(231,221,224,1) 100%);
}

.container{
  height: 100vh;
  width:100%;
}
<div class="container">

</div>

参考示例代码

JSX代码

'use client';

import gsap from 'gsap';
import { useLayoutEffect, useRef } from 'react';

import { Section } from '~/components/ui';
import { cx } from '~/utils';

import styles from './ExoIrisGradientTransition.module.scss';

export const ExoIrisGradientTransition = () => {
  const containerRef = useRef(null);

  useLayoutEffect(() => {
    const ctx = gsap.context(() => {
      if (!containerRef.current) return;
      gsap.to('.js__solid', {
        opacity: 1,
        scrollTrigger: {
          trigger: '.js__gradientContainer',
          start: '80% bottom',
          end: 'bottom bottom',
          // markers: true,
          scrub: true,
        },
      });
    }, containerRef);

    return () => {
      ctx.revert();
    };
  }, []);

  return (
    <Section className={styles.container} ref={containerRef}>
      <div className={cx(styles.gradientContainer, 'js__gradientContainer')}>
        <div className={cx(styles.gradient, 'js__gradient')} aria-hidden />
        <div className={cx(styles.solid, 'js__solid')} aria-hidden />
      </div>
    </Section>
  );
};

CSS代码

.container {
  position: relative;
  display: flex;
  background: transparent;
  flex-flow: column nowrap;
  z-index: 5;
}

.gradientContainer {
  --container-height: 160vh;
  height: var(--container-height);
  position: relative;
  width: 100%;

  @include landscape {
    --container-height: 200vh;
  }
}

.gradient {
  width: 100%;
  height: var(--container-height);
  background: linear-gradient(
    180deg,
    rgba(236, 194, 111, 0.5) 0%,
    rgba(110, 153, 234, 1) 65%,
    rgba(8, 11, 27, 1) 100%
  );

  @include landscape {
    background: linear-gradient(
      140deg,
      rgba(255, 255, 255, 1) 0%,
      rgba(236, 194, 111, 1) 33%,
      rgba(110, 153, 234, 1) 66%,
      rgba(8, 11, 27, 1) 100%
    );
  }
}

.solid {
  position: absolute;
  top: 0;
  z-index: 2;
  width: 100%;
  height: var(--container-height);
  background: $color-dark-dark-blue;
  opacity: 0;
}

最佳实现方案

针对图中这类细腻渐变,推荐以下几种方案,按实现成本和效果排序:

1. 多层CSS渐变叠加(最易实现)

不需要JS/Canvas,通过叠加多个线性/径向渐变,配合不同透明度和角度,就能模拟出复杂的色彩过渡效果。核心是利用不同角度、不同透明度的渐变层叠加,混合出自然细腻的色彩过渡,完全通过CSS实现,性能优异:

.container {
  background: 
    linear-gradient(135deg, rgba(75, 0, 130, 0.3) 0%, transparent 50%),
    linear-gradient(45deg, rgba(255, 192, 203, 0.4) 0%, transparent 60%),
    linear-gradient(to right, #e5e8ec, #e7d9db);
}

2. CSS径向渐变+线性渐变组合

如果图中的色彩分布是边角聚集的(比如你提到的左上角靛蓝、左下角桃色),用径向渐变定位配合线性渐变能更好地模拟:

.container {
  background: 
    radial-gradient(circle at top left, rgba(75, 0, 130, 0.4) 0%, transparent 40%),
    radial-gradient(circle at bottom left, rgba(255, 192, 203, 0.3) 0%, transparent 50%),
    linear-gradient(to right, #e5e8ec 0%, #e7d9db 100%);
}

3. Canvas绘制(极致自定义)

如果需要动态变化或更复杂的色彩算法,才需要用到Canvas。核心思路是通过createLinearGradient/createRadialGradient创建渐变,或者直接用像素级操作生成渐变,但实现成本较高,适合需要交互或动态效果的场景。

4. 滚动交互渐变过渡技巧

你提供的参考示例中,通过叠加一个纯色层,结合动画工具改变透明度,实现渐变到纯色的过渡效果。如果你的需求包含滚动交互,可以借鉴这个思路,但基础的复杂渐变本身还是通过多层CSS渐变实现。

内容的提问来源于stack exchange,提问作者The Old County

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 21:54:52