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

如何为Div创建基于三色radial gradient的动态移动背景?

三色动态径向渐变背景实现方案(支持拖拽中心点+随机混色)

核心实现思路

纯CSS无法实现拖拽交互和随机颜色动态更新,所以采用CSS径向渐变 + JavaScript的组合方案:

  • 用radial-gradient作为背景基础,通过JS动态修改渐变的中心坐标、颜色参数
  • 监听鼠标拖拽事件,实时更新渐变中心点
  • 定时生成随机三色组合,实现颜色混合的动态效果

完整代码实现

HTML结构

<div class="gradient-container">
  <div class="drag-handle"></div>
</div>

CSS样式

.gradient-container {
  width: 100vw;
  height: 100vh;
  position: relative;
  /* 初始渐变样式,后续由JS动态修改 */
  background: radial-gradient(circle at 50% 50%, #ff6b6b, #4ecdc4, #45b7d1);
  transition: background 0.3s ease; /* 颜色/位置变化时的平滑过渡 */
  overflow: hidden;
}

.drag-handle {
  width: 20px;
  height: 20px;
  border-radius: 50%;
  background: rgba(255,255,255,0.8);
  border: 2px solid #333;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  cursor: grab;
  user-select: none;
}

.drag-handle:active {
  cursor: grabbing;
}

JavaScript逻辑

const container = document.querySelector('.gradient-container');
const handle = document.querySelector('.drag-handle');

// 初始化中心点坐标(百分比)
let centerX = 50;
let centerY = 50;

// 生成随机RGB颜色的函数
function getRandomColor() {
  const r = Math.floor(Math.random() * 256);
  const g = Math.floor(Math.random() * 256);
  const b = Math.floor(Math.random() * 256);
  return `rgb(${r}, ${g}, ${b})`;
}

// 更新背景渐变的函数
function updateGradient() {
  const color1 = getRandomColor();
  const color2 = getRandomColor();
  const color3 = getRandomColor();
  container.style.background = `radial-gradient(circle at ${centerX}% ${centerY}%, ${color1}, ${color2}, ${color3})`;
}

// 拖拽功能实现
let isDragging = false;

handle.addEventListener('mousedown', (e) => {
  isDragging = true;
  // 阻止默认行为防止选中文字或滚动
  e.preventDefault();
});

document.addEventListener('mousemove', (e) => {
  if (!isDragging) return;
  
  // 计算鼠标在容器内的百分比坐标
  const rect = container.getBoundingClientRect();
  centerX = ((e.clientX - rect.left) / rect.width) * 100;
  centerY = ((e.clientY - rect.top) / rect.height) * 100;
  
  // 更新拖拽手柄位置
  handle.style.left = `${centerX}%`;
  handle.style.top = `${centerY}%`;
  
  // 实时更新渐变
  updateGradient();
});

document.addEventListener('mouseup', () => {
  isDragging = false;
});

// 定时自动更新颜色(可选,不需要可以注释)
setInterval(updateGradient, 3000);

// 初始化渐变
updateGradient();

关键细节说明

  • 拖拽交互:通过监听鼠标的按下、移动、松开事件,计算鼠标在容器内的百分比位置,同步更新渐变中心和拖拽手柄的位置
  • 随机颜色:getRandomColor函数生成随机RGB值,每次更新渐变时都会生成一组新的三色组合,实现混合效果
  • 平滑过渡:CSS的transition: background 0.3s ease让颜色和位置的变化更自然,避免生硬跳转
  • 坐标计算:使用百分比而非固定像素,确保在不同屏幕尺寸下都能正常工作

如果需要更细腻的颜色混合(比如基于HSL的色调渐变),可以修改getRandomColor函数为HSL模式:

function getRandomColor() {
  const hue = Math.floor(Math.random() * 360);
  const saturation = Math.floor(Math.random() * 60) + 40; // 40-100%饱和度
  const lightness = Math.floor(Math.random() * 40) + 30; // 30-70%亮度
  return `hsl(${hue}, ${saturation}%, ${lightness}%)`;
}

内容的提问来源于stack exchange,提问作者TCB13

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 15:42:51