Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Присвоение класса и передача свойств (https://javascript.ru/forum/dom-window/74557-prisvoenie-klassa-i-peredacha-svojjstv.html)

madeas 20.07.2018 15:49

Присвоение класса и передача свойств
 
Привет всем! Нужна помощь со скриптом.

Есть примерно 10 кнопок (могут добавляться), каждая из которых присваивает контейнеру с классом .bSm определенные свойства:

$('#1').click(function() {
  $('.bSm').toggleClass('one');
});
$('#2').click(function() {
  $('.bSm').toggleClass('two');
});
$('#3').click(function() {
  $('.bSm').toggleClass('three');
});
...


<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<style>
.bSm {
  display: block;
  background: #fff;
  width: 150px;
  height: 150px;
  border-radius: 8px;
  margin: 0 auto;
}
.two {
  width: 450px;
  height: 675px;
  border-radius: 38px;
}
.three {
  width: 267px;
  height: 553px;
  border-radius: 18px;
}
</style>
<div class="bSm"></div>

<button id="1"></button>
<button id="2"></button>
<button id="3"></button>
<button id="4"></button>
...

<div class="bSres"></div>



Проблема в том, что код получится большой, а при повторном нажатии любой кнопки, свойства откатываются до предыдущего нажатия.

Задача:
- сократить код (если это возможно)
- исправить нажатие кнопок
- вывести в контейнер с классом .bSres результат, т.е. все полученные параметры. Например, я составил контейнер <div class="bSm two three"></div>, то и в результате должны быть все параметры, а повторные (вроде width) заменялись на последние:

<div class="bSm two three"></div>
<style>
.bsm.two.three {
  display: block;
  background: #fff;
  width: 267px;
  height: 553px;
  border-radius: 18px;
  margin: 0 auto;
}
</style>

рони 20.07.2018 16:09

madeas,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  <script>
$(function() {
  var b = $('.btn'), cls = ["two","three"];
  b.click(function() {
  var i = b.index(this);
  $('.bSm').toggleClass(cls[i]);
});
});
  </script>
</head>

<body>
<style>
body{
    background-color: #EEE8AA;
}

.bSm {
  display: block;
  background: #fff;
  width: 150px;
  height: 150px;
  border-radius: 8px;
  margin: 0 auto;
}
.two {
  width: 450px;
  height: 675px;
  border-radius: 38px;
}
.three {
  width: 267px;
  height: 553px;
  border-radius: 18px;
}
</style>
<div class="bSm"></div>

<button  class="btn">2</button>
<button  class="btn">3</button>



<div class="bSres"></div>

</body>
</html>

laimas 20.07.2018 16:09

Может в массиве/объекте описать классы, которые и будут выбираться, тогда один обработчик на кнопки будет. Вот только как .toggleClass('one'), .toggleClass('two'), ... ведь в этом случае другие классы могут накапливаться.

рони, уже "законопатил". :)

рони 20.07.2018 16:11

madeas,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  <script>
$(function() {
  var b = $('.btn');
  b.click(function() {
  var cls = $(this).data("cls");
  $('.bSm').toggleClass(cls);
});
});
  </script>
</head>

<body>
<style>
body{
    background-color: #EEE8AA;
}

.bSm {
  display: block;
  background: #fff;
  width: 150px;
  height: 150px;
  border-radius: 8px;
  margin: 0 auto;
}
.two {
  width: 450px;
  height: 675px;
  border-radius: 38px;
}
.three {
  width: 267px;
  height: 553px;
  border-radius: 18px;
}
</style>
<div class="bSm"></div>

<button  class="btn" data-cls="two">2</button>
<button  class="btn" data-cls="three">3</button>



<div class="bSres"></div>

</body>
</html>

madeas 20.07.2018 16:21

рони,
у меня, все равно почему-то при нажатии на одну из кнопок, вторая не работает, пока не нажму снова на предыдущую. И еще вопрос, как вывести полученный результат в другой див?
10 кнопок в разных блоках по 5 шт. Т.е. 5 дают одни свойства, например размер, а другие 5 создают фон. И эти 5 - 5 должны между собой переключаться. А сейчас, если я правильно понял, они как бы складываются.

Вот: http://jsfiddle.net/k4cm2wnd/1/

рони 20.07.2018 17:38

Цитата:

Сообщение от madeas
у меня, все равно почему-то при нажатии на одну из кнопок, вторая не работает, пока не нажму снова на предыдущую.

Цитата:

Сообщение от laimas
Вот только как .toggleClass('one'), .toggleClass('two'), ... ведь в этом случае другие классы могут накапливаться.

:-?

рони 20.07.2018 17:43

madeas,
Цитата:

Сообщение от madeas
А сейчас, если я правильно понял, они как бы складываются.

если 5 классов одинаково приоритетных меняют ширину и все они присвоены элементу сработает первый добавленный
смотрите пост №9

Dilettante_Pro 20.07.2018 18:58

может, лучше работать со стилями?
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  <script>
$(function() {
  var b = $('.btn'), cls = {}, str = '';
  b.click(function() {
     cls = $(this).data("cls");
  $('.bSm').css(cls);
});
});
  </script>
</head>

<body>
<style>
body{
    background-color: #EEE8AA;
}

.bSm {
  display: block;
  background: #fff;
  width: 150px;
  height: 150px;
  border-radius: 8px;
  margin: 0 auto;
}

</style>

<button  class="btn" data-cls='{"width": "450px", "height": "675px", "border-radius": "38px"}'>1</button>
<button  class="btn" data-cls='{"width":"267px","height":"553px","border-radius":"18px"}'>2</button>
<button  class="btn" data-cls='{"background-color":"green"}'>5</button>
<button  class="btn" data-cls='{"background-color":"red"}'>6</button>
<div class="bSm"></div>
<div class="bSres"></div>

</body>
</html>

j0hnik 20.07.2018 19:47

Цитата:

Сообщение от рони
если 5 классов одинаково приоритетных меняют ширину и все они присвоены элементу сработает первый добавленный

самый нижний в теге style

j0hnik 20.07.2018 21:24

рони,
это не
Цитата:

Сообщение от рони
одинаково приоритетных

!important более приоритетный

<head>
    <title></title>
    <style>
        .gray
        {
            background-color: gray !important;
        }
    </style>
</head>
<body>
<div id="id1" style="background-color: red!important" class="gray">red</div>
</body>


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