Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Добавить параметр в css (https://javascript.ru/forum/dom-window/73770-dobavit-parametr-v-css.html)

madeas 13.05.2018 19:07

Добавить параметр в css
 
Здравствуйте!
Я в js не очень силен, поэтому вопрос к мастерам. Можно ли при помощи js добавить еще один параметр внутрь css?
Поясню.

Есть блок с классом .block-1, которому в стилях прописано свойство:
box-shadow: 10px 20px 30px blue;

Вопрос. Можно ли при помощи скрипта, не зная основных значений свойства (этих - 10px 20px 30px), задать еще параметр inset?

Я могу сделать так:
[].forEach.call(document.querySelectorAll('[class*="block-1"]'), function(node) {
       node.style.boxShadow = "inset 10px 20px 30px blue;"
});

но для этого мне придется задать значения целиком. А надо чтобы можно было делать не затрагивая их.

Сейчас есть:
<style>
.block-1 {
box-shadow: 10px 20px 30px blue;
}
</stele>
<div class="block-1"></div>


Надо чтобы:
<style>
.block-1 {
box-shadow: inset 10px 20px 30px blue;
}
</stele>
<div class="block-1"></div>

j0hnik 13.05.2018 19:24

[].forEach.call(document.querySelectorAll('[class*="block-1"]'), function(node) {
	var bsh = getComputedStyle(node).boxShadow;
	node.style.boxShadow = "inset "+bsh;
});

рони 13.05.2018 19:25

madeas,
[].forEach.call(document.querySelectorAll('[class*="block-1"]'), function(node) {
       node.style.boxShadow = "inset " + getComputedStyle(node).boxShadow;
});

рони 13.05.2018 19:27

Цитата:

Сообщение от madeas
Можно ли при помощи js добавить еще один параметр внутрь css?

да, но проще так как вам предложили выше.

рони 13.05.2018 19:54

изменение правила css
 
madeas,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
</head>

<body>
<style>
.block-1 {
box-shadow: 10px 20px 30px blue;
height: 100px;
}
</style>
<div class="block-1">123</div>
 <script>
 var style = document.styleSheets;
      for (var i=0; i<style.length; i++)  {
          var rules = style[i].cssRules;
        for (var k=0; k<rules.length; k++)  {
          if(rules[k].selectorText == ".block-1") {
             var temp = rules[k].cssText.match(/\S+(?=:)/g)||[];
              for (var n=0; n<temp.length; n++)  {
                 var cs = temp[n];
                 if(cs == "box-shadow") rules[k].style[cs] += " inset"
              }

          }
        }
      }

  </script>
</body>
</html>

madeas 14.05.2018 10:11

Спасибо, ребят. А можно сделать так, чтобы скрипт распространялся только на один блок? Если в стилях есть блоки вроде block-11, block-102 и все подобные, включающие в себя block-1***, они тоже получают параметр inset.

рони 14.05.2018 11:31

Цитата:

Сообщение от madeas
, включающие в себя block-1***, они тоже получают параметр inset.

чудеса!!!

madeas 14.05.2018 11:45

рони, странный юмор. Смотри, на страничке есть 5 блоков:

https://jsfiddle.net/w13efcL9/

и если я поставлю в скрипт значение блока 1, то скрипт будет применен и ко второму, так как тот включается в себя block-102

madeas 14.05.2018 11:49

Все, нашел проблему. Спасибо за помощь!

рони 14.05.2018 14:08

madeas,

document.querySelectorAll('.block-1')

madeas 16.05.2018 10:17

Да, так и сделал.
Еще такой вопрос. Чтобы не лепить новую тему, напишу здесь.

Скажите, можно ли прилепить к этому скрипту функцию, в которой, при нажатии/наведении на один из этих блоков появлялась тень у основного контейнера. Или может сделать селект, в котором можно будет выбрать опцию с одной из этих теней и они будут менять тень основного блока. Так, наверное, даже проще и лучше будет.
https://jsfiddle.net/d1pj6k1m/
Заранее спасибо.

рони 16.05.2018 10:30

Цитата:

Сообщение от madeas
можно ли

не понимаю что вы хотите сделать.

madeas 16.05.2018 10:36

Рони, прошу прощения, не верно сформулировал. Я пытаюсь связать эти блоки с основным контейнером, чтобы при выборе одного из них в селекте(или наведении на блоки), менялась тень основного контейнера. Набросок кода https://jsfiddle.net/d1pj6k1m/ Что-то вроде демонстрации теней на основном контейнере.

Dilettante_Pro 16.05.2018 10:51

Как-то так?
<style>
div {
  display: inline-block;
  width: 100px;
  height: 100px;
  margin: 20px;
  text-align: center;
  line-height: 100px;
}
.block-1,
.block-2,
.block-11,
.block-101,
.block-301 {
box-shadow: 10px 20px 30px gray;
height: 100px;
}
.content {
  display: block;
  width: 96%;
  height: 150px;
  background: #fafafa;
}

</style>
<div class="content">

<div class="blocks block-1">1</div>
<div class="blocks block-2">2</div>
<div class="blocks block-11">11</div>
<div class="blocks block-101">101</div>
<div class="blocks block-301">301</div>

</div>
<script>
[].forEach.call(document.querySelectorAll('.block-1'), function(node) {
	var bsh = getComputedStyle(node).boxShadow;
	node.style.boxShadow = "inset "+bsh;
});
[].forEach.call(document.querySelectorAll('.blocks'), function(node) {
	node.onmouseover = function() {
	    document.querySelector('.content').style.boxShadow = getComputedStyle(node).boxShadow;
        }
	node.onmouseleave = function() {
	    document.querySelector('.content').style.boxShadow = "";
        }
});
</script>

madeas 16.05.2018 11:06

Не совсем. Еще раз прошу прощения, не верно сформулировал задачу, так как не представляю как это лучше сделать. Сам запутался.
С предыдущим скриптом разобрался. Задача теперь в другом.

Вот код https://jsfiddle.net/q2jgymq8/
В нем есть основной контейнер, блок с опциями и блоки, у которых у каждого свое свойство (в данном случае тень). Можно ли сделать так, чтобы при выборе какой-нибудь опции, появлялась/менялась тень у основного контейнера, в соответствии с тенью блоков?

Dilettante_Pro 16.05.2018 11:18

madeas,
Изменил пример в пост№14

Dilettante_Pro 16.05.2018 11:29

С селектором
<style>
div {
  display: inline-block;
  width: 100px;
  height: 100px;
  margin: 20px;
  text-align: center;
  line-height: 100px;
}
.block-1 {
  box-shadow: 1px 12px 19px gray;
  height: 100px;
}
.block-2 {
  box-shadow: 1px 12px 19px gray;
  height: 100px;
}
.block-11 {
  box-shadow: 0px 2px 30px gray;
  height: 100px;
}
.block-101 {
  box-shadow: 1px 20px 90px gray;
  height: 100px;
}
.block-301 {
  box-shadow: 10px 2px 190px gray;
  height: 100px;
}
.content {
  display: block;
  display: flex;
  display: -webkit-flex;
  width: 96%;
  height: 150px;
  background: #fafafa;
}
.block-select {
  border: 0;
  outline: none;
}
</style>
<div class="content">
<p>
<select size="6" multiple class="block-select">
<option disabled>Выберите блок</option>
<option>block-1</option>
<option selected>block-2</option>
<option>block-11</option>
<option>block-101</option>
<option>block-301</option>
</select>
</p>
<div class="block-1">1</div>
<div class="block-2">2</div>
<div class="block-11">11</div>
<div class="block-101">101</div>
<div class="block-301">301</div>

</div>
<script>
[].forEach.call(document.querySelectorAll('.block-1'), function(node) {
	var bsh = getComputedStyle(node).boxShadow;
	node.style.boxShadow = "inset "+bsh;
});
document.querySelector('select').onchange = function() {
	var node = document.querySelector("." + this.value);
	    document.querySelector('.content').style.boxShadow = getComputedStyle(node).boxShadow;
 
};
</script>

madeas 16.05.2018 11:33

Да. Спасибо большое. А можно реализовать такое при помощи этого? Задействовать те же блоки, но не связывая скрипты, которые мы брали ранее.
<select size="6" multiple class="block-select">
<option disabled>Выберите блок</option>
<option value=".block-1">block-1</option>
<option selected value=".block-2">block-2</option>
<option value=".block-11">block-11</option>
<option value=".block-101">block-101</option>
<option value=".block-301">block-301</option>
</select>

Dilettante_Pro 16.05.2018 11:34

madeas,
Пост17 видели?

madeas 16.05.2018 11:38

Спасибо большое! Можно закрывать.

ruslan_mart 16.05.2018 19:06

var style = document.createElement('style');
style.textContent = '.block1{box-shadow:inset ' + window.getComputedStyle(document.querySelector('.block-1')).boxShadow  + ' !important}';
document.head.appendChild(style);


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