#css #svg #mask
#container {
position: relative;
height: 300px;
width: 400px;
border: 1px solid black;
background: url(https://www.firestock.ru/wp-content/uploads/2019/03/YArkiy-ryizhiy-kot-na-fone-siney-stenyi-Bright-red-cat-on-a-background-of-blue-wall-6072--4000-700x460.jpg)
}
#mask{
position: absolute;
border: 1px dashed lightblue;
height: 300px;
width: 900px;
background: #87cefa24;
left: -300px;
}
Имеется контейнер (#container) с фоновым изображением и вложенный, перемещающийся
по оси x контейнер-маска (#mask) (большей ширины, нежели родительский контейнер). Каким
способом я могу реализовать максимально кроссбраузерное решение следующей задачи: динамически
заполнять маску либо полупрозрачным градиентом, либо изображением с альфа-каналом таким
образом (только градиентные переходы прозрачности в разных конфигурациях), чтобы при
перемещении маски сквозь нее «просвечивался» фон в соответствии с альфа-каналом маски?
Соответственно, остальные участки изображения должны быть прозрачными. У меня есть
один вариант, но хотелось бы увидеть другие решения, возможно более лаконичные и простые
Ответы
Ответ 1
Вот вариант с svg и маской, отправлено и проверено в ff 66.0.3 let d = [[100,100,70], [300,100,60], [500,100,50]] .map(d=>({x: d[0], y: d[1], r: d[2]})); let mask = circles('mask').call(upd); circles('g').style('fill','transparent') .style('cursor','pointer') .call(upd) .call(d3.drag().on("drag", function (d) { d3.select(this) .attr("cx", d.x = d3.event.x) .attr("cy", d.y = d3.event.y); mask.call(upd) })); function circles(selector) { return d3.select(selector) .selectAll('circle') .data(d) .enter() .append('circle') } function upd(selection) { selection.attr("cx", d => d.x) .attr("cy", d => d.y) .attr('r', d => d.r) .attr('fill', 'url(#linear-gradient)'); }
Комментариев нет:
Отправить комментарий