【问题标题】:d3 bootstrap, responsively centering svgd3 bootstrap,响应式居中 svg
【发布时间】:2015-10-21 00:09:18
【问题描述】:

我有一个 d3 svg,我想保持居中。我试过上课:

.tocenter {
margin: 0 auto;
}

但是这不起作用。我也尝试将svg 包装在一些divs 中,但我一定做错了什么。有什么建议吗?

包含 svg 图的 svg(根据窗口调整大小): <svg id="graph" class="img-responsive tocenter"></svg>

代码:

<svg id="graph" class="img-responsive tocenter"></svg>
<h4 class="text-center">Siblings in College</h4>
<div class="col-md-12 text-center">
<button type="button" class="btn btn-default btn-sm" onclick=updateData(0)>No Siblings in College</button>
<button type="button" class="btn btn-default btn-sm" onclick=updateData(1)>1+ Sibling(s) in College</button>
</div>
<div><br /></div>
<h4 class="text-center">Household Income</h4>
<div class="col-md-12 text-center">
<div class="btn-group" data-toggle="buttons">
    <button type="button" class="btn btn-default btn-sm" onclick=updateData2(1)><$30k</button>
    <button type="button" class="btn btn-default btn-sm" onclick=updateData2(2)>$30k-$48k</button>
    <button type="button" class="btn btn-default btn-sm" onclick=updateData2(3)>$48k-$75k</button>
    <button type="button" class="btn btn-default btn-sm" onclick=updateData2(4)>$75k-$110k</button>
    <button type="button" class="btn btn-default btn-sm" onclick=updateData2(5)>$110k-$150k</button>
    <button type="button" class="btn btn-default btn-sm" onclick=updateData2(6)>>$150k</button>
</div>
</div>

【问题讨论】:

  • 您能否编辑问题并包含 svg 标记及其周围元素的 HTML。
  • 你在使用引导程序吗?因为img-responsive.
  • @As3adTintin - 我已对我的答案进行了编辑。在我看来完全居中。

标签: javascript css twitter-bootstrap d3.js svg


【解决方案1】:

我创建了JSFiddle,这可能有助于解决您的问题。请注意,我指定了 svg 元素的宽度,以便父容器可以正确地将文本对齐属性添加到 SVG。

HTML 和 CSS:

<div>
  <svg> </svg >
</div>

svg {
  width: *some value*
}

div {
  text-align: center
}

【讨论】:

  • 嗯,它居中,但与 text-center 提供引导 div 的中心不同
  • 我使用.yutest { padding-left: 12%; text-align: left; /*border: solid 1px black;*/ }让它工作
【解决方案2】:

使用 center-block 帮助类来居中您的 svg。

center-block

设置要显示的元素:通过边距阻止和居中。可作为 mixin 和 class 使用。

还要确保将viewBoxpreserveAspectRatio 属性添加到您的svg 元素。

var margin        = { top: 50, right: 50, bottom: 50, left: 50}, 
    w             = 1024 - margin.left - margin.right,
    h             = 300 - margin.top - margin.bottom,
    circleRadii   = 15,
    triData       = [{x: 120, y: 30}, {x: 250, y: 120}, {x: 340, y: 160}],
    circleData    = [{x: 110, y: 10}, {x: 140, y: 80}, {x: 460, y: 70}];

var svg = d3.select("#graph")
.attr("width", w + margin.left + margin.right)
.attr("height", h + margin.left + margin.right)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");

var tri =  svg.selectAll(".point")
.data(triData)
.enter().append("path")
.attr("class", "point")
.attr("stroke", "none")
.attr("fill", "rgba(30,110,160,.5)")
.attr("d", d3.svg.symbol().type("triangle-up").size(1024*2))
.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });

var circles = svg.selectAll("circle")
.data(circleData)
.enter()
.append("circle");

var circleAttr = circles
.attr("cx", function (d) { return d.x; })
.attr("cy", function (d) { return d.y; })
.attr("r", circleRadii)
.style("fill", "rgba(10,100,0,.5)");
svg {
    background: black;
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>

<div class="container">
  <div class="row">
    <div class="col-md-12">
      <svg id="graph" class="img-responsive center-block" width="1024" height="300" viewBox="0 0 1024 300" preserveAspectRatio="xMidYMid"></svg>
      <h4 class="text-center">Siblings in College</h4>
    </div>
    <div class="col-md-12 text-center">
      <button type="button" class="btn btn-default btn-sm" onclick=updateData(0)>No Siblings in College</button>
      <button type="button" class="btn btn-default btn-sm" onclick=updateData(1)>1+ Sibling(s) in College</button>
    </div>
    <div><br /></div>
    <h4 class="text-center">Household Income</h4>
    <div class="col-md-12 text-center">
      <div class="btn-group" data-toggle="buttons">
        <button type="button" class="btn btn-default btn-sm" onclick=updateData2(1)><$30k</button>
          <button type="button" class="btn btn-default btn-sm" onclick=updateData2(2)>$30k-$48k</button>
          <button type="button" class="btn btn-default btn-sm" onclick=updateData2(3)>$48k-$75k</button>
          <button type="button" class="btn btn-default btn-sm" onclick=updateData2(4)>$75k-$110k</button>
          <button type="button" class="btn btn-default btn-sm" onclick=updateData2(5)>$110k-$150k</button>
          <button type="button" class="btn btn-default btn-sm" onclick=updateData2(6)>>$150k</button>
          </div>
      </div>
    </div>
  </div>

【讨论】:

  • 感谢您的建议。这几乎是我希望实现的目标。当我不使用响应式宽度时,它使 svg 居中,但是我希望我的图表具有响应性,以便它可以适应不同的屏幕。当我将您的代码与响应式 svg 一起使用时,svg 会稍微移动,但似乎更左对齐。 var margin = 40,width = parseInt(d3.select("#graph").style("width")) - margin*2,height = parseInt(d3.select("#graph").style("height")) - margin*2;
  • 刚刚看到您的 svg 上缺少 preserveAspectRatioviewBox 属性。与img-responsive 类一起工作就好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2015-11-04
  • 2016-11-29
  • 1970-01-01
  • 2017-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多