jquery 如何在HTML和CSS中使两个滚动条共享对角线图中红色球的相同左侧位置?

jxct1oxe  于 2023-05-28  发布在  jQuery
关注(0)|答案(1)|浏览(190)

我有HTML和CSS的问题。我需要做一个图表,其中红球上下对角,它必须遵循蓝线的X位置(此元素只向左或向右移动)。问题是滚动条1和2共享红球的左侧位置。。因此,它结束了buggy和他们回到位置的百分比,他们各自的滚动条。我如何使他们两个共享相同的左边位置的红球?

  1. document.addEventListener("DOMContentLoaded", function () {
  2. const scrollBar1 = document.getElementById("scroll-bar1");
  3. const scrollBar2 = document.getElementById("scroll-bar2");
  4. const scrollBar3 = document.getElementById("scroll-bar3");
  5. const scrollBar4 = document.getElementById("scroll-bar4");
  6. const scrollBar5 = document.getElementById("scroll-bar5");
  7. const scrollBar6 = document.getElementById("scroll-bar6");
  8. const redBall = document.getElementById("red-ball");
  9. const blueLine = document.getElementById("blue-line");
  10. let leftBall
  11. scrollBar1.addEventListener("input", function() {
  12. // Verifica se o valor da scroll bar 1 foi alterado
  13. if (scrollBar1.value !== scrollBar1.previousValue) {
  14. const xPercentage = (scrollBar1.value - 100) / (200 - 100);
  15. const xPosition = xPercentage * 100;
  16. leftBall = xPosition
  17. redBall.style.left = `${leftBall}%`;
  18. // Atualiza a posição da bola vermelha na vertical (scroll bar 1)
  19. const yPercentage = (scrollBar1.value - 100) / (200 - 100);
  20. const yPosition = yPercentage * 100;
  21. redBall.style.top = `${yPosition}%`;
  22. console.log(redBall.style.left)
  23. }
  24. });
  25. scrollBar2.addEventListener("input", function() {
  26. // Verifica se o valor da scroll bar 1 foi alterado
  27. if (scrollBar2.value !== scrollBar2.previousValue) {
  28. const blueLinePercentage = (scrollBar2.value - 400) / (0 - 400);
  29. const blueLinePosition = blueLinePercentage * 100;
  30. //leftBall = blueLinePosition
  31. blueLine.style.left = `${80 - blueLinePosition}%`;
  32. redBall.style.left = `${100-blueLinePosition}%`;
  33. console.log(redBall.style.left)
  34. }
  35. });
  36. });
  1. .container {
  2. text-align: center;
  3. }
  4. #chart {
  5. position: relative;
  6. width: 450px;
  7. height: 450px;
  8. margin: 0 auto;
  9. background-color: #f2f2f2;
  10. border: 1px solid #ccc;
  11. }
  12. #red-ball {
  13. position: absolute;
  14. top: 50%;
  15. left: 50%;
  16. transform: translate(-50%, -50%);
  17. width: 20px;
  18. height: 20px;
  19. background-color: red;
  20. border-radius: 50%;
  21. transform: rotate(45deg);
  22. }
  23. #black-line {
  24. position: absolute;
  25. top: 50%;
  26. left: 30%;
  27. transform: translateY(-50%, -50%);
  28. width: 40%;
  29. height: 2px;
  30. background-color: black;
  31. transform: rotate(45deg);
  32. }
  33. #blue-line {
  34. position: absolute;
  35. top: 50%;
  36. left: 30%;
  37. transform: translateY(-50%, -50%);
  38. width: 40%;
  39. height: 2px;
  40. background-color: blue;
  41. transform: rotate(45deg);
  42. }
  43. #x-axis {
  44. position: absolute;
  45. bottom: -20px;
  46. left: 0;
  47. width: 100%;
  48. display: flex;
  49. justify-content: space-between;
  50. }
  51. #y-axis {
  52. position: absolute;
  53. top: 0;
  54. left: -30px;
  55. height: 100%;
  56. display: flex;
  57. flex-direction: column;
  58. justify-content: space-between;
  59. }
  60. .axis-label {
  61. font-size: 12px;
  62. }
  63. .scroll-bar {
  64. margin: 20px auto;
  65. width: 400px;
  66. display: flex;
  67. align-items: center;
  68. }
  69. .scroll-bar input[type="range"] {
  70. flex-grow: 1;
  71. }
  72. .scroll-bar-value {
  73. margin-left: 10px;
  74. font-size: 12px;
  75. }
  1. <!DOCTYPE html>
  2. <html lang="pt-br">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Gráfico de Demanda por Carne Moída</title>
  8. <link rel="stylesheet" type="text/css" href="styles.css">
  9. </head>
  10. <body>
  11. <div class="container">
  12. <h1>Gráfico de Demanda por Carne Moída</h1>
  13. <div id="chart">
  14. <div id="red-ball"></div>
  15. <div id="black-line"></div>
  16. <div id="blue-line"></div>
  17. <div id="x-axis">
  18. <span class="axis-label">6,292</span>
  19. <span class="axis-label">10,292</span>
  20. <span class="axis-label">14,292</span>
  21. </div>
  22. <div id="y-axis">
  23. <span class="axis-label">90</span>
  24. <span class="axis-label">140</span>
  25. <span class="axis-label">190</span>
  26. </div>
  27. </div>
  28. <div class="scroll-bar">
  29. <input type="range" id="scroll-bar1" min="100" max="200" value="150">
  30. <span id="scroll-bar-value1" class="scroll-bar-value"></span>
  31. </div>
  32. <div class="scroll-bar">
  33. <input type="range" id="scroll-bar2" min="0" max="400" value="200">
  34. <span id="scroll-bar-value2" class="scroll-bar-value"></span>
  35. </div>
  36. <div class="scroll-bar">
  37. <input type="range" id="scroll-bar3" min="100" max="300" value="200">
  38. <span id="scroll-bar-value3" class="scroll-bar-value"></span>
  39. </div>
  40. <div class="scroll-bar">
  41. <input type="range" id="scroll-bar4" min="100" max="400" value="180">
  42. <span id="scroll-bar-value4" class="scroll-bar-value"></span>
  43. </div>
  44. <div class="scroll-bar">
  45. <input type="range" id="scroll-bar5" min="10" max="200" value="30">
  46. <span id="scroll-bar-value5" class="scroll-bar-value"></span>
  47. </div>
  48. <div class="scroll-bar">
  49. <input type="range" id="scroll-bar6" min="0" max="200" value="100">
  50. <span id="scroll-bar-value6" class="scroll-bar-value"></span>
  51. </div>
  52. </div>
  53. <script src="script.js"></script>
  54. </body>
  55. </html>
gcxthw6b

gcxthw6b1#

在同一个回调函数中管理所有的变量,这让我更清楚地了解了这个问题。
这并不容易,但我想我做到了:

  1. document.addEventListener("DOMContentLoaded", function () {
  2. const scrollBar1 = document.getElementById("scroll-bar1");
  3. const scrollBar2 = document.getElementById("scroll-bar2");
  4. const scrollBar3 = document.getElementById("scroll-bar3");
  5. const scrollBar4 = document.getElementById("scroll-bar4");
  6. const scrollBar5 = document.getElementById("scroll-bar5");
  7. const scrollBar6 = document.getElementById("scroll-bar6");
  8. const redBall = document.getElementById("red-ball");
  9. const blueLine = document.getElementById("blue-line");
  10. scrollBar1.addEventListener("input", updatePos);
  11. scrollBar2.addEventListener("input", updatePos);
  12. function updatePos(){
  13. const xPercentage = (scrollBar1.value - 100) / (200 - 100);
  14. const xPosition = xPercentage * 100;
  15. let leftBall = xPosition+20;
  16. // Atualiza a posição da bola vermelha na vertical (scroll bar 1)
  17. const yPercentage = (scrollBar1.value - 100) / (200 - 100);
  18. const yPosition = yPercentage * 100;
  19. const blueLinePercentage = (scrollBar2.value - 400) / (0 - 400);
  20. const blueLinePosition = blueLinePercentage * 100;
  21. leftBall -= blueLinePosition-30;
  22. redBall.style.top = `${yPosition}%`;
  23. redBall.style.left = `${leftBall}%`;
  24. blueLine.style.left = `${80 - blueLinePosition}%`;
  25. }
  26. });
  1. .container {
  2. text-align: center;
  3. }
  4. #chart {
  5. position: relative;
  6. width: 450px;
  7. height: 450px;
  8. margin: 0 auto;
  9. background-color: #f2f2f2;
  10. border: 1px solid #ccc;
  11. }
  12. #red-ball {
  13. position: absolute;
  14. top: 50%;
  15. left: 50%;
  16. transform: translate(-50%, -50%);
  17. width: 20px;
  18. height: 20px;
  19. background-color: red;
  20. border-radius: 50%;
  21. transform: rotate(45deg);
  22. }
  23. #black-line {
  24. position: absolute;
  25. top: 50%;
  26. left: 30%;
  27. transform: translateY(-50%, -50%);
  28. width: 40%;
  29. height: 2px;
  30. background-color: black;
  31. transform: rotate(45deg);
  32. }
  33. #blue-line {
  34. position: absolute;
  35. top: 50%;
  36. left: 30%;
  37. transform: translateY(-50%, -50%);
  38. width: 40%;
  39. height: 2px;
  40. background-color: blue;
  41. transform: rotate(45deg);
  42. }
  43. #x-axis {
  44. position: absolute;
  45. bottom: -20px;
  46. left: 0;
  47. width: 100%;
  48. display: flex;
  49. justify-content: space-between;
  50. }
  51. #y-axis {
  52. position: absolute;
  53. top: 0;
  54. left: -30px;
  55. height: 100%;
  56. display: flex;
  57. flex-direction: column;
  58. justify-content: space-between;
  59. }
  60. .axis-label {
  61. font-size: 12px;
  62. }
  63. .scroll-bar {
  64. margin: 20px auto;
  65. width: 400px;
  66. display: flex;
  67. align-items: center;
  68. }
  69. .scroll-bar input[type="range"] {
  70. flex-grow: 1;
  71. }
  72. .scroll-bar-value {
  73. margin-left: 10px;
  74. font-size: 12px;
  75. }
  1. <!DOCTYPE html>
  2. <html lang="pt-br">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Gráfico de Demanda por Carne Moída</title>
  8. <link rel="stylesheet" type="text/css" href="styles.css">
  9. </head>
  10. <body>
  11. <div class="container">
  12. <h1>Gráfico de Demanda por Carne Moída</h1>
  13. <div id="chart">
  14. <div id="red-ball"></div>
  15. <div id="black-line"></div>
  16. <div id="blue-line"></div>
  17. <div id="x-axis">
  18. <span class="axis-label">6,292</span>
  19. <span class="axis-label">10,292</span>
  20. <span class="axis-label">14,292</span>
  21. </div>
  22. <div id="y-axis">
  23. <span class="axis-label">90</span>
  24. <span class="axis-label">140</span>
  25. <span class="axis-label">190</span>
  26. </div>
  27. </div>
  28. <div class="scroll-bar">
  29. <input type="range" id="scroll-bar1" min="100" max="200" value="150">
  30. <span id="scroll-bar-value1" class="scroll-bar-value"></span>
  31. </div>
  32. <div class="scroll-bar">
  33. <input type="range" id="scroll-bar2" min="0" max="400" value="200">
  34. <span id="scroll-bar-value2" class="scroll-bar-value"></span>
  35. </div>
  36. <div class="scroll-bar">
  37. <input type="range" id="scroll-bar3" min="100" max="300" value="200">
  38. <span id="scroll-bar-value3" class="scroll-bar-value"></span>
  39. </div>
  40. <div class="scroll-bar">
  41. <input type="range" id="scroll-bar4" min="100" max="400" value="180">
  42. <span id="scroll-bar-value4" class="scroll-bar-value"></span>
  43. </div>
  44. <div class="scroll-bar">
  45. <input type="range" id="scroll-bar5" min="10" max="200" value="30">
  46. <span id="scroll-bar-value5" class="scroll-bar-value"></span>
  47. </div>
  48. <div class="scroll-bar">
  49. <input type="range" id="scroll-bar6" min="0" max="200" value="100">
  50. <span id="scroll-bar-value6" class="scroll-bar-value"></span>
  51. </div>
  52. </div>
  53. <script src="script.js"></script>
  54. </body>
  55. </html>
展开查看全部

相关问题