【问题标题】:Vanilla Javascript: How to make cells multiple different colours on a grid with user colour inputVanilla Javascript:如何使用用户颜色输入在网格上制作多种不同颜色的单元格
【发布时间】:2018-09-08 04:20:33
【问题描述】:

我正在构建什么

大家好!我正在构建一个 Pixel Art Maker。

它基本上是一个网格,当你点击它时,网格上的每个单元格都会改变颜色。

这是一个应该允许在同一画布上使用不同颜色的应用程序。

问题:

如何通过用户选择的颜色输入在同一个网格上允许多种不同的颜色?

例如,我知道如何让它全黑(目前是硬编码的),但如果我想添加更多颜色,我该怎么做?

JS Fiddle 演示

https://jsfiddle.net/JayS5/foznjb2m/

JS 代码

const canvas = document.querySelector('#pixelCanvas')

const tbody = document.createElement('tbody');

canvas.addEventListener('click', function(e){
  e.target.style.background = 'black';
});

canvas.addEventListener('dblclick', function(e){
  e.target.style.backgroundColor = 'white';
});

// Store the value of columns
const column = document.getElementById('column');

// Store the value of rows
const row = document.getElementById('row');

// Access forms
const submitForm = document.querySelector('#submitForm');

submitForm.addEventListener('submit', function(e){
  e.preventDefault();  // Prevents the submit button from refreshing the page by default
  tbody.innerHTML = "";

  // Color picker

  const colorPicker = document.createElement('div');
  colorPicker.setAttribute("id", "ActiveColor")

  colorPicker.innerHTML = '<input type="color" id="head" name="color" value="#e66465"/>';

  document.body.appendChild(colorPicker);

  // Generate grid

  for (r = 0; r < row.value; r++) {
    const tr = document.createElement('tr');
    tbody.appendChild(tr);
    for (c = 0; c < column.value; c++) {
      const td = document.createElement('td');
      tr.appendChild(td);
    } 
    canvas.appendChild(tbody);  
  }
});

【问题讨论】:

    标签: javascript colors color-picker


    【解决方案1】:

    最好将颜色选择器输入元素放在开头的HTML中,这样您就可以在顶层选择它而无需重新分配。提交表单后,使其可见。然后,单击时,只需访问该元素的 value 并将其分配给 background 属性:

    const colorInput = document.querySelector('input[type="color"]');
    canvas.addEventListener('click', function(e) {
      e.target.style.background = colorInput.value;
    });
    

    const canvas = document.querySelector('#pixelCanvas')
    const tbody = document.createElement('tbody');
    const colorInput = document.querySelector('input[type="color"]');
    canvas.addEventListener('click', function(e) {
      e.target.style.background = colorInput.value;
    });
    
    canvas.addEventListener('dblclick', function(e) {
      e.target.style.backgroundColor = 'white';
    });
    
    
    const column = document.getElementById('column');
    const row = document.getElementById('row');
    const submitForm = document.querySelector('#submitForm');
    
    submitForm.addEventListener('submit', function(e) {
      e.preventDefault(); // Prevents the submit button from refreshing the page by default
      colorInput.style.display = 'inline';
      tbody.innerHTML = "";
      // Generate grid
    
      for (r = 0; r < row.value; r++) {
        const tr = document.createElement('tr');
        tbody.appendChild(tr);
        for (c = 0; c < column.value; c++) {
          const td = document.createElement('td');
          tr.appendChild(td);
        }
        canvas.appendChild(tbody);
      }
    });
    /**
     * index.scss
     * - Add any styles you want here!
     */
    
    body {
      background: #f5f5f5;
    }
    
    table,
    thead,
    tbody,
    tfoot,
    tr,
    td {
      border-collapse: collapse;
      border: 3px solid black;
    }
    
    td {
      width: 30px;
    }
    
    tr {
      height: 30px;
    }
    input[type="color"] {
      display: none;
    }
    <h1>
      Pixel Art Maker</h1>
    
    <fieldset>
      <legend>Grid Size</legend>
    
      <form id='submitForm'>
    
        <label for="height">Columns:</label>
        <input type="number" id="column" placeholder="Key in an integer" step="1" />
    
        <label for="width">Rows:</label>
        <input type="number" id="row" placeholder="Min: 1, max: 100" min="1" max="100" />
    
        <div>
          <input type="submit" id="submit" value="Submit" />
        </div>
      </form>
    </fieldset>
    
    <br>
    
    <br>
    
    <div>
      <table id="pixelCanvas">
        <!--  Dynamic pixel canvas  -->
      </table>
    </div>
    <div>
      <input type="color" value="#e66465" />
    </div>

    【讨论】:

    • 我只有几个问题,因为我不太了解解决方案的工作原理。这些线是什么意思?让颜色选择器输入;和 colorInput.style.display = 'inline'; .我也一直在寻找这个特定行的文档,但我不知道它叫什么:('input[type="color"]')
    • let colorPickerInput 来自一个我后来没有使用的测试变量,我忘了删除它。 'input[type="color"]' 称为选择器字符串。你可以阅读选择器on MDN。该字符串表示选择input 元素,该元素具有属性type,其值为color。 (当然,如果您愿意,可以随意使用 ID)
    • 非常感谢您的澄清!干杯:)
    【解决方案2】:

    您可以添加事件 onchange 并将颜色写入全局变量颜色

      colorPicker.onchange = function (e) {
        color = e.target.value
      }
    

    Full code

    【讨论】:

      猜你喜欢
      • 2018-05-04
      • 1970-01-01
      • 2021-01-02
      • 2014-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多