【问题标题】:How do I force a SVG to be contained in a div?如何强制将 SVG 包含在 div 中?
【发布时间】:2016-05-06 13:30:01
【问题描述】:

我正在尝试在<div> 中创建一个<svg>。我在#display 规则中使用了overflow: auto;,但<svg> 仍然超出<div>。我希望<svg> 只出现在<div> 内部,就好像<div><svg> 的显示窗口一样。当<svg> 离开<div> 的一侧时,我只想在<div> 的一侧放置一个滚动条。感谢您的帮助。

$(document).ready(function(){
    $('#testbtm').click(function(){
        var str = '<svg class="hexagon" class="ui-widget-content"   style="position:absolute; left:800; top:800;">\
        <text fill="black" x=75 y=75 style="text-anchor: middle">1</text>\
        <path d="M38 0 L113 0 L150 65 L113 130 L38 130 L0 65 Z" / fill="none" stroke="blue"></svg>'
        var svgElement = $(str);		
        svgElement.children('text').text(1);
        $("#display").append(svgElement);	
    }); //end click	
}); // end ready
#display {
    height: 500px;
    width: 500px;
    border: 1px solid black;
    overflow: auto;
}
<script  src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"> </script>
<div id="display"></div>
<button id="testbtm">test</button>

【问题讨论】:

    标签: javascript jquery html css svg


    【解决方案1】:

    您必须将position: relative 提供给您的父元素,并且您的lefttop 值必须在pixel 中。 Reduced 宽度和 height 为方便起见。

    $(document).ready(function(){
        $('#testbtm').click(function(){
            var str = '<svg class="hexagon" class="ui-widget-content"   style="position:absolute; left:50%; top:50%; transform: translate(-50%,-50%)">\
            <text fill="black" x=75 y=75 style="text-anchor: middle">1</text>\
            <path d="M38 0 L113 0 L150 65 L113 130 L38 130 L0 65 Z" / fill="none" stroke="blue"></svg>'
            var svgElement = $(str);		
            svgElement.children('text').text(1);
            $("#display").append(svgElement);	
        }); //end click	
    }); // end ready
    #display {
        height: 250px;
        width: 250px;
        border: 1px solid black;
        overflow: auto;
        position: relative;
    }
    
    svg{
      max-width: 100%;
    }
    <script  src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"> </script>
    <div id="display"></div>
    <button id="testbtm">test</button>

    【讨论】:

      【解决方案2】:

      您只需将position: relative 添加到您的#display

      由于您指定了position: absolute,它将寻找最近的祖先定位(非静态)元素。如果#display 不是定位元素,它将采用初始包含块,这意味着可见视口作为定位自身的锚。这就是为什么您会看到&lt;svg&gt; 似乎从&lt;div&gt; 溢出。

      当然,使用您当前的内联样式,您的六边形会出现在可滚动的#display 的右下方。

      编辑:我已将内联样式移出到您的类.hexagon 下指定的外部样式表,因为在不移出内联样式的情况下显示数字似乎存在问题。尽管如此,这会让您的结果保留您的偏移尺寸,同时保持 #display 可滚动。

      试试下面的代码:

      $(document).ready(function(){
          $('#testbtm').click(function(){
              var str = '<svg class="hexagon ui-widget-content">\
              <text fill="black" x=75 y=75 style="text-anchor: middle">1</text>\
              <path d="M38 0 L113 0 L150 65 L113 130 L38 130 L0 65 Z" fill="none" stroke="blue"></svg>'
              var svgElement = $(str);		
              svgElement.children('text').text(1);
              $("#display").append(svgElement);	
          }); //end click	
      }); // end ready
      #display {
          height: 500px;
          width: 500px;
          border: 1px solid black;
          overflow: auto;
        position: relative; /* add this line! */
      }
      
      .hexagon {  /* extracted inline style to external stylesheet */
        position: absolute;
        left: 800px;
        top: 800px;
      }
      <script  src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"> </script>
      <div id="display"></div>
      <button id="testbtm">test</button>

      【讨论】:

        【解决方案3】:

        如果您希望将 SVG 绘制在 &lt;div&gt; 内,则必须删除您在其上设置的 position: absolute

        $(document).ready(function(){
            $('#testbtm').click(function(){
                var str = '<svg class="hexagon" class="ui-widget-content"   width="1000px" height="1000px">\
                <text fill="black" x=75 y=75 style="text-anchor: middle">1</text>\
                <path d="M38 0 L113 0 L150 65 L113 130 L38 130 L0 65 Z" / fill="none" stroke="blue"></svg>'
                var svgElement = $(str);		
                svgElement.children('text').text(1);
                $("#display").append(svgElement);	
            }); //end click	
        }); // end ready
        #display {
            height: 500px;
            width: 500px;
            border: 1px solid black;
            overflow: auto;
        }
        <script  src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"> </script>
        <div id="display"></div>
        <button id="testbtm">test</button>

        【讨论】:

          【解决方案4】:

          我认为你正在寻找这样的事情:

          $(document).ready(function(){
              $('#testbtm').click(function(){
                  var str = '<svg class="hexagon" class="ui-widget-content">\
                  <text fill="black" x=75 y=75 style="text-anchor: middle">1</text>\
                  <path d="M38 0 L113 0 L150 65 L113 130 L38 130 L0 65 Z" / fill="none" stroke="blue"></svg>'
                  var svgElement = $(str);		
                  svgElement.children('text').text(1);
                  $("#display").append(svgElement);	
              }); //end click	
          }); // end ready
          #display {
              height: 500px;
              width: 500px;
              border: 1px solid black;
              overflow: auto;
              position: relative;
          }
          .hexagon{
              height:150px;
              width:150px;
              position: absolute;
              top:50%;
              left:50%;
              transform:translate(-50%,-50%);
          }
          <script  src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"> </script>
          <div id="display"></div>
          <button id="testbtm">test</button>

          这是给你的小提琴好东西:https://jsfiddle.net/hb796myn/

          【讨论】:

            猜你喜欢
            • 2012-08-11
            • 2011-08-10
            • 2017-05-02
            • 2018-05-10
            • 2013-01-09
            • 1970-01-01
            • 2018-04-29
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多