Как мне сделать мои подразделения, чтобы изменить цвет, когда они нажали? - PullRequest
0 голосов
/ 24 февраля 2020

Я делаю проект etch-a-sketch из проекта Odin, но столкнулся с проблемой. Я создал сетку и отобразил ее на экране, но я не могу найти способ сделать так, чтобы каждое поле меняло цвет при нажатии на него. Я перепробовал все способы, но все они приводят к исчезновению границы каждого элемента.

etch-a-sketch. html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8"/>
        <link rel="stylesheet" href="style.css" />
        <link rel="stylesheet" href="reset.css" />
    </head>
    <body>
        <div id="input">
            <form id="forrm" method="GET">
                <label for="size">Custom Size</label>
                <input id="size" type="text" name="size">
            </form>
        </div>
        <div id="container"></div>
        <script src="script.js"></script>
    </body>
</html>

style. css

#container {
    border: gray solid 1px;
    height: 500px;
    width: 500px;
    color: green;
    margin-left: auto;
    margin-right: auto;
    position: relative;
    margin-top: 30px;
    display: grid;
    grid-template-columns: repeat(16,1fr);
    grid-template-rows: repeat(16,1fr);

}


#input {
    display: block;
    text-align: center;
}

#forrm {

    margin-left: auto;
    margin-right: auto;


}

script. js

const cont = document.getElementById('container');
for (let a=0; a < 256; a++){ 
    let him = document.createElement('div');
    him.classList.add('divi');
    him.setAttribute('style','border : solid 1px gray;')
    cont.appendChild(him);    
}

Я должен сделать это с помощью js. Я попытался выбрать все деления в контейнере, затем выполнить итерацию каждого из них и добавить событие, подобное тому, но оно все еще не работает и приводит к исчезновению границ каждого div:

script. js

let gettin = document.querySelectorAll('divi');
gettin.ForEach((divi) , (e ) { 
   e.target.setAttribute('click' , 'background-color : blue'); 
});

Ответы [ 4 ]

0 голосов
/ 24 февраля 2020

Полагаю, вы хотите удалить цвет при повторном нажатии.

Добавить css для blue имя класса:

.blue{background: blue;}

Использовать classList.toggle('blue') при нажатии на div.

Лучше определить новую функцию, чем прикреплять встроенный JS к каждому div:

const cont = document.getElementById('container');
for (let a=0; a < 256; a++){ 
    let him = document.createElement('div');
    him.classList.add('divi');
    him.setAttribute('style','border : solid 1px gray;')
    cont.appendChild(him);    
}
let gettin = document.querySelectorAll('.divi');
gettin.forEach((e)=>{ 
   e.addEventListener("click",toblue);
});
function toblue(){
  this.classList.toggle('blue');
}
#container {
border: gray solid 1px;
height: 500px;
width: 500px;
color: green;
margin-left: auto;
margin-right: auto;
position: relative;
margin-top: 30px;
display: grid;
grid-template-columns: repeat(16,1fr);
grid-template-rows: repeat(16,1fr);

}


#input {
display: block;
text-align: center;
}

#forrm {

margin-left: auto;
margin-right: auto;
}
.blue{
background: blue;
}
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
    <link rel="stylesheet" href="style.css" />
    <link rel="stylesheet" href="reset.css" />
</head>
<body>
    <div id="input">
        <form id="forrm" method="GET">
            <label for="size">Custom Size</label>
            <input id="size" type="text" name="size">
        </form>
    </div>
    <div id="container"></div>
    <script src="script.js"></script>
</body>
</html>
0 голосов
/ 24 февраля 2020

Пожалуйста, обратитесь ниже код.

const cont = document.getElementById('container');
for (let a = 0; a < 256; a++) {
  let him = document.createElement('div');
  him.classList.add('divi');
  him.setAttribute('style', 'border : solid 1px gray;')
  cont.appendChild(him);
}

function setBackGroundColor() {
  this.style.backgroundColor = "blue";
}
let gettin = document.getElementsByClassName("divi");
for (var i = 0; i < gettin.length; i++) {
  gettin[i].addEventListener('click', setBackGroundColor);
}
#container {
  border: gray solid 1px;
  height: 500px;
  width: 500px;
  color: green;
  margin-left: auto;
  margin-right: auto;
  position: relative;
  margin-top: 30px;
  display: grid;
  grid-template-columns: repeat(16, 1fr);
  grid-template-rows: repeat(16, 1fr);
}

#input {
  display: block;
  text-align: center;
}

#forrm {
  margin-left: auto;
  margin-right: auto;
}
<div id="input">
  <form id="forrm" method="GET">
    <label for="size">Custom Size</label>
    <input id="size" type="text" name="size">
  </form>
</div>
<div id="container"> </div>
0 голосов
/ 24 февраля 2020

Вам нужно назначить функцию onClick для каждого div

const cont = document.getElementById('container');
for (let a = 0; a < 256; a++) {
  let him = document.createElement('div');
  him.classList.add('divi');
  him.setAttribute('style', 'border : solid 1px gray;')
  cont.appendChild(him);
}

let gettin = document.getElementsByClassName('divi');
for (var i = 0; i < gettin.length; i++){
  gettin[i].onclick = changeColor;
}

function changeColor(e){
  e.target.setAttribute('style', 'background-color : blue');
}
#container {
  border: gray solid 1px;
  height: 500px;
  width: 500px;
  color: green;
  margin-left: auto;
  margin-right: auto;
  position: relative;
  margin-top: 30px;
  display: grid;
  grid-template-columns: repeat(16, 1fr);
  grid-template-rows: repeat(16, 1fr);
}

#input {
  display: block;
  text-align: center;
}

#forrm {
  margin-left: auto;
  margin-right: auto;
}
<div id="input">
  <form id="forrm" method="GET">
    <label for="size">Custom Size</label>
    <input id="size" type="text" name="size">
  </form>
</div>

<div id="container"> </div>
0 голосов
/ 24 февраля 2020

Посмотрите документы для forEach .

forEach () вызывает предоставленную функцию обратного вызова один раз для каждого элемента в массиве по возрастанию order

Обратный вызов вызывается с тремя аргументами:

  • значение элемента
  • индекс элемента
  • объекта массива, который проходит

Для нашего примера нас интересует только первый аргумент: значение элемента .

Внутри обратного вызова мы имеем текущий элемент сохранен под меткой divi. Для каждого divi мы можем addEventListener для события click.

const cont = document.getElementById('container');
for (let a = 0; a < 256; a++) {
  let him = document.createElement('div');
  him.classList.add('divi');
  him.setAttribute('style', 'border : solid 1px gray;')
  cont.appendChild(him);
}


let gettin = document.querySelectorAll('.divi');
gettin.forEach(divi => {
  divi.addEventListener('click', e => {
    e.currentTarget.setAttribute('style', 'background-color : blue;')
  });
});
#container {
  border: gray solid 1px;
  height: 500px;
  width: 500px;
  color: green;
  margin-left: auto;
  margin-right: auto;
  position: relative;
  margin-top: 30px;
  display: grid;
  grid-template-columns: repeat(16, 1fr);
  grid-template-rows: repeat(16, 1fr);
}

#input {
  display: block;
  text-align: center;
}

#forrm {
  margin-left: auto;
  margin-right: auto;
}
<div id="input">
  <form id="forrm" method="GET">
    <label for="size">Custom Size</label>
    <input id="size" type="text" name="size">
  </form>
</div>

<div id="container"> </div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...