Когда я добавляю в группу круг с непрозрачностью меньше 1, его непрозрачность становится фактически меньше указанного значения. Этого не произойдет, если я не укажу непрозрачность (т.е. непрозрачность = 1). С прямоугольником этого тоже не происходит.
Вот код для воспроизведения этой проблемы:
HTML
<canvas id="stage" width="400" height="300">
JavaScript
var OPACITY = 0.65;
var FILL = '#fff';
var canvas = new fabric.Canvas('stage', {
backgroundColor: '#222'
});
/**
* Rectangles
* both appear to have the same color
*/
var rect1 = new fabric.Rect({
width: 40,
height: 40,
fill: FILL,
opacity: OPACITY,
left: 60,
top: 60
});
canvas.add(rect1);
var rect2 = new fabric.Rect({
width: 40,
height: 40,
fill: FILL
opacity: OPACITY,
});
var rect2Group = new fabric.Group([rect2], {
left: 120,
top: 60
});
canvas.add(rect2Group);
/**
* Circles
* the second circle is darker
*/
var circle1 = new fabric.Circle({
radius: 20,
fill: FILL,
opacity: OPACITY,
left: 60,
top: 120
});
canvas.add(circle1);
var circle2 = new fabric.Circle({
radius: 20,
fill: FILL,
opacity: OPACITY,
});
var circle2Group = new fabric.Group([circle2], {
left: 120,
top: 120
});
canvas.add(circle2Group);
Вот JSFiddle.
Если вы запустите его, вы увидите, что второй кружок темнее первого, что означает, что его непрозрачность ниже.
Я что-то не так делаю или это ошибка? (Может быть воспроизведено в 1.2.0 и 1.3.0.)
1 ответ
Скорее всего, это из-за этой строки в fabric.Circle
:
// multiply by currently set alpha
// (the one that was set by path group where this object is contained, for example)
ctx.globalAlpha = this.group ? (ctx.globalAlpha * this.opacity) : this.opacity;
Это связано с тем, что круги являются частью группы SVG, IIRC.
В любом случае, это определенно баг - непрозрачность в вашем случае умножать не стоит. Нам нужен чек получше.
Сообщите о проблеме на github.
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript/JS) и его различных диалектах/реализациях (кроме ActionScript). Имейте в виду, что JavaScript — это НЕ то же самое, что Java! Включите все ярлыки, относящиеся к вашему вопросу; например, [node.js], [jQuery], [JSON], [ReactJS], [angular], [ember.js], [vue.js], [typescript], [svelte] и т. д.
FILL = 'rgba(255, 255, 255, 0.65)'
и вообще не использовать OPACITY. Таким образом, оба круга (то есть с группой и без нее) выглядят одинаково.