есть такая тема 100 квадратиков в ряд закрасить в цикле в #f00 цвет, интенсивностью от #fff до #f00 какие идеи есть? чтобы попроще, покрасивее з.ы. сделал через rgb(%,%,%); но че-то не очень, слишком много нюансов Добавлено спустя 20 минут 25 секунд: хотелось бы указать цвета от и до а в цикле работал правильный перебор цветов
Если именно к индексной палитре приводить #fff (что равно в палитре true color #ffffff), то там всего 256 значений, у большинства которых в начале нет f. Как на 100 разбить? На 16 легко Код (PHP): <style> div.ct div{ float:left; width:20px; height:20px; font-size:10px; } </style> <?php echo '<div class="ct">'; for($i=0;$i<16;$i++){ $dehe=dechex($i); echo sprintf('<div style="background:#f%s%s"></div>',$dehe,$dehe); } echo '</div>'; Иначе нужно переходить к плавным переходам, это формат #ffffff. Поправка. Если цвета имеют диапазон от 0-f (16 цветов), то при форме записи #fff будет значений всего 16*16*16=4096. Так как нужен красный цвет всегда в значении f, то для цветов Green и Blue остаются 16*16=256 значений. Но так как требуется плавный переход интенсивности цвета, Green и Blue должны быть равны. Остаётся всего 16 значений яркости красного при форме записи #fff: Код (Text): f00 f11 f22 f33 f44 f55 f66 f77 f88 f99 faa fbb fcc fdd fee fff В формате #ffffff можно так разбить на 100 цветов: Код (PHP): div.ct div{ float:left; width:20px; height:20px; } <?php echo '<div class="ct">'; for($i=0;$i<100;$i++){ $dehe=dechex($i*2.56);//256/100=2.56 $hexStr=($i*2.56<16)?'0'.$dehe:''.$dehe; echo sprintf('<div style="background:#ff%s%s">%d</div>',$hexStr,$hexStr,$i+1); } echo '</div>';
хотя бы для 16^3 не обязательно #fff или #ffffff подойдут и другие способы указания цвета rgb(255,255,255) или rgb(100%,100%,100%)
А что значит "правильный перебор цветов"? Если представить пространство RGB в виде куба, ось X будет соответствовать Red, Y - Green, Z - Blue, то удобно пользоваться векторами. Код (PHP): div.ct div{ float:left; width:2px; height:30px; } <?php include 'Vector3D.php'; $colorStart=new Vector3D(222,239,34);//начальное значение RGB $colorEnd=new Vector3D(222,121,48);//конечное значение RGB $colorVec=$colorEnd->sub($colorStart);//вектор направления $divVec=$colorVec->div(100);//вектор приращения//2.56 echo '<div class="ct">'; for($i=0;$i<=100;$i++){ $color=$colorStart->add($divVec->mul($i)); echo sprintf('<div style="background:rgb(%d,%d,%d)"></div>',$color->x,$color->y,$color->z); } echo '</div>'; Накидал простой класс с несколькими векторными функциями Vector3D.php Код (PHP): <?php /** * Вектор содержит 3д координаты и полезные функции. * @author Sandro */ class Vector3D{ private $x=0; private $y=0; private $z=0; private $length=0;//длина вектора private function modulus(){ $this->length=sqrt($this->x*$this->x+$this->y*$this->y+$this->z*$this->z); } function __construct($x=0,$y=0,$z=0){ $this->x=$x; $this->y=$y; $this->z=$z; $this->modulus(); } function __get($field){ if(isset($this->$field)){ return $this->$field; } } function __set($field,$val){ if(isset($this->$field)){ $this->$field=$val; $this->modulus(); } } /** * Возвращает вектор единичной длины. */ public function norm(){ return new Vector3D($this->x/$this->length, $this->y/$this->length, $this->z/$this->length); } /** * Умножить значения вектора на число. * @param type $val * @return \Vector3D */ public function mul($val){ $ret=new Vector3D($this->x,$this->y,$this->z); if(is_numeric($val)){ $ret=new Vector3D($this->x*$val,$this->y*$val,$this->z*$val); } return $ret; } /** * Разделить значения вектора на число. * @param type $val * @return \Vector3D */ public function div($val){ $ret=new Vector3D($this->x,$this->y,$this->z); if(is_numeric($val) && $val!=0){ $ret=new Vector3D($this->x/$val,$this->y/$val,$this->z/$val); } return $ret; } /** * Сложение векторов. * @param type $vec Тип Vector3D * @return \Vector3D */ public function add(Vector3D $vec){ return new Vector3D($vec->x+$this->x,$vec->y+$this->y,$vec->z+$this->z); } /** * Вычесть вектор из текущего значения вектора. * @param type $vec Тип Vector3D * @return \Vector3D */ public function sub(Vector3D $vec){ return new Vector3D($this->x-$vec->x,$this->y-$vec->y,$this->z-$vec->z); } }