Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Закрашивание ячеек в таблице в зависимости от данных в ячейк (https://javascript.ru/forum/dom-window/23342-zakrashivanie-yacheek-v-tablice-v-zavisimosti-ot-dannykh-v-yachejjk.html)

Gradyslav 20.11.2011 22:15

Закрашивание ячеек в таблице в зависимости от данных в ячейк
 
Добрый вечер.
Имеется вопрос, над которым бьюсь уже неделю.
Имеется таблица 3 столбца и 3 строки. Т.Е. 9 ячеек.
Эти ячейки заполнены числами. Можно ли сделать так, чтобы в зависимости от того, какое число в ячейке, ячейка закрашивалась определенным цветом.
Например, если значение в ячейке = 1, то ячейка закрашивается в красный. А в другой ячейке значение = 8, и она закрашена в зеленый.
Заранее благодарен за помощь.

trikadin 20.11.2011 22:20

Цитата:

Сообщение от Gradyslav
Можно ли сделать так

Можно.

Gradyslav 20.11.2011 22:55

а как?

trikadin 20.11.2011 22:57

Цитата:

Сообщение от Gradyslav
а как?

Хитрый, да? Скриптом. Или css-кой, если нужно заполнить один раз...

Gradyslav 20.11.2011 23:03

Нет не хитрый) Просто надо сделать, а как не знаю.) Вот и спрашиваю совета)

trikadin 20.11.2011 23:14

CSS: nth-child (не кроссбраузерно). Читать тут.

javascript:
<table id="t">
<td>1</td>
<td>2</td>
<td>3</td>
<td>3</td>
<td>2</td>
<td>1</td>
</table>
<script>
arr= document.getElementById("t").getElementsByTagName("td");
colors= ["", "blue", "red", "green"];
for (var i=0; i!= arr.length; ++i) {
 arr[i].style.background=colors[arr[i].innerHTML];
}
</script>

Gradyslav 20.11.2011 23:19

Спасибо за помощь)

Gradyslav 21.11.2011 01:34

Подскажите пожалуйста, есть функция, которая раскрашивает ячейки в таблице, в зависимости от значений ячейки. Как сделать так, что бы две таблицы раскрашивались по разным функциям. Вот пример, но он не работает((
<html>
      <head>
      <link rel="stylesheet" href="style.css" type="text/css" />
      <script type="text/javascript" src="prototype.js"></script>
      <script type="text/javascript">
         $(document).observe('dom:loaded', function(){
     
     var arr_class = ['range1','range2','range3'];
     
     function table_colorize(elements, array_class)
     {
       elements.each(function(i, j){
            
             var  num = i.innerText || i.textContent;
          
             var  $class;
             if(num > 1.5 && num < 5.5)
                 $class = array_class[0];
             if(num > 5.4 && num <= 8.3)
                 $class = array_class[1];
             if(num >= 9.0 || num <= 1)
                 $class = array_class[2];
              
             i.addClassName($class);
        
       });
     
     };
     var first = $$('table#first td');
     
     
     table_colorize(first, arr_class);
     
        
     });
     
     
     
      </script>
     
      <link rel="stylesheet" href="style.css" type="text/css" />
      <script type="text/javascript" src="prototype.js"></script>
      <script type="text/javascript">
         $(document).observe('dom:loaded', function(){
     
     var abc_class = ['a', 'b', 'c'];
     
     function table_colorize(elements, array_class)
     {
       elements.each(function(i, j){
            
             var  num = i.innerText || i.textContent;
          
             var  $class;
           if($R(10,30).include(num))
             $class = arr_class[0];
         if($R(40,60).include(num))
             $class = arr_class[1];
         if($R(70,90).include(num))
             $class = arr_class[2];
              
             i.addClassName($class);
        
       });
     
     };
     
     var second = $$('table#second td');
     
     table_colorize(second, abc_class);
        
     });
     
     
     
      </script>
 </head>
 <body>
<table id="obsh">
<tr>
<td>
<table id="first">
    <tr>
        <td>0.7</td>
        <td>2.1</td>
        <td>3.7</td>
    </tr>
    <tr>
        <td>4.6</td>
        <td>5.5</td>
        <td>6.1</td>
    </tr>
    <tr>
        <td>7.4</td>
        <td>8.3</td>
        <td>9.4</td>
    </tr>
</table>
</td>
<td>
<table id="second">
    <tr>
        <td>10</td>
        <td>20</td>
        <td>30</td>
    </tr>
    <tr>
        <td>40</td>
        <td>50</td>
        <td>60</td>
    </tr>
    <tr>
        <td>70</td>
        <td>80</td>
        <td>90</td>
    </tr>
</table>
</td></tr>
</table>
 </body>
 </html>

Gradyslav 21.11.2011 01:36

Если брать две таблицы, что бы их раскрашивало по одной функции, то вот рабочий пример.
<html>
 <head> 
 <link rel="stylesheet" href="style.css" type="text/css" />
 <script type="text/javascript" src="prototype.js"></script>
 <script type="text/javascript">
     $(document).observe('dom:loaded', function(){

var arr_class = ['range1','range2','range3'];
var abc_class = ['a', 'b', 'c'];

function table_colorize(elements, array_class)
{
  elements.each(function(i, j){
        var  num = i.innerText || i.textContent;
        var  $class;
        if($R(1,30).include(num))
             $class = array_class[0];
        if($R(40,60).include(num))
             $class = array_class[1];
        if($R(70,90).include(num))
             $class = array_class[2];
    
         i.addClassName($class);
    
  });

};
var first = $$('table#first td');
var second = $$('table#second td');

table_colorize(first, arr_class);
table_colorize(second, abc_class);
    
 });

 </script>

 
 </head>
 <body>
<table id="obsh">
<tr>
<td>
<table id="first">
    <tr>
        <td>0.7</td>
        <td>2.1</td>
        <td>3.7</td>
    </tr>
    <tr>
        <td>4.6</td>
        <td>5.5</td>
        <td>6.1</td>
    </tr>
    <tr>
        <td>7.4</td>
        <td>8.3</td>
        <td>9.4</td>
    </tr>
</table>
</td>
<td>
<table id="second">
    <tr>
        <td>10</td>
        <td>20</td>
        <td>30</td>
    </tr>
    <tr>
        <td>40</td>
        <td>50</td>
        <td>60</td>
    </tr>
    <tr>
        <td>70</td>
        <td>80</td>
        <td>90</td>
    </tr>
</table>
</td></tr>
</table>
 </body>
 </html>

trikadin 21.11.2011 07:20

Сделайте его запускаемым)

da_ff 21.11.2011 11:30

trikadin,
Кстати, а как делать эти запускаемые примеры?

trikadin 21.11.2011 14:14

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[js]
... ваш код...
[/js]


О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting

Sergey and 07.12.2016 14:02

Здравствуйте
Помогите пожалуйста мне нужно сделать что то типа прогрессбара из колонки таблицы. я в программирование новичок,сильно не пинайте. Задача закрашивать колонку в красный если 100% или если 50% то половина красная а половина прозрачная.

Dilettante_Pro 07.12.2016 16:19

Sergey and,
<style>
  td { position:relative;
        width:40px;
        padding: 0px;     
 }
  td div.back {position:absolute;
         left:0px;
         top:0px;
         height:100%;
         background-color:red;
         z-index:-1;
  }

</style>
<table border="1px">
  <tr>
    <td><div class="back"></div>0%</td>
    <td><div class="back"></div>25%</td>
    <td><div class="back"> </div>50%</td>
    <td><div class="back"></div>75%</td>
    <td><div class="back"></div>100%</td>
  </tr>
</table>
<script>
  var arr = document.querySelectorAll('td');
  for(var i = 0;i < arr.length;i++) {
     arr[i].firstChild.style.width = arr[i].innerText;
  }
</script>

рони 07.12.2016 16:36

Dilettante_Pro,
Цитата:

Сообщение от Sergey and
закрашивать колонку


Dilettante_Pro 07.12.2016 16:42

рони,
Я вообще с большим трудом понял задачу.
Если колонка - то 100% это что и от чего?

рони 07.12.2016 17:00

Dilettante_Pro,
ждём подробности:)

Dilettante_Pro 07.12.2016 17:15

Что-то примерно так?
<style>
  td { position:relative;
        width:20px;
    
 }

</style>
Процент<input type='text'/>
<table >
  <tr>
    <td>0%</td>
  </tr>
   <tr>
    <td>25% </td>
  </tr>
   <tr>
    <td>50% </td>
  </tr>
  <tr>
    <td>75% </td>
  </tr>
  <tr>
    <td>100% </td>
  </tr>
</table>
<script>
document.querySelector('input').onchange = function() {
  var percent = +this.value;
  var arr = document.querySelectorAll('td');
  for(var i = 0;i < arr.length ;i++) {
     arr[i].style.backgroundColor = "white";
  }
  for(var i = 0;i < ((arr.length * percent) / 100) ;i++) {
     arr[i].style.backgroundColor = "red";
  }
}
</script>

Dilettante_Pro 07.12.2016 18:09

вариант оформления. ТС, ау!!!
<style>
  td { position:relative;
        width:20px;
        height:30px;
        padding: 0px;
  }
  td div.back {
        position:absolute;
        top:0px;
        left:0px;
        width:100%;
        height:100%;
  }
</style>
Процент<input type='text'/>
<table>
  <tr>
    <td><div class="back"></div></td>
  </tr>
  <tr>
    <td><div class="back"></div></td>
  </tr>
  <tr>
    <td><div class="back"></div></td>
  </tr>
  <tr>
    <td><div class="back"></div></td>
  </tr>
  <tr>
    <td><div class="back"></div></td>
  </tr>
  <tr>
    <td><div class="back"></div></td>
  </tr>
  <tr>
    <td><div class="back"></div></td>
  </tr>
  <tr>
    <td><div class="back"></div></td>
  </tr>
  <tr>
    <td><div class="back"></div></td>
  </tr>
  <tr>
    <td><div class="back"></div></td>
  </tr>
  <tr>
    <td><div class="back"></div></td>
  </tr>
</table>
<script>
document.querySelector('input').onchange = function() {
  var percent = +this.value;
  var arr = document.querySelectorAll('td');
  for(var i = 0;i < arr.length ;i++) {
     arr[i].firstChild.style.backgroundColor = "white";
  }
  for(var i = 0;i < ((arr.length * (percent - 5)) / 100) ;i++) {
     arr[i].firstChild.style.backgroundColor = "red";
  }
}
</script>

Sergey and 07.12.2016 18:10

Спасибо за ответы и код.
Похоже как в 14 топике. Представляю так , но как сделать не знаю( таблица а в ней колонки. Размер колонки 10 х 100(для примера). Если в функцию приходит 1% то красным закрашен один ряд пикселей из 100 в колонке красным, если приходит 25% то закрашено 25 строк из 100. Вообщем вертикальный progressbar.

Пока писал ответ уже ответили, уже почти. Для 100% много строк <td><div class="back"></div></td> сто штук придется писать. Хотелось бы одну <td></td> закрашивать в зависимости от%

Dilettante_Pro 07.12.2016 18:45

без дивов
<style>
  td { position:relative;
        width:20px;
        height:10px;
        padding: 0px;
  }
 
</style>
Процент<input type='text'/>
<table>
  <tr>
    <td></td>
  </tr>
  <tr>
    <td></td>
  </tr>
  <tr>
    <td></td>
  </tr>
  <tr>
    <td></td>
  </tr>
  <tr>
    <td></td>
  </tr>
  <tr>
    <td></td>
  </tr>
  <tr>
    <td></td>
  </tr>
  <tr>
    <td></td>
  </tr>
  <tr>
    <td></td>
  </tr>
  <tr>
    <td></td>
  </tr>
  <tr>
    <td></td>
  </tr>
</table>
<script>
document.querySelector('input').onchange = function() {
  var percent = +this.value;
  var arr = document.querySelectorAll('td');
  for(var i = 0;i < arr.length ;i++) {
     arr[i].style.backgroundColor = "white";
  }
  for(var i = 0;i < ((arr.length * (percent - 5)) / 100) ;i++) {
     arr[i].style.backgroundColor = "red";
  }
}
</script>

Sergey and 07.12.2016 19:02

Можно сделать непрерывный progressbar? В этом коде получается кубиками с шагом 10% , а можно как-то сделать непрерывный с шагом 1% ?

рони 07.12.2016 19:04

Sergey and,
зачем вам таблица, может хватит одного div?

Sergey and 07.12.2016 19:09

На странице нужно будет 8 таких баров поместить, что-то типа музыкального индикатора. Как их ровно разместить без таблицы ? http://avtozvuk-info.ru/wp-content/u...ekvalayzer.jpg

Dilettante_Pro 07.12.2016 19:22

Sergey and,
А если по принципу пост 14, только двигать вертикально?
Тогда одна строка таблицы с 8 ячейками. Менять не ширину, а высоту дивов

Sergey and 07.12.2016 19:27

Сейчас возникла мысль если в колонке поместить DIV с красным фоном и менять его высоту от 0 до 100, так получиться?

рони 07.12.2016 20:01

Sergey and,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  .slider{
    display: flex;
     width: 400px;
     height: 200px;
  }
  .slider > div{
    border: 1px #7CFC00 solid;
    flex: 1;
    background-color: #FF0000;
    margin: 2px;
    background-repeat: no-repeat;
    transition: all 1.4s ease-in-out;

  }

  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

  <script>
$(function() {
     var d = $(".slider > div");
    function f()
    {
      var el = d[Math.random()*d.length|0],
      gradient = Math.random()*100|0 ;
      $(el).css({"background-image" : "linear-gradient(#103810 "+gradient+"%, transparent "+gradient+"%)"});
      window.setTimeout(f,200)
    }
    f()
});
  </script>
</head>

<body>
<div class="slider">
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div></div>

</body>
</html>

Sergey and 07.12.2016 20:37

Спасибо.:thanks:
Как раз такое нужно было .

Sergey and 08.12.2016 10:28

Долго разбирался, но теперь понял как работает код. Спасибо.
подскажите пожалуйста еще. Сам скорее всего не придумаю как сделать.
Хотелось бы еще на каждый эквалайзер вставить еще один прямоугольник. Прямоугольник разделен на два в центре зеленая линия 4px. эта линия появляется если задать 50% в центре. Верхний и нижний от линии квадратики зеленные и полупрозрачные, что-бы было видно за ними красную линию которую уже сделали. Можно один div закрасить тремя цветами ? Если у кого были магнитофоны не с круглой регулировкой а с бегуном?, бегунок хочу сделать.
Код:

___
|  |
|__|
|__| бегунок- центральная линия 4px верхний и нижний от нее квадр. полупрозрачные. двигать его не мышкой а из скрипта
|__|
|  |
|__|


рони 08.12.2016 11:04

Sergey and,
тут нужен специалист по css ...

Sergey and 08.12.2016 11:06

Сильно сложно , у меня не получиться ?

рони 08.12.2016 11:10

Цитата:

Сообщение от Sergey and
Сильно сложно , у меня не получиться ?

про вас не знаю :) дерзайте!

Sergey and 08.12.2016 11:15

Буду пробовать, опыта мало в этом деле Не знаю какой объект брать div table...

Dilettante_Pro 08.12.2016 11:17

Sergey and,
Цитата:

Сообщение от Sergey and
сли у кого были магнитофоны не с круглой регулировкой а с бегуном?, бегунок хочу сделать.

Мне кажется, вы смешиваете в одну кучу индикатор и регулятор.
Насчет регуляторов смотрите слайдеры.

Dilettante_Pro 09.12.2016 13:29

индикатор с регулятором
<!DOCTYPE html>
<html>
<head>
    <title>Untitled Page</title>
<style>
  td { position:relative;
        width:20px;
        height:150px;
        padding: 0px;     
 }
  .back {position:absolute;
         left:0px;
         bottom:0px;
         width:100%;
         background-color:red;
         z-index:-1;
  }
  .slider { margin: 5px; height: 150px; }

</style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>

<script>
    $(function () {
        $(".slider").slider({
            orientation: "vertical",
            min: 0,
            max: 100,
            step: 10,
            value: 50

        });
         var rows = $('tr'),
          lights = rows.find('.back'),
          slides = rows.find('.slider'),
          currHeight;

        function loop() {
            for (var i = 0; i < lights.length; i++) {
                currHeight = Math.random() * $(slides[i]).slider('values',0);
                 $(lights[i]).css('height', currHeight + "%");
            }
            setTimeout(loop, 200);
        }
        loop();
    })
</script>
</head>
<body>

<table border="1px">
  <tr>
    <td><div class="back"></div></td>
    <td><div class="back"></div></td>
    <td><div class="back"></div></td>
    <td><div class="back"></div></td>
    <td><div class="back"></div></td>
  </tr>
   <tr>
    <td><div class="slider"></div></td>
    <td><div class="slider"></div></td>
    <td><div class="slider"></div></td>
    <td><div class="slider"></div></td>
    <td><div class="slider"></div></td>
  </tr>
</table>
</body>
</html>

Sergey and 10.12.2016 15:33

Благодарю. :thanks: :thanks:

Пупел 16.11.2018 17:44

У меня тоже немного схожий вопрос...
А как сделать так, чтоб закрашивались только те ячейки таблицы, которые заполнены, а пустые ячейки таблицы не закрашивались?
<table border="1" id="row">
  <tr>
    <td width="20" height="20"></td>
    <td width="20" height="20"></td>
    <td width="20" height="20">2</td>
    <td width="20" height="20"></td>
</tr>
</table>
<script>
arr= document.getElementById("row").getElementsByTagName("td");
colors= "red";
window.onload = function () {
	for (var i=0; i!= arr.length; ++i) {
		if (typeof arr[i] !== "") {
			arr[i].style.background=colors;
		}	
	}
}

</script>

Dilettante_Pro 16.11.2018 17:53

<table border="1" id="row">
  <tr>
    <td width="20" height="20"></td>
    <td width="20" height="20"></td>
    <td width="20" height="20">2</td>
    <td width="20" height="20"></td>
</tr>
</table>
<script>
window.onload = function () {
   arr= document.getElementById("row").getElementsByTagName("td");
   colors= "red";

	for (var i=0; i!= arr.length; ++i) {
		if (typeof arr[i] !== "" && arr[i].innerHTML != "") {
			arr[i].style.background=colors;
		}	
	}
}

</script>

рони 16.11.2018 18:04

Пупел,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  td:empty{
      background-color: #FFFFFF;
  }
  td{
      background-color: #FF0000;
  }

  </style>
</head>

<body>
<table border="1" id="row">
  <tr>
    <td width="20" height="20"></td>
    <td width="20" height="20"></td>
    <td width="20" height="20">2</td>
    <td width="20" height="20"></td>
</tr>
</table>

</body>
</html>

Пупел 16.11.2018 18:09

Спасибо! Вопрос исчерпан)


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