La escala de un patrón de relleno en Raphael.js
-
11-09-2019 - |
Pregunta
paper=Raphael('previewBody',480,480);
paper.path({"stroke-width":1},'M0,0 L480,240 L480,480 L240,480 z')
.attr('fill','url(bg.png)'))
.scale(.5,.5,0,0);
Mi problema es el relleno no se escala con el lienzo SVG, por lo que proporcionalmente, que termina como el doble del tamaño que tenía antes de la escala de la ruta. ¿Hay alguna forma fácil de escalar el patrón de relleno, junto con el resto de la SVG?
Solución
Es posible nota hacerlo usando sólo las funciones de la biblioteca Rafael.
Cuando se aplica la función de escala en el objeto de un Rafael, se crea un nuevo nodo SVG, con las coordenadas escala, pero, por desgracia, no modifica las propiedades de relleno
De todos modos, cuando se agrega el atributo de "rellenar" con una URL, la biblioteca crear un patrón.
Si es la primera "llenar" atributo que se utiliza, este patrón se llama raphael-pattern-0
la siguiente se llama raphael-pattern-1
, etc ...)
Sabiendo esto, entonces es posible cambiar el atributo del patrón, de acuerdo con la especificaciones SVG
Usted puede obtener los atributos del patrón con document.getElementById("raphael-pattern-0")
y cambiar sus propiedades con el setAttribute
Por ejemplo (dependiendo de lo que realmente quiere hacer), podría ser algo como:
var pat = document.getElementById("raphael-pattern-0");
pat.setAttribute("height", pat.getAttribute("height")*0.5);
pat.setAttribute("width", pat.getAttribute("width")*0.5);
También puede modificar las propiedades x
, y
, patternUnits
y patternContentUnits
.
Esperamos que se puede responder a su pregunta.
Otros consejos
No sé por qué, pero mi versión de la biblioteca Rafael (yo uso más reciente) no pone ID que describe @ThibThib. Es probablemente porque tenemos 2013 ahora:)
Voy a publicar mi solución, así:
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<title>Raphael Test</title>
<script type="text/javascript" src="js/libs/jquery.js"></script>
<script type="text/javascript" src="js/libs/raphael.js"></script>
</head>
<body>
<div id="raphael"></div>
<script type="text/javascript">
$(document).ready(function() {
var raphael, path, pattern;
raphael = Raphael(document.getElementById('raphael'), 500, 500);
path = raphael.circle(200, 200, 180);
path.attr('stroke', '#000000');
path.attr('stroke-width', 3);
path.attr('stroke-opacity', 1);
path.attr('fill', 'url(http://3.bp.blogspot.com/_M4WdA9j-b-g/TLMF9JJJwcI/AAAAAAAAAV4/p0Y_Wo3S3sQ/s1600/Landscape1.jpg)');
pattern = $(path.node).attr('fill');
if(pattern) {
pattern = pattern.replace('url(', '').replace(')', '');
pattern = $(pattern);
}
// Shape element documentation: http://msdn.microsoft.com/en-us/library/hh846327(v=vs.85).aspx#shape_element
// Fill element documentation: http://msdn.microsoft.com/en-us/library/bb229596(v=vs.85).aspx
setTimeout(function() {
if(Raphael.vml) { // SVG not supported (IE7 & IE8) and it doesn't work :/
var html = $(path.node).html();
html = html.replace(/rvml:/g, ''); // remove prefix
html = html.replace(/ = /g, '=');
html = html.substr(html.indexOf('/>') + 2); // remove xml element
var src = '';
$(html).each(function() {
if($(this).prop("tagName") == 'FILL') {
src = $(this).attr('src');
}
});
if(src != '') {
var html = $(path.node).html();
html = html.replace(src, src + '" size="50,50');
$(path.node).html(html);
path.attr('stroke', '#000000');
path.attr('stroke-width', 3);
path.attr('stroke-opacity', 1);
}
}
else { // SVG supported and it prints correct URL
$(pattern)[0].setAttribute('width', 50);
$(pattern)[0].setAttribute('height', 50);
$(pattern).find('image')[0].setAttribute('width', 50);
$(pattern).find('image')[0].setAttribute('height', 50);
$(pattern).find('image')[0].setAttribute('preserveAspectRatio', 'defer none meet');
}
}, 1000);
});
</script>
</body>
</html>
Aviso pocas cosas:
-
acceso VML relleno de imagen se describe aquí: ¿Cómo acceder a Rafael relleno de imagen en VML
-
después de cambiar el tamaño de la imagen que tenía para restablecer golpe para la versión VML
-
por alguna razón jQuery
.attr
no funcionó para mí, así que utilicésetAttribute
(Chrome) -
I puse
preserveAspectRatio
para lograr mismo efecto que en VML. Se puede desactivar si se desea ver las diferencias ( consulte la documentación ) -
setTimeout
se utiliza para esperar a que la imagen a cargar, como SVG se ponía params después se cargó la imagen, y se sobrescribe mi cambio de tamaño
Por supuesto, puede jugar con diferentes configuraciones, así: