如何正确旋转此SVG元素?

时间:2019-06-27 11:29:58

标签: html css svg

我一直在尝试创建范围为0-100的量规。我已经在Sketch中创建了此SVG元素,现在我正试图使旋转功能适用于黑针。

为此,我尝试使用transform-origintransform: rotate(),但是我似乎无法像在.gif中那样旋转它,因为它似乎总是可以隔断。我添加了一个JS范围滑块以方便您演示该问题。 Here也是实验的代码笔。

您能帮助我达到gif所示的预期结果吗?

enter image description here

$('#percent').on('change', function() {
  $('#needle').css('transform', 'translate(175px, 19px) rotate(' + percentToDegrees($(this).val()) + 'deg)')
})

function percentToDegrees(percent) {
  var degrees = -90;
  var inc = 1.8;
  return degrees += (percent * inc);
}
#needle {
  transform-origin: 0% bottom;
  transform: translate(175px, 19px) rotate(0);
}

input {
  display: block;
  margin: 50px auto;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<svg width="100%" height="177px" viewBox="0 0 385 177" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="Artboard" transform="translate(-15.000000, -224.000000)">
            <g id="Group" transform="translate(15.000000, 220.000000)">
                <g id="guage">
                    <path d="M84.8041871,178.856781 L84.8041871,179.169281 L25,179.169281 L25,178.669281 C25,119.519295 57.1931907,67.8894771 105.011512,40.3501901 L135,92.2989954 C105.009619,109.483749 84.8041871,141.810321 84.8041871,178.856781 Z" id="red" fill="#BD3632"></path>
                    <path d="M235.050803,92.4864742 C205.21439,75.1028089 167.169843,73.7652453 135.133157,92.2884751 L134.862916,92.4447251 L105,40.6455806 L105.432385,40.3955806 C156.58355,10.8205878 217.307001,12.8896752 265,40.5376689 L235.050803,92.4864742 L235.050803,92.4864742 Z" id="yellow" fill="#EEAF30"></path>
                    <path d="M235,92.2989954 L264.988488,40.3501901 C312.806809,67.8894771 345,119.519295 345,178.669281 L345,179.169281 L285.195813,179.169281 L285.195813,178.856781 C285.195813,141.810321 264.990381,109.483749 235,92.2989954 L235,92.2989954 Z" id="green" fill="#008542"></path>
                    <text id="100%" font-family="Omnes-Regular, Omnes" font-size="15" font-weight="normal" line-spacing="15" fill="#000000">
                        <tspan x="350" y="180">100%</tspan>
                    </text>
                    <text id="50%" font-family="Omnes-Regular, Omnes" font-size="15" font-weight="normal" fill="#000000">
                        <tspan x="171" y="14">50%</tspan>
                    </text>
                    <text id="0%" font-family="Omnes-Regular, Omnes" font-size="15" font-weight="normal" fill="#000000">
                        <tspan x="0" y="178">0%</tspan>
                    </text>
                </g>
                <g id="needle" transform="translate(175.000000, 19.000000)">
                    <polygon id="Triangle" fill="#3C3C3B" points="10 0 15 162 5 162"></polygon>
                </g>
            </g>
        </g>
    </g>
</svg>

<input type="range" id="percent" value="50" min="0" max="100">

2 个答案:

答案 0 :(得分:5)

考虑transform-box:fill-box;,然后制作原点bottom center,并稍微增加视图框以避免剪切。我也将旋转移动到了多边形,并将平移保留在g元素上。

$('#percent').on('change', function() {
  $('#triangle').css('transform', 'rotate(' + percentToDegrees($(this).val()) + 'deg)')
})

function percentToDegrees(percent) {
  var degrees = -90;
  var inc = 1.8;
  return degrees += (percent * inc);
}
#triangle {
  transform-origin:center bottom;
  transform-box:fill-box;
}

input {
  display: block;
  margin: 50px auto;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<svg width="100%" height="177px" viewBox="0 0 385 185" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="Artboard" transform="translate(-15.000000, -224.000000)">
            <g id="Group" transform="translate(15.000000, 220.000000)">
                <g id="guage">
                    <path d="M84.8041871,178.856781 L84.8041871,179.169281 L25,179.169281 L25,178.669281 C25,119.519295 57.1931907,67.8894771 105.011512,40.3501901 L135,92.2989954 C105.009619,109.483749 84.8041871,141.810321 84.8041871,178.856781 Z" id="red" fill="#BD3632"></path>
                    <path d="M235.050803,92.4864742 C205.21439,75.1028089 167.169843,73.7652453 135.133157,92.2884751 L134.862916,92.4447251 L105,40.6455806 L105.432385,40.3955806 C156.58355,10.8205878 217.307001,12.8896752 265,40.5376689 L235.050803,92.4864742 L235.050803,92.4864742 Z" id="yellow" fill="#EEAF30"></path>
                    <path d="M235,92.2989954 L264.988488,40.3501901 C312.806809,67.8894771 345,119.519295 345,178.669281 L345,179.169281 L285.195813,179.169281 L285.195813,178.856781 C285.195813,141.810321 264.990381,109.483749 235,92.2989954 L235,92.2989954 Z" id="green" fill="#008542"></path>
                    <text id="100%" font-family="Omnes-Regular, Omnes" font-size="15" font-weight="normal" line-spacing="15" fill="#000000">
                        <tspan x="350" y="180">100%</tspan>
                    </text>
                    <text id="50%" font-family="Omnes-Regular, Omnes" font-size="15" font-weight="normal" fill="#000000">
                        <tspan x="171" y="14">50%</tspan>
                    </text>
                    <text id="0%" font-family="Omnes-Regular, Omnes" font-size="15" font-weight="normal" fill="#000000">
                        <tspan x="0" y="178">0%</tspan>
                    </text>
                </g>
                <g id="needle" transform="translate(175.000000, 18.000000)">
                    <polygon id="triangle" fill="#3C3C3B" points="10 0 15 162 5 162"></polygon>
                </g>
            </g>
        </g>
    </g>
</svg>

<input type="range" id="percent" value="50" min="0" max="100">

答案 1 :(得分:3)

最简单的方法可能就是使用SVG来完成所有操作,只需设置元素的transform attribute而不是其CSS Const MAX_WAIT_SEC As Long = 5 Dim frm As Variant Dim element, submitInput As Variant Dim rowCollection, htmlRow As Variant Dim rowSubContent, rowSubData As Variant Dim anchorRange As Range, cellRng As Range Dim start Dim A As String Dim hTable As HTMLTable Dim clipboard As Object Set clipboard = GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") Set IE = CreateObject("InternetExplorer.Application") IE.Visible = True IE.navigate "https://www.nseindia.com/live_market/dynaContent/live_watch/option_chain/optionKeys.jsp?symbolCode=-10000&symbol=NIFTY&symbol=NIFTY&instrument=-&date=-&segmentLink=17&symbolCount=2&segmentLink=17" While IE.readyState <> 4: DoEvents: Wend

您所需要的只是设置style SVG转换方法的第二和第三值。

rotate(angle, origin_x, origin_y)
$('#percent').on('input', function() {
  $('#needle').attr('transform', 'translate(175, 19) ' +
    'rotate(' + percentToDegrees($(this).val()) + ', 10, 162)')
})

function percentToDegrees(percent) {
  var degrees = -90;
  var inc = 1.8;
  return degrees += (percent * inc);
}
input {
  display: block;
  margin: 50px auto;
}

您甚至会赢得浏览器兼容性;-)

请注意,这可以全部简化为:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<svg width="100%" height="177px" viewBox="0 0 385 177" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
    <g id="Artboard" transform="translate(-15.000000, -224.000000)">
      <g id="Group" transform="translate(15.000000, 220.000000)">
        <g id="guage">
          <path d="M84.8041871,178.856781 L84.8041871,179.169281 L25,179.169281 L25,178.669281 C25,119.519295 57.1931907,67.8894771 105.011512,40.3501901 L135,92.2989954 C105.009619,109.483749 84.8041871,141.810321 84.8041871,178.856781 Z" id="red" fill="#BD3632"></path>
          <path d="M235.050803,92.4864742 C205.21439,75.1028089 167.169843,73.7652453 135.133157,92.2884751 L134.862916,92.4447251 L105,40.6455806 L105.432385,40.3955806 C156.58355,10.8205878 217.307001,12.8896752 265,40.5376689 L235.050803,92.4864742 L235.050803,92.4864742 Z" id="yellow" fill="#EEAF30"></path>
          <path d="M235,92.2989954 L264.988488,40.3501901 C312.806809,67.8894771 345,119.519295 345,178.669281 L345,179.169281 L285.195813,179.169281 L285.195813,178.856781 C285.195813,141.810321 264.990381,109.483749 235,92.2989954 L235,92.2989954 Z" id="green" fill="#008542"></path>
          <text id="100%" font-family="Omnes-Regular, Omnes" font-size="15" font-weight="normal" line-spacing="15" fill="#000000">
            <tspan x="350" y="180">100%</tspan>
          </text>
          <text id="50%" font-family="Omnes-Regular, Omnes" font-size="15" font-weight="normal" fill="#000000">
            <tspan x="171" y="14">50%</tspan>
          </text>
          <text id="0%" font-family="Omnes-Regular, Omnes" font-size="15" font-weight="normal" fill="#000000">
            <tspan x="0" y="178">0%</tspan>
          </text>
        </g>
        <g id="needle" transform="translate(175.000000, 19.000000)">
            <polygon id="Triangle" fill="#3C3C3B" points="10 0 15 162 5 162"></polygon>
        </g>
      </g>
    </g>
  </g>
</svg>

<input type="range" id="percent" value="50" min="0" max="100">
$('#percent').on('input', function() {
  $('#Triangle')
    .attr('transform', 'rotate(' + percentToDegrees($(this).val()) + ', 10, 162)')
})

function percentToDegrees(percent) {
  var degrees = -90;
  var inc = 1.8;
  return degrees += (percent * inc);
}
input {
  display: block;
  margin: 50px auto;
}
#Page-1 text {
  font-family: Omnes-Regular, Omnes;
  font-size: 15px;
  font-weight: normal;
  fill: #000;
}