Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   как сократить названия классов с общим началом в массиве (https://javascript.ru/forum/misc/69381-kak-sokratit-nazvaniya-klassov-s-obshhim-nachalom-v-massive.html)

Alessio18911 18.06.2017 23:09

Точно! Как это я не подумал... Хорошо, вот мой код. Он рабочий - в т.ч. я учёл Ваше замечание. Но думаю, что его можно сделать короче и красивее. Помогите, пожалуйста!
<body>
    <input type="radio" checked name="radio" id="radio1">
    <input type="radio" name="radio" id="radio2">
    <input type="radio" name="radio" id="radio3">
    <div class="page bg1">
      <div class="radio-controls">
        <label for="radio1"></label>
        <label for="radio2"></label>
        <label for="radio3"></label>
      </div>
    </div>
    <script>
      [js]var page = document.getElementsByClassName("page");
      var label = document.getElementsByTagName("label");
     
        label[0].addEventListener('click', function() {
          page[0].classList.remove("bg2");
          page[0].classList.remove("bg3");
          page[0].classList.add("bg1");
        });
        
        label[1].addEventListener('click', function() {
          page[0].classList.remove("bg3");
          page[0].classList.add("bg2");
        });
        
        label[2].addEventListener('click', function() {
          page[0].classList.remove("bg2");
          page[0].classList.add("bg3");
        });[/js]
    </script>    
  </body>


body {
  background-color: white;
  font-family: "Open Sans", sans-serif;
  padding: 5px 25px;
  font-size: 18px;
  margin: 0;
  color: #444;
}

h1 {
  font-family: "Merriweather", serif;
  font-size: 32px;
}

input {
  display: none;
}

.page {
  position: relative;
  width: 400px;
  height: 250px;
  outline: 1px solid orange;
}

.bg1 {
  background-image: url("Gora-400x250.jpg");
}

.bg2 {
  background-image: url("IMG_0863m.jpg");
}

.bg3 {
  background-image: url("Torosskie-goryi-400x250.jpg");
}

.radio-controls {
  position: absolute;
  bottom: 0;
  left: 50%;
  margin-left: -55px;
  width: 110px;
  height: 50px;
  text-align: center;
  line-height: 65px;
  outline: 1px solid red;
}

label {
  display: inline-block;
  width: 20px;
  height: 20px;
  background-color: dodgerblue;
  background-clip: padding-box;
  border: 5px solid transparent;
  border-radius: 50%;
  box-shadow: 0 0 2px 1px dodgerblue;
}

#radio1:checked ~ .page label[for="radio1"],
#radio2:checked ~ .page label[for="radio2"],
#radio3:checked ~ .page label[for="radio3"] {
  background-color: red;
  box-shadow: 0 0 2px 1px red;
}

рони 18.06.2017 23:14

Alessio18911,
:-?
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
.page {
  position: relative;
  width: 400px;
  height: 250px;
  outline: 1px solid orange;
  background-size: cover;
   background-repeat: no-repeat;
}

.bg1 {
  background-image: url("http://hd4desktop.online/images/m/a-squirrel-408002.jpg");
}

.bg2 {
  background-image: url("http://www.nicefotos.ru/img/picture/May/30/f5cc5821bbc50c0920bc86fa65d9cb4c/mini_1.jpg");
}

.bg3 {
  background-image: url("http://cybercomnet.fr/www/wallpaper/_data/i/galleries/Animaux/Lapin/Lapin-8-cu_s9999x200.jpg");
}

.radio-controls {
  position: absolute;
  bottom: 0;
  left: 50%;
  margin-left: -55px;
  width: 110px;
  height: 50px;
  text-align: center;
  line-height: 65px;
  outline: 1px solid red;
}

label {
  display: inline-block;
  width: 20px;
  height: 20px;
  background-color: dodgerblue;
  background-clip: padding-box;
  border: 5px solid transparent;
  border-radius: 50%;
  box-shadow: 0 0 2px 1px dodgerblue;
}

  </style>


  <script>
window.addEventListener('DOMContentLoaded', function() {
 var page = document.querySelector('.page'),
     label = page.querySelectorAll('label');
 [].forEach.call(label, function(item, i) {
         item.addEventListener('click', function() {
            page.className = "page bg"+ (i+1)
         });
     });
    });
  </script>
</head>

<body>
<div class="page bg1">
 <div class="radio-controls">
 <label class="label" for="radio1"></label>
 <label class="label" for="radio2"></label>
 <label class="label" for="radio3"></label>
 </div>
 </div>

</body>
</html>

Alessio18911 18.06.2017 23:24

Очень красиво получилось, спасибо!:) А Вы могли бы мне пояснить некоторые детали:
1. Для чего нам DOMContentLoaded?
2. В строке 58 - почему в скобках именно .page label, а не просто label?
3. В строке 59 - что значат квадратные скобки в самом начале?
4. Как вообще работает эта функция [].forEach.call.....?
5. Что подключено самым первым скриптом?

j0hnik 18.06.2017 23:31

Цитата:

Сообщение от Alessio18911 (Сообщение 455841)
Очень красиво получилось, спасибо!:) А Вы могли бы мне пояснить некоторые детали:
1. Для чего нам DOMContentLoaded?
2. В строке 58 - почему в скобках именно .page label, а не просто label?
3. В строке 59 - что значат квадратные скобки в самом начале?
4. Как вообще работает эта функция [].forEach.call.....?
5. Что подключено самым первым скриптом?

1) Для того чтобы выполнять скрипт по загрузке DOM
Это не обязательно если перенести скрипт в конец документа перед </Body>
2) можно и просто label но тогда это будет относиться ко всем label а не только с классом page.
3) https://developer.mozilla.org/en-US/...Each?v=example квадратные скобки пустой литерал массива
4) https://developer.mozilla.org/en-US/...Each?v=example
5. походу был jquery который рони грохнул.

Alessio18911 18.06.2017 23:35

Ага. Теперь всё ясно. Очень благодарен всем! :)

рони 18.06.2017 23:36

Alessio18911,
5. уже ничего
1. чтобы скрипт работал из любого места страницы, а не только после слайда.
2. исправил.
3.4. https://learn.javascript.ru/traversi...массивы в основном чтобы сохранить i (усовершенствованный for)

Alessio18911 18.06.2017 23:39

Рони, спасибо большое за разъяснение и помощь!

Alessio18911 19.06.2017 00:24

Рони, хочу уточнить такую вещь ещё: методы querySelector - возвращает одно значение, querySelectorAll - массив. В то же время методы, которые начинаются с getElementsBy - только массивы, правильно? А всё же, что лучше использовать для поиска элементов - querySelector/querySelectorAll или getElementsBy...?

рони 19.06.2017 00:30

Alessio18911,
псевдомассивы!!! а getElementsBy живые коллекции (значение будет менятся, всегда актуально) , querySelectorAll - срез на момент поиска (коллекция неизменна)

рони 19.06.2017 00:37

Alessio18911,
особого значения не имеет как искать, если найденное тут же используется и структура найденного неизменна. (ничего не удалили или не добавили), если меняется то предпочтительнее querySelectorAll


Часовой пояс GMT +3, время: 09:39.