Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

203
Visualizações
¿Por qué mi ancho de cliente/100 es diferente de mi ancho en porcentaje?

Tengo un pequeño programa que cuando presionas ArrowDown, el círculo debe moverse hacia abajo desde su posición en la pantalla. El problema que tengo es que mi posicionamiento inicial para mi objeto de círculo svg establecido por cx: 5% y cy:5% es diferente a mi 5 * xshift y 5 * yshift que se derivan de document.getElementById("test").clientWidth /100 y document.getElementById("test").clientHeight/100 que creo que es una buena conversión a porcentaje. Sin embargo, cuando se ejecuta el programa, la flecha hacia abajo inicial corrige la ubicación inicial y crea una diferencia desplazada notable.

 var goal = {x: window.innerWidth, y: window.innerHeight} var xshift = document.getElementById("test").clientWidth/100 var yshift = document.getElementById("test").clientHeight/100 var player= {type:"Player", x:5 * xshift, y: 5 * yshift} document.addEventListener('keydown', function(event) { if (event.key === 'ArrowDown'){ player.y += yshift; if(player.y > (100 * yshift) -(9 * yshift)){ player.y = 91 * yshift; } //document.getElementById("UI").innerHTML = "Player position is x: " +player.x + " y: " + player.y; document.getElementById('circe').setAttribute("transform", 'translate('+player.x+","+player.y+")"); } }, true);
 <!DOCTYPE html> <html lang="en" dir="ltr"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Basic Snake Game</title> <style> html, body { margin: 0; padding: 0; border: 0; height: 100% } svg { position: absolute; margin: 0; padding: 0; border: 0; background-color: blueviolet; } </style> </head> <body> <!-- <h1 id="UI">Player position is x: 0 y: 0</h1> --> <svg id="test" width="100%" height="100%"> <circle id="circe" cx="5%" cy="5%" r="5%" stroke="green" stroke-width="0%" fill="yellow" transform="translate(0,0)" /> </svg> <script src="test.js"></script> </body> </html>

about 4 years ago · Juan Pablo Isaza
2 Respostas
Responde à pergunta

0

Son diferentes porque estás usando una transformación. La transformación se aplica sobre (además de) las coordenadas cx y cy .

En otras palabras, el círculo se está posicionando en:

 x = cx + translate.x = 5% + 5% y = cy + (n * translate.y) = 5% + (n * 5%)

Una forma de solucionar esto es olvidar el atributo de transform y simplemente actualizar los atributos cx y cy en su lugar. P.ej.

 document.getElementById('circe').setAttribute("cy", player.y);

Manifestación

 var goal = {x: window.innerWidth, y: window.innerHeight} var xshift = document.getElementById("test").clientWidth/100 var yshift = document.getElementById("test").clientHeight/100 var player= {type:"Player", x:5 * xshift, y: 5 * yshift} document.addEventListener('keydown', function(event) { if (event.key === 'ArrowDown'){ player.y += yshift; if(player.y > (100 * yshift) -(9 * yshift)){ player.y = 91 * yshift; } //document.getElementById("UI").innerHTML = "Player position is x: " +player.x + " y: " + player.y; document.getElementById('circe').setAttribute("cy", player.y); } }, true);
 html, body { margin: 0; padding: 0; border: 0; height: 100%; } svg { position: absolute; margin: 0; padding: 0; border: 0; background-color: blueviolet; }
 <!-- <h1 id="UI">Player position is x: 0 y: 0</h1> --> <svg id="test" width="100%" height="100%"> <circle id="circe" cx="5%" cy="5%" r="5%" stroke="green" stroke-width="0%" fill="yellow" transform="translate(0,0)" /> </svg>

about 4 years ago · Juan Pablo Isaza Relatório

0



Puede verificar el código completo desde: este violín , combiné sus piezas de código y agregué una sola línea.

`

 var goal = {x: window.innerWidth, y: window.innerHeight} var xshift = document.getElementById("test").clientWidth/100 var yshift = document.getElementById("test").clientHeight/100 var player= {type:"Player", x:5 * xshift, y: 5 * yshift} document.addEventListener('keydown', function(event) { if (event.key === 'ArrowDown'){ doShift(); } }, true); function doShift(){ player.y += yshift; if(player.y > (100 * yshift) -(9 * yshift)){ player.y = 91 * yshift; } //document.getElementById("UI").innerHTML = "Player position is x: " +player.x + " y: " + player.y; document.getElementById('circe').setAttribute("transform", 'translate('+player.x+","+player.y+")"); } //document.addEventListener("onready", ()=> doShift()); //document.ondomcontentready=doShift; doShift();

`;

Aunque parece un truco, el último doShift(); llamada crea el mismo efecto que cuando presiona el botón hacia abajo por primera vez: especifica lo que desea.

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda