【问题标题】:Make canvas transparent使画布透明
【发布时间】:2017-04-12 08:27:13
【问题描述】:

我的身体是这样的:

body
{
    background-image:url('../images/bg.png');
    background-repeat:no-repeat;
    background-size:fixed 100vw;
    background-position:center;
}

问题是,画布是白色的而不是透明的。有没有办法让它透明,这样我就可以将 dna 波放在背景上?

Codepen example

【问题讨论】:

标签: javascript html css html5-canvas


【解决方案1】:

默认情况下,画布是透明的。

尝试设置页面背景图像,然后在其上放置画布。如果没有在画布上绘制任何内容,则可以完全看到页面背景。

你应该试试

context.clearRect(0,0,width,height);

更多可以参考How do I make a transparent canvas in html5?

【讨论】:

  • context.fillStyle = 'hsla(0, 0%, 100%, 0.2)';不透明度部分使画布变白,我的问题是如何在使其透明的同时保持效果
  • @kjanko,您需要它透明的原因是什么?
  • @Ionut 我想在背景图片上保留波浪效果
  • 那你为什么不用drawImage()把图片作为背景呢?
【解决方案2】:

一种简单的方法是使用屏幕外画布。

首先将其上下文的 globalAlpha 值设置为介于 0 和 1 之间的某个值,这将决定您之前的绘图消失的速度。

然后,在动画循环中,在进行新绘图之前,

  • 清除屏幕外上下文,
  • 在屏幕外绘制可见的画布,
  • 清除可见的画布
  • 在可见的屏幕上拉回屏幕外的一个

在此过程中,您的图像将失去不透明度。

var clear = function(){
 // clear the clone canvas  
 cloneCtx.clearRect(0,0,canvasWidth, canvasHeight)
 // this should be needed at init and when canvas is resized but for demo I leave it here
 cloneCtx.globalAlpha = '.8';
 // draw ou visible canvas, a bit less opaque
 cloneCtx.drawImage(context.canvas, 0,0)
 // clear the visible canvas
 context.clearRect(0,0,canvasWidth, canvasHeight)
 // draw back our saved less-opaque image
 context.drawImage(clone, 0,0)
}

var canvas = document.getElementById('canvas'),
    context = canvas.getContext('2d'),
    // create an offscreen clone
    clone = canvas.cloneNode(),    
    cloneCtx = clone.getContext('2d'),
    
    canvasWidth = canvas.width =
    clone.width =window.innerWidth,
    canvasHeight = canvas.height = clone.height = window.innerHeight,
    globalTick = 0,
    points = [],
    pointCount = 12,
    pointSpeed = 6,
    spacing = canvasWidth / pointCount,
    pointCount = pointCount + 2,    
    verticalPointRange = 60,
    randomRange = function(min, max){
        return Math.floor( (Math.random() * (max - min + 1) ) + min);
    },
    iPath,
    iPoints;  

var Point = function(x, y, alt){
  this.x = x;  
  this.y = y;
  this.yStart = y;
  this.alt = alt;  
}
    
Point.prototype.update = function(i){
  var range = (this.alt) ? verticalPointRange : -verticalPointRange;
  this.x += pointSpeed;
  this.y = (this.yStart) + Math.sin(globalTick/14) * -range;
  
  if(this.x > (canvasWidth + spacing)){
    this.x = -spacing;
    var moved = points.splice(i, 1);
    points.unshift(moved[0]);
  }
}
     
var updatePoints = function(){
  var i = points.length;
  while(i--){
    points[i].update(i);         
  }
}
              
for(iPoints = 0; iPoints < pointCount; iPoints++){
  var alt = (iPoints % 2 === 0);
  var offset = (alt) ? verticalPointRange : -verticalPointRange;
  points.push(new Point(spacing * (iPoints-1), canvasHeight/2, alt));  
}

var renderPath = function(){
  context.beginPath();
  context.moveTo(points[0].x, points[0].y);
  for(iPath = 1; iPath < pointCount; iPath++){
    context.lineTo(points[iPath].x, points[iPath].y);
  }
  context.stroke();  
}
                    
var loop = function(){
  requestAnimationFrame(loop, canvas);
  clear();
  updatePoints();
  renderPath();
  globalTick++;
};

loop();
canvas { display: block; }
body{
  background-color: ivory;
}
&lt;canvas id="canvas"&gt;&lt;/canvas&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-13
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    • 2017-08-09
    • 1970-01-01
    • 2022-01-26
    相关资源
    最近更新 更多