How to set an element with relative positioning in absolute dimensions in SVG?










0















Recently began to use SVG in my personal projects. I've learned that SVG is not (just) an image but also a document. I'm willing to know how to set an element with relative positioning in absolute dimensions in SVG?



For a better understanding in case I didn't make the question clear enough, I've drawn a diagram to make it easier to get the picture:



a diagram to make it easier to get the picture



As in this image, I have a square in 100x100 px dimension. When the user changes his/her reading device, I hope the pink square can keep the size and the positioning.



I've read about the article 'How to Scale SVG' by AMELIA BELLAMY-ROYDS on CSS Tricks, got the idea but didn't really find out the way doing it.



I've found <rect> tag in SVG file, but have no idea how to make the pink square can be maintained how big it is when the scale of parent container changes.



Any suggestion, or article, will be appreciated in advance.










share|improve this question




























    0















    Recently began to use SVG in my personal projects. I've learned that SVG is not (just) an image but also a document. I'm willing to know how to set an element with relative positioning in absolute dimensions in SVG?



    For a better understanding in case I didn't make the question clear enough, I've drawn a diagram to make it easier to get the picture:



    a diagram to make it easier to get the picture



    As in this image, I have a square in 100x100 px dimension. When the user changes his/her reading device, I hope the pink square can keep the size and the positioning.



    I've read about the article 'How to Scale SVG' by AMELIA BELLAMY-ROYDS on CSS Tricks, got the idea but didn't really find out the way doing it.



    I've found <rect> tag in SVG file, but have no idea how to make the pink square can be maintained how big it is when the scale of parent container changes.



    Any suggestion, or article, will be appreciated in advance.










    share|improve this question


























      0












      0








      0








      Recently began to use SVG in my personal projects. I've learned that SVG is not (just) an image but also a document. I'm willing to know how to set an element with relative positioning in absolute dimensions in SVG?



      For a better understanding in case I didn't make the question clear enough, I've drawn a diagram to make it easier to get the picture:



      a diagram to make it easier to get the picture



      As in this image, I have a square in 100x100 px dimension. When the user changes his/her reading device, I hope the pink square can keep the size and the positioning.



      I've read about the article 'How to Scale SVG' by AMELIA BELLAMY-ROYDS on CSS Tricks, got the idea but didn't really find out the way doing it.



      I've found <rect> tag in SVG file, but have no idea how to make the pink square can be maintained how big it is when the scale of parent container changes.



      Any suggestion, or article, will be appreciated in advance.










      share|improve this question
















      Recently began to use SVG in my personal projects. I've learned that SVG is not (just) an image but also a document. I'm willing to know how to set an element with relative positioning in absolute dimensions in SVG?



      For a better understanding in case I didn't make the question clear enough, I've drawn a diagram to make it easier to get the picture:



      a diagram to make it easier to get the picture



      As in this image, I have a square in 100x100 px dimension. When the user changes his/her reading device, I hope the pink square can keep the size and the positioning.



      I've read about the article 'How to Scale SVG' by AMELIA BELLAMY-ROYDS on CSS Tricks, got the idea but didn't really find out the way doing it.



      I've found <rect> tag in SVG file, but have no idea how to make the pink square can be maintained how big it is when the scale of parent container changes.



      Any suggestion, or article, will be appreciated in advance.







      css svg






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 11 '18 at 9:40









      enxaneta

      7,0842516




      7,0842516










      asked Nov 11 '18 at 5:57









      HeNRy Hu HeNRy Hu

      11




      11






















          1 Answer
          1






          active

          oldest

          votes


















          0














          The easiest solution would be not resizing the SVG. You give your SVG a width and a height in pixels (or whatever) and you make your SVG not responsive.



          If this doesn't work for you, if you need to resize the whole svg element but not the pink rectangle, next comes an example where I resize the SVG canvas but the <rect> is apparently not resized.






          function init()
          let p =
          x : 1000 * .05,// 5% of the svg width
          y : 500 * .05 // 5% of the svg height


          p = getCoords(p);

          let size =
          x:100,
          y:100

          size = getCoords(size);

          // resize the rect
          theRect.setAttributeNS(null,"x",p.x);
          theRect.setAttributeNS(null,"y",p.y);
          theRect.setAttributeNS(null,"width",size.x);
          theRect.setAttributeNS(null,"height",size.y);



          function getCoords(o)
          var p = svg.createSVGPoint();
          p.x= o.x;
          p.y= o.y;
          p = p.matrixTransform(svg.getScreenCTM().inverse());
          return p


          setTimeout(function()
          init();
          addEventListener('resize', init, false);
          , 15);

          svgborder:1px solid

          <svg id="svg" viewBox="0 0 1000 500">

          <circle fill="gold" cx="500" cy="250" r="200" />
          <rect id="theRect" fill="hotpink" x="5%" y="5%" width="100px" height="100px" />

          </svg>








          share|improve this answer






















            Your Answer






            StackExchange.ifUsing("editor", function ()
            StackExchange.using("externalEditor", function ()
            StackExchange.using("snippets", function ()
            StackExchange.snippets.init();
            );
            );
            , "code-snippets");

            StackExchange.ready(function()
            var channelOptions =
            tags: "".split(" "),
            id: "1"
            ;
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function()
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled)
            StackExchange.using("snippets", function()
            createEditor();
            );

            else
            createEditor();

            );

            function createEditor()
            StackExchange.prepareEditor(
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader:
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            ,
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            );



            );













            draft saved

            draft discarded


















            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53246241%2fhow-to-set-an-element-with-relative-positioning-in-absolute-dimensions-in-svg%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            0














            The easiest solution would be not resizing the SVG. You give your SVG a width and a height in pixels (or whatever) and you make your SVG not responsive.



            If this doesn't work for you, if you need to resize the whole svg element but not the pink rectangle, next comes an example where I resize the SVG canvas but the <rect> is apparently not resized.






            function init()
            let p =
            x : 1000 * .05,// 5% of the svg width
            y : 500 * .05 // 5% of the svg height


            p = getCoords(p);

            let size =
            x:100,
            y:100

            size = getCoords(size);

            // resize the rect
            theRect.setAttributeNS(null,"x",p.x);
            theRect.setAttributeNS(null,"y",p.y);
            theRect.setAttributeNS(null,"width",size.x);
            theRect.setAttributeNS(null,"height",size.y);



            function getCoords(o)
            var p = svg.createSVGPoint();
            p.x= o.x;
            p.y= o.y;
            p = p.matrixTransform(svg.getScreenCTM().inverse());
            return p


            setTimeout(function()
            init();
            addEventListener('resize', init, false);
            , 15);

            svgborder:1px solid

            <svg id="svg" viewBox="0 0 1000 500">

            <circle fill="gold" cx="500" cy="250" r="200" />
            <rect id="theRect" fill="hotpink" x="5%" y="5%" width="100px" height="100px" />

            </svg>








            share|improve this answer



























              0














              The easiest solution would be not resizing the SVG. You give your SVG a width and a height in pixels (or whatever) and you make your SVG not responsive.



              If this doesn't work for you, if you need to resize the whole svg element but not the pink rectangle, next comes an example where I resize the SVG canvas but the <rect> is apparently not resized.






              function init()
              let p =
              x : 1000 * .05,// 5% of the svg width
              y : 500 * .05 // 5% of the svg height


              p = getCoords(p);

              let size =
              x:100,
              y:100

              size = getCoords(size);

              // resize the rect
              theRect.setAttributeNS(null,"x",p.x);
              theRect.setAttributeNS(null,"y",p.y);
              theRect.setAttributeNS(null,"width",size.x);
              theRect.setAttributeNS(null,"height",size.y);



              function getCoords(o)
              var p = svg.createSVGPoint();
              p.x= o.x;
              p.y= o.y;
              p = p.matrixTransform(svg.getScreenCTM().inverse());
              return p


              setTimeout(function()
              init();
              addEventListener('resize', init, false);
              , 15);

              svgborder:1px solid

              <svg id="svg" viewBox="0 0 1000 500">

              <circle fill="gold" cx="500" cy="250" r="200" />
              <rect id="theRect" fill="hotpink" x="5%" y="5%" width="100px" height="100px" />

              </svg>








              share|improve this answer

























                0












                0








                0







                The easiest solution would be not resizing the SVG. You give your SVG a width and a height in pixels (or whatever) and you make your SVG not responsive.



                If this doesn't work for you, if you need to resize the whole svg element but not the pink rectangle, next comes an example where I resize the SVG canvas but the <rect> is apparently not resized.






                function init()
                let p =
                x : 1000 * .05,// 5% of the svg width
                y : 500 * .05 // 5% of the svg height


                p = getCoords(p);

                let size =
                x:100,
                y:100

                size = getCoords(size);

                // resize the rect
                theRect.setAttributeNS(null,"x",p.x);
                theRect.setAttributeNS(null,"y",p.y);
                theRect.setAttributeNS(null,"width",size.x);
                theRect.setAttributeNS(null,"height",size.y);



                function getCoords(o)
                var p = svg.createSVGPoint();
                p.x= o.x;
                p.y= o.y;
                p = p.matrixTransform(svg.getScreenCTM().inverse());
                return p


                setTimeout(function()
                init();
                addEventListener('resize', init, false);
                , 15);

                svgborder:1px solid

                <svg id="svg" viewBox="0 0 1000 500">

                <circle fill="gold" cx="500" cy="250" r="200" />
                <rect id="theRect" fill="hotpink" x="5%" y="5%" width="100px" height="100px" />

                </svg>








                share|improve this answer













                The easiest solution would be not resizing the SVG. You give your SVG a width and a height in pixels (or whatever) and you make your SVG not responsive.



                If this doesn't work for you, if you need to resize the whole svg element but not the pink rectangle, next comes an example where I resize the SVG canvas but the <rect> is apparently not resized.






                function init()
                let p =
                x : 1000 * .05,// 5% of the svg width
                y : 500 * .05 // 5% of the svg height


                p = getCoords(p);

                let size =
                x:100,
                y:100

                size = getCoords(size);

                // resize the rect
                theRect.setAttributeNS(null,"x",p.x);
                theRect.setAttributeNS(null,"y",p.y);
                theRect.setAttributeNS(null,"width",size.x);
                theRect.setAttributeNS(null,"height",size.y);



                function getCoords(o)
                var p = svg.createSVGPoint();
                p.x= o.x;
                p.y= o.y;
                p = p.matrixTransform(svg.getScreenCTM().inverse());
                return p


                setTimeout(function()
                init();
                addEventListener('resize', init, false);
                , 15);

                svgborder:1px solid

                <svg id="svg" viewBox="0 0 1000 500">

                <circle fill="gold" cx="500" cy="250" r="200" />
                <rect id="theRect" fill="hotpink" x="5%" y="5%" width="100px" height="100px" />

                </svg>








                function init()
                let p =
                x : 1000 * .05,// 5% of the svg width
                y : 500 * .05 // 5% of the svg height


                p = getCoords(p);

                let size =
                x:100,
                y:100

                size = getCoords(size);

                // resize the rect
                theRect.setAttributeNS(null,"x",p.x);
                theRect.setAttributeNS(null,"y",p.y);
                theRect.setAttributeNS(null,"width",size.x);
                theRect.setAttributeNS(null,"height",size.y);



                function getCoords(o)
                var p = svg.createSVGPoint();
                p.x= o.x;
                p.y= o.y;
                p = p.matrixTransform(svg.getScreenCTM().inverse());
                return p


                setTimeout(function()
                init();
                addEventListener('resize', init, false);
                , 15);

                svgborder:1px solid

                <svg id="svg" viewBox="0 0 1000 500">

                <circle fill="gold" cx="500" cy="250" r="200" />
                <rect id="theRect" fill="hotpink" x="5%" y="5%" width="100px" height="100px" />

                </svg>





                function init()
                let p =
                x : 1000 * .05,// 5% of the svg width
                y : 500 * .05 // 5% of the svg height


                p = getCoords(p);

                let size =
                x:100,
                y:100

                size = getCoords(size);

                // resize the rect
                theRect.setAttributeNS(null,"x",p.x);
                theRect.setAttributeNS(null,"y",p.y);
                theRect.setAttributeNS(null,"width",size.x);
                theRect.setAttributeNS(null,"height",size.y);



                function getCoords(o)
                var p = svg.createSVGPoint();
                p.x= o.x;
                p.y= o.y;
                p = p.matrixTransform(svg.getScreenCTM().inverse());
                return p


                setTimeout(function()
                init();
                addEventListener('resize', init, false);
                , 15);

                svgborder:1px solid

                <svg id="svg" viewBox="0 0 1000 500">

                <circle fill="gold" cx="500" cy="250" r="200" />
                <rect id="theRect" fill="hotpink" x="5%" y="5%" width="100px" height="100px" />

                </svg>






                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 11 '18 at 11:52









                enxanetaenxaneta

                7,0842516




                7,0842516



























                    draft saved

                    draft discarded
















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid


                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.

                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function ()
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53246241%2fhow-to-set-an-element-with-relative-positioning-in-absolute-dimensions-in-svg%23new-answer', 'question_page');

                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    𛂒𛀶,𛀽𛀑𛂀𛃧𛂓𛀙𛃆𛃑𛃷𛂟𛁡𛀢𛀟𛁤𛂽𛁕𛁪𛂟𛂯,𛁞𛂧𛀴𛁄𛁠𛁼𛂿𛀤 𛂘,𛁺𛂾𛃭𛃭𛃵𛀺,𛂣𛃍𛂖𛃶 𛀸𛃀𛂖𛁶𛁏𛁚 𛂢𛂞 𛁰𛂆𛀔,𛁸𛀽𛁓𛃋𛂇𛃧𛀧𛃣𛂐𛃇,𛂂𛃻𛃲𛁬𛃞𛀧𛃃𛀅 𛂭𛁠𛁡𛃇𛀷𛃓𛁥,𛁙𛁘𛁞𛃸𛁸𛃣𛁜,𛂛,𛃿,𛁯𛂘𛂌𛃛𛁱𛃌𛂈𛂇 𛁊𛃲,𛀕𛃴𛀜 𛀶𛂆𛀶𛃟𛂉𛀣,𛂐𛁞𛁾 𛁷𛂑𛁳𛂯𛀬𛃅,𛃶𛁼

                    Edmonton

                    Crossroads (UK TV series)