#svg
Я хочу сделать исключение фигур. Вот здесь я использую фильтр:
А вот здесь без фильтра:
Как видно, при применении фильтра, фигуры съезжают. Почему это происходит и как исправить?
Методом тыка я обнаружил, что дело в feImage. А также смещение зависит от количества
элементов и от их расположения. Сделал, чтобы позиция элементов изменялась от положения
мыши:
const value = (max = 100000000, min = 0) => Math.round(Math.random() * (max - min))
+ min;
const createCircle = (size) => {
const r = value(10, 3);
const cx = value(size - r - 10, r + 10);
const cy = value(size - r - 10, r + 10);
return {
r,
cx,
cy
}
};
const createCircles = (counts, size) => Array(counts).fill().map(() => createCircle(size));
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
position: {
x: 0,
y: 0,
}
};
this.size = 300;
this.circlesData = createCircles(100, this.size);
const getCoords = (c, i) => c + (this.state.position.x * 0.002 * c * (i % 2
? 1 : -1));
this.circles = () => this.circlesData.map((item, i) => );
}
onMouseMove = e => {
const position = {
x: e.pageX,
y: e.pageY,
};
this.setState({position});
}
render() {
return (
);
}
}
ReactDOM.render( < App / > , document.getElementById('root'));
Большой круг должен стоять на месте, а он движется.
Какой фильтр использовать для svg фигур?? Или как исправить, без костылей, feImage?
Ответы
Ответ 1
Все оказалось довольно просто.по умолчанию имеет следующие атрибуты: x="-10%" y="-10%" width="120%" height="120%" И именно из-за этого и смещается изображение. https://www.w3.org/TR/SVG11/single-page.html#filters-feImageElement Нужно выставить следующие атрибуты и все будет работать корректно: x="0" y="0" width="100%" height="100%" const value = (max = 100000000, min = 0) => Math.round(Math.random() * (max - min)) + min; const createCircle = (size) => { const r = value(10, 3); const cx = value(size - r - 10, r + 10); const cy = value(size - r - 10, r + 10); return { r, cx, cy } }; const createCircles = (counts, size) => Array(counts).fill().map(() => createCircle(size)); class App extends React.Component { constructor(props) { super(props); this.state = { position: { x: 0, y: 0, } }; this.size = 300; this.circlesData = createCircles(100, this.size); const getCoords = (c, i) => c + (this.state.position.x * 0.002 * c * (i % 2 ? 1 : -1)); this.circles = () => this.circlesData.map((item, i) => ); } componentDidMount() { this.svg.addEventListener('mousemove', e => { const position = { x: e.pageX, y: e.pageY, }; this.setState({position}) }); } render() { return ( ); } } ReactDOM.render( < App / > , document.getElementById('root')); Спасибо большое Paul LeBeau Этот же вопрос на англоязычном stackoverflow
Комментариев нет:
Отправить комментарий