Comment puis-je changer L'échelle des éléments Raphael js sur la fenêtre redimensionner en utilisant jquery

Comment puis-je redimensionner tous les éléments à l'intérieur d'un Raphael toile sur la fenêtre de changement ?

considérant le code suivant / DEMO si je re-taille de ma fenêtre div container échelle depuis que j'ai mis sa largeur jusqu'à 50% de la largeur de la fenêtre et aucun des (rect,circle ou path) changement

CODE

<div id="container"></div>​
 #container{border : 1px solid black ;
               width : 50% ;
               height:300px}​
var con = $("#container");
var paper = Raphael(con.attr('id'), con.attr('width'), con.attr('height'));
var win = paper.rect(0,0,400,300).attr({stroke: 'black' }) ; 
var path = paper.path("M 200 100 l 100 0 z") ; 
var cir = paper.circle(50, 50, 40);

23
demandé sur Mina Gabriel 2012-06-24 13:40:26

5 réponses

si vous utilisez Raphaël version 2.0 ou une version ultérieure, une alternative est d'appeler papier.setViewBox pour configurer votre système de coordonnées, puis laisser les navigateurs gérer le redimensionnement automatiquement.

mise à Jour: OK, il s'avère que Raphaël est un peu moins auto-évolutif que je le pensais... de toute façon, voici un exemple (raphaël fixe encore une hauteur / largeur absolue sur la racine , donc ils doivent être supprimés pour que l'échelle svg normale ait lieu). La taille est ensuite décidé par CSS, et le svg est tout simplement adapté à la zone donnée. Il est possible de modifier cela pour gérer le contenu débordant, ce qui peut se produire en raison du format svg viewBox qui ne correspond pas à la boîte CSS dans laquelle il est placé. Vous faites cela en ajoutant un preserveAspectRatio attribut à l'élément SVG racine.

Vous pouvez en lire davantage sur les valeurs que vous pouvez définir sur le svg preserveAspectRatio l'attribut ici, mais les trois valeurs qui sont probablement d'intérêt sont 'none' (pour presser/étirements pour s'adapter quelle que soit rect), 'xMidYMid slice' (à l'échelle pour remplir le rect, éventuellement d'écrêtage à l'écart des pièces si l'aspect ne correspond pas), 'xMidYMid meet' (c'est la valeur par défaut, identique à ne pas spécifier du tout pAR, et signifie que le contenu sera centré et débordera dans une direction si l'aspect ne correspond pas).

29
répondu Erik Dahlström 2017-02-06 09:57:12

http://jsfiddle.net/vnTQT/

    var paper = Raphael("wrap");
    paper.setViewBox(0,0,w,h,true);
    paper.setSize('100%', '100%');

Utilisé cette (sur papier.setViewBox) avec du papier.setSize('100%', '100%') et redimensionner la fenêtre avec redimensionner le contenu svg sans utiliser les fonctions svg directement.

19
répondu Sergey Krasnikov 2013-02-11 09:50:37

je crois que j'ai trouvé une solution : le code suivant sera de nouveau l'échelle de tous les éléments lors de la réorganisation de la taille de la fenêtre , et c'est ce que je cherchais

            var w = $(window).width();
            var h = $(window).height();
            function draw(w, h) {
                var paper = Raphael($('#wrap').attr('id'), w, h);
                paper.setViewBox(0, 0, 1500, 1500, true);
                var rec = paper.rect(0, 0, 200, 200).attr({ stroke: 'black' });
                var cir = paper.circle(100, 100, 50);
            };
            draw(w, h);
            function resize() {
                var xw = $(window).width();
                var xh = $(window).height();
                draw(xw, xh)
            }
            $(window).resize(resize);

référence de @Erik Dahlström : Papier.setViewBox (x, y, w, H, fit) et attribut’ viewBox'

4
répondu Mina Gabriel 2017-02-06 09:37:02

Vous pouvez utiliser ce script une fois que j'ai utilisé avant :

http://www.shapevent.com/scaleraphael/

Checkout Remplir la fenêtre - pas de coupure exemple pour le redimensionnement de la toile :

http://www.shapevent.com/scaleraphael/demo1.html

2
répondu Luffy 2012-06-24 15:01:29

Si vous avez un ensemble d'éléments pour redimensionner, vous pouvez utiliser directement dans votre code js ...

for (var i = 0; i < your_set.length; i++) {
    your_set[i].scale(ratio, ratio, 0,0);
};

... et une fonction pour recharger la page sur le redimensionnement du navigateur:

window.addEventListener('resize', function () { 
    "use strict";
    window.location.reload(); 
});
0
répondu mquantin 2016-02-14 21:56:43