Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 18.06.2017, 23:09
Аспирант
Отправить личное сообщение для Alessio18911 Посмотреть профиль Найти все сообщения от Alessio18911
 
Регистрация: 18.06.2017
Сообщений: 87

Точно! Как это я не подумал... Хорошо, вот мой код. Он рабочий - в т.ч. я учёл Ваше замечание. Но думаю, что его можно сделать короче и красивее. Помогите, пожалуйста!
<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;
}
Ответить с цитированием
  #12 (permalink)  
Старый 18.06.2017, 23:14
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,108

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>

Последний раз редактировалось рони, 18.06.2017 в 23:32. Причина: убрал jquery
Ответить с цитированием
  #13 (permalink)  
Старый 18.06.2017, 23:24
Аспирант
Отправить личное сообщение для Alessio18911 Посмотреть профиль Найти все сообщения от Alessio18911
 
Регистрация: 18.06.2017
Сообщений: 87

Очень красиво получилось, спасибо! А Вы могли бы мне пояснить некоторые детали:
1. Для чего нам DOMContentLoaded?
2. В строке 58 - почему в скобках именно .page label, а не просто label?
3. В строке 59 - что значат квадратные скобки в самом начале?
4. Как вообще работает эта функция [].forEach.call.....?
5. Что подключено самым первым скриптом?
Ответить с цитированием
  #14 (permalink)  
Старый 18.06.2017, 23:31
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

Сообщение от Alessio18911 Посмотреть сообщение
Очень красиво получилось, спасибо! А Вы могли бы мне пояснить некоторые детали:
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 который рони грохнул.
Ответить с цитированием
  #15 (permalink)  
Старый 18.06.2017, 23:35
Аспирант
Отправить личное сообщение для Alessio18911 Посмотреть профиль Найти все сообщения от Alessio18911
 
Регистрация: 18.06.2017
Сообщений: 87

Ага. Теперь всё ясно. Очень благодарен всем!
Ответить с цитированием
  #16 (permalink)  
Старый 18.06.2017, 23:36
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,108

Alessio18911,
5. уже ничего
1. чтобы скрипт работал из любого места страницы, а не только после слайда.
2. исправил.
3.4. https://learn.javascript.ru/traversi...массивы в основном чтобы сохранить i (усовершенствованный for)
Ответить с цитированием
  #17 (permalink)  
Старый 18.06.2017, 23:39
Аспирант
Отправить личное сообщение для Alessio18911 Посмотреть профиль Найти все сообщения от Alessio18911
 
Регистрация: 18.06.2017
Сообщений: 87

Рони, спасибо большое за разъяснение и помощь!
Ответить с цитированием
  #18 (permalink)  
Старый 19.06.2017, 00:24
Аспирант
Отправить личное сообщение для Alessio18911 Посмотреть профиль Найти все сообщения от Alessio18911
 
Регистрация: 18.06.2017
Сообщений: 87

Рони, хочу уточнить такую вещь ещё: методы querySelector - возвращает одно значение, querySelectorAll - массив. В то же время методы, которые начинаются с getElementsBy - только массивы, правильно? А всё же, что лучше использовать для поиска элементов - querySelector/querySelectorAll или getElementsBy...?
Ответить с цитированием
  #19 (permalink)  
Старый 19.06.2017, 00:30
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,108

Alessio18911,
псевдомассивы!!! а getElementsBy живые коллекции (значение будет менятся, всегда актуально) , querySelectorAll - срез на момент поиска (коллекция неизменна)
Ответить с цитированием
  #20 (permalink)  
Старый 19.06.2017, 00:37
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,108

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как передать данные из json в названия параметров shultz1988 Общие вопросы Javascript 2 20.07.2011 11:15
Уникальность элементов в массиве - как? .andreev Общие вопросы Javascript 2 14.11.2010 15:03
Получение данных из тега в массиве, как? Madd Общие вопросы Javascript 37 06.07.2010 00:59
Как определить количество элементов в многомерном массиве Dima00782 Общие вопросы Javascript 3 12.06.2010 14:15
Как найти индекс по элементу в двумерном массиве? bayah Общие вопросы Javascript 5 22.04.2010 16:26