如何实时影响滑块?

发布于 2025-02-13 08:47:00 字数 990 浏览 3 评论 0原文

基本上,我想在顶部有一个滑块,可以实时影响画布(例如圆的半径)中的某些值。

这就是我到目前为止的目标,它确实可以完成我想要的,除了我希望它移动滑块而不是必须按钮时改变。

<input type="range" id="MySldr" value="15" min="1" max="100">

<button class="Btn">Draw</button>

<canvas class="result"></canvas>

<script>

    let Btn = document.querySelector(".Btn");

    Btn.addEventListener("click", () => {

        let res = document.querySelector(".result");
        var ctx = res.getContext("2d");
                    
        let SldrVal = document.getElementById("MySldr").value;

        ctx.clearRect(0, 0, 1000, 1000);
        ctx.beginPath();
        ctx.arc(125, 125, SldrVal, 0, 2 * Math.PI);
        ctx.stroke();
        ctx.font = "30px Arial";
        ctx.fillText(SldrVal, 10, 50);
    });

</script>

jsfiddle

我是JS的新手,非常简单,非常简单答案会很好,但是任何事情都值得赞赏。

Basically, I want to have a slider at the top that can affect some value in the canvas, like the radius of a circle, in real-time.

This is what I have so far, it does exactly what I want, except I want it to change as you move the slider instead of having to push the button.

<input type="range" id="MySldr" value="15" min="1" max="100">

<button class="Btn">Draw</button>

<canvas class="result"></canvas>

<script>

    let Btn = document.querySelector(".Btn");

    Btn.addEventListener("click", () => {

        let res = document.querySelector(".result");
        var ctx = res.getContext("2d");
                    
        let SldrVal = document.getElementById("MySldr").value;

        ctx.clearRect(0, 0, 1000, 1000);
        ctx.beginPath();
        ctx.arc(125, 125, SldrVal, 0, 2 * Math.PI);
        ctx.stroke();
        ctx.font = "30px Arial";
        ctx.fillText(SldrVal, 10, 50);
    });

</script>

JSFiddle

I'm fairly new to JS and self-taught so simple answers would be nice but anything is appreciated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

浅黛梨妆こ 2025-02-20 08:47:02

这不是事件,而是演示了一个称为“游戏循环”的事情。非常适合动画移动的事物。 requestAnimationFrame就像下一个动画框架的settimeout(这样它将平滑)。每秒大约60次。

let canvas = document.querySelector(".result");
var ctx = canvas.getContext("2d");

function drawRect() {
  let SldrVal = document.getElementById("MySldr").value;
  //ctx.strokeStyle = "#305ef2";
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  ctx.beginPath();
  ctx.arc(canvas.width / 2, canvas.height / 2, SldrVal, 0, 2 * Math.PI);
  ctx.stroke();
  ctx.font = "30px Arial";
  ctx.fillText(SldrVal, 10, 50);

  requestAnimationFrame(drawRect)
}

drawRect()
<input type="range" id="MySldr" value="15" min="1" max="100">
<br>
<canvas class="result" width="400" height="200"></canvas>

This, instead of events, demonstrates a thing call "the game loop". Great for animating things that moves. The requestAnimationFrame is like a setTimeout for the next animation frame (so it'll be smooth). It's about 60 times per second.

let canvas = document.querySelector(".result");
var ctx = canvas.getContext("2d");

function drawRect() {
  let SldrVal = document.getElementById("MySldr").value;
  //ctx.strokeStyle = "#305ef2";
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  ctx.beginPath();
  ctx.arc(canvas.width / 2, canvas.height / 2, SldrVal, 0, 2 * Math.PI);
  ctx.stroke();
  ctx.font = "30px Arial";
  ctx.fillText(SldrVal, 10, 50);

  requestAnimationFrame(drawRect)
}

drawRect()
<input type="range" id="MySldr" value="15" min="1" max="100">
<br>
<canvas class="result" width="400" height="200"></canvas>

相思碎 2025-02-20 08:47:02

您可以在输入范围元素上收听更改事件。

document.getElementById("MySldr").addEventListener('change', (event) => {
    let value = event.target.value; // value of the range slider
    // your code here
})

You can listen for change event on the input range element.

document.getElementById("MySldr").addEventListener('change', (event) => {
    let value = event.target.value; // value of the range slider
    // your code here
})
兔姬 2025-02-20 08:47:02

除非您需要/需要您的程序不断重新绘制,否则您不需要requestAnimationFrame()。我也看不到每个帧刷新元素的重点。您可以在eventlistener上使用输入进行实时输入。

let mySldr = document.getElementById("MySldr");
let res = document.querySelector(".result");
let ctx = res.getContext("2d");

mySldr.addEventListener("input", () => {
  val = mySldr.value
  ctx.clearRect(0, 0, 1000, 1000);
  ctx.beginPath();
  ctx.arc(125, 125, val, 0, 2 * Math.PI);
  ctx.stroke();
  ctx.font = "30px Arial";
  ctx.fillText(val, 10, 50);
});
<input type="range" id="MySldr" value="15" min="1" max="100">
<canvas class="result"></canvas>

Unless you want/need your program to be constantly redrawing you don't need requestAnimationFrame(). I also don't see the point in getting the element every frame refresh. You can use input on your eventListener for live inputs.

let mySldr = document.getElementById("MySldr");
let res = document.querySelector(".result");
let ctx = res.getContext("2d");

mySldr.addEventListener("input", () => {
  val = mySldr.value
  ctx.clearRect(0, 0, 1000, 1000);
  ctx.beginPath();
  ctx.arc(125, 125, val, 0, 2 * Math.PI);
  ctx.stroke();
  ctx.font = "30px Arial";
  ctx.fillText(val, 10, 50);
});
<input type="range" id="MySldr" value="15" min="1" max="100">
<canvas class="result"></canvas>

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文