Да, вы можете легко добиться этого с помощью canvas, используя compositing и цикл рендеринга:
var vid = document.createElement('video');
vid.onerror = function() {
vid.onerror = null;
vid.src = "http://thenewcode.com/assets/videos/ocean-small.mp4";
};
vid.src = "https://s3-us-west-2.amazonaws.com/s.cdpn.io/4273/ocean-small.webm"
vid.muted = true;
vid.onloadedmetadata = initCanvas;
vid.loop = true;
vid.play();
function initCanvas() {
var canvas = document.createElement('canvas');
var vWidth = vid.videoWidth;
var vHeight = vid.videoHeight;
var ctx = canvas.getContext('2d');
// we need to handle the resizing of our canvas ourselves...
window.onresize = function() {
canvas.width = window.innerWidth;
canvas.height = (vHeight / vWidth) * canvas.width;
var fontSize = (vWidth / 2 * (window.innerWidth / vWidth)) * 0.35;
ctx.font = '700 ' + fontSize + 'px Impact,sans-serif';
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
};
onresize();
document.body.appendChild(canvas);
draw();
function draw() {
// first draw our video frame
ctx.drawImage(vid, 0,0, canvas.width, canvas.height);
// set the composite mode
ctx.globalCompositeOperation = 'destination-in';
// will remove every pixels that are not where new pixels will come
ctx.fillText('OCEAN', canvas.width / 2, canvas.height / 2);
// reset the normal compositing mode
ctx.globalCompositeOperation = 'source-over';
// do it again at next screen refresh
requestAnimationFrame(draw);
}
}
body {
background: linear-gradient(45deg, white 0%, blue 100%) no-repeat;
}
Но это может быть не лучшим решением с точки зрения производительности и масштабируемости.
Вы должны иметь возможность применить тот же svg <mask>
, который вы использовали для вашего элемента <video>
(с некоторыми изменениями), но кажется, что маски SVG над содержимым HTML по-прежнему широко не поддерживаются (Firefox принимает это, Chrome не поддерживает). «т ...).
Так что лучшим решением может быть использование SVG <clipPath>
, который, кажется, имеет лучшую поддержку браузера, чем CSS mask
.
Обратите внимание, что я на самом деле не знаю поддержки браузером для css clipPath, поэтому вам, возможно, придется вернуться к canvas для некоторых браузеров.