這篇文章提供利用 Konva.js 實現 Spotlight 效果之範例。
Konva.js 部分之程式碼 :
底圖 + 80%填充摭黑 + Cutout Spotlight
...
<div id="stage-parent" style="width: 50%;">
<div id="scene_container">
</div>
</div>
...
<script>
var stage = new Konva.Stage({
container: 'scene_container',
width: 800,
height: 600
})
var stage_scale =1
var fitStageIntoParentContainer =function() {
var container = document.querySelector('#stage-parent')
// now we need to fit stage into parent
var containerWidth = container.offsetWidth
// to do this we need to scale the stage
stage_scale = containerWidth / 800
stage.width(800 * stage_scale)
stage.height(600 * stage_scale)
stage.scale({ x: stage_scale, y: stage_scale })
stage.draw()
}
window.addEventListener('resize', fitStageIntoParentContainer)
fitStageIntoParentContainer()
//
// background layer
//
var layer = new Konva.Layer()
stage.add(layer)
var bgImg = new Konva.Image({
width: 800,
height: 600
})
layer.add(bgImg)
var bgImgObj = new Image()
bgImgObj.onload = function() {
bgImg.image(bgImgObj)
layer.draw()
}
bgImgObj.src='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJG-1Bt_pth4w6CLtGXS5W6SY8vGtrQ6Jk3VOo4dY6NinzpcW4XAQpZi2VQFm-IQs3FwGC7IptmNtFraJHEH8Zj4SQQxJ_TXo054m7WLxfgOO8dS_iuvwXyqxdp15M5anhSxwv08m8j-Cg/s1600/DSC06624m.jpg'
//
// mask layer
//
var layer_mask =new Konva.Layer()
stage.add(layer_mask)
var opacity_rect = new Konva.Rect({
x: 0,
y: 0,
width: 800,
height: 600,
fill: 'black',
draggable: false,
opacity: 0.8
})
layer_mask.add(opacity_rect)
var transparent_circle = new Konva.Circle({
x: 400,
y: 300,
radius: 200,
fill: 'black',
draggable: true,
globalCompositeOperation: 'destination-out'
})
layer_mask.add(transparent_circle)
layer_mask.draw()
</script>
Konva.js 執行結果 Demo (Spotlight 可拖曳) :


