我想要帮助此PHP函数与第三种颜色选项一起使用。
注意:没有CSS。没有Java语言。只是PHP和HTML。
<?php
function Gradient($HexFrom, $HexTo, $ColorSteps)
{
$FromRGB['r'] = hexdec(substr($HexFrom, 0, 2));
$FromRGB['g'] = hexdec(substr($HexFrom, 2, 2));
$FromRGB['b'] = hexdec(substr($HexFrom, 4, 2));
$ToRGB['r'] = hexdec(substr($HexTo, 0, 2));
$ToRGB['g'] = hexdec(substr($HexTo, 2, 2));
$ToRGB['b'] = hexdec(substr($HexTo, 4, 2));
$StepRGB['r'] = ($FromRGB['r'] - $ToRGB['r']) / ($ColorSteps - 1);
$StepRGB['g'] = ($FromRGB['g'] - $ToRGB['g']) / ($ColorSteps - 1);
$StepRGB['b'] = ($FromRGB['b'] - $ToRGB['b']) / ($ColorSteps - 1);
$GradientColors = array();
for($i = 0; $i <= $ColorSteps; $i++)
{
$RGB['r'] = floor($FromRGB['r'] - ($StepRGB['r'] * $i));
$RGB['g'] = floor($FromRGB['g'] - ($StepRGB['g'] * $i));
$RGB['b'] = floor($FromRGB['b'] - ($StepRGB['b'] * $i));
$HexRGB['r'] = sprintf('%02x', ($RGB['r']));
$HexRGB['g'] = sprintf('%02x', ($RGB['g']));
$HexRGB['b'] = sprintf('%02x', ($RGB['b']));
$GradientColors[] = implode(NULL, $HexRGB);
}
return $GradientColors;
}
$text = "blah testing blah testing blah";
$length = strlen($text);
$Gradients = Gradient("00FF00", "0000FF", $length);
for ($i=0; $i<$length; $i++) {
echo '<span style="color: #' . $Gradients[$i] . ';">' . $text[$i] . '</span>';
}
?>
我该怎么做才能获得第三个选择?如:
Gradient($HexOne, $HexTwo, $HexThree, $ColorSteps)
//^^^^^^^^^
这应该为您工作:
因此,基本上我刚刚添加的是,如果您提供两种以上的颜色,则它将简单地将第一个渐变与下一个渐变合并,直到您拥有所有想要的渐变为止。它还允许您针对每个梯度使用不同的步骤。因此,您可以定义它应该以20步从绿色变为红色,并以50步从红色变为蓝色。
当您使用类的实例时,可以将颜色作为数组传递,将步骤作为数组传递或整数。或者,您可以使用这些方法setColors()
设置颜色数组,并将setSteps()
数组或整数设置为间隔。
如果您有多种颜色,还可以定义是否应该对渐变进行分块。您可以设置和获取该值(如果该值应与setChunkedGradientState()
和一起分块)getChunkedGradientState()
。这只是意味着,如果您不希望对梯度进行分块(这是默认值),则将获得如下所示的数组:
Array
(
[0] => FD9B09
[1] => EBAE1C
[2] => D9C230
[3] => C7D544
[4] => B6E958
[5] => B6E958
[6] => A9EC8D
[7] => 9CEFC2
[8] => 8FF2F8
)
如果应该将其分块,则会得到一个如下数组:
Array
(
[0] => Array
(
[0] => FD9B09
[1] => EBAE1C
[2] => D9C230
[3] => C7D544
[4] => B6E958
)
[1] => Array
(
[0] => B6E958
[1] => A9EC8D
[2] => 9CEFC2
[3] => 8FF2F8
)
)
完整代码:
<?php
class Gradienter {
public $colors = [];
public $gradient = [];
public $colorSteps = 2;
public $chunkedGradient = FALSE;
public function __construct(array $colors = [], $colorSteps = 2, $chunkedGradient = FALSE) {
$this->setColors($colors);
$this->setSteps($colorSteps);
$this->setChunkedGradientState($chunkedGradient);
return $this;
}
public function getGradient() {
if(count($this->colors) == 2) {
$this->createSingleGradient();
} elseif(count($this->colors) > 2) {
$this->createMultipleGradient();
} else {
throw new Exception("Not enough colors provided");
}
if($this->chunkedGradient)
$this->getChunkedGradient();
return $this->gradient;
}
public function getChunkedGradient() {
$stepCount = count($this->colors) - 1;
for($count = 0; $count < $stepCount; $count++) {
if(!is_array($this->colorSteps))
$gradient[] = array_splice($this->gradient, 0, $this->colorSteps);
elseif(!isset($this->colorSteps[$count]))
$gradient[] = array_splice($this->gradient, 0, 2);
else
$gradient[] = array_splice($this->gradient, 0, $this->colorSteps[$count]);
}
$this->gradient = $gradient;
}
public function createSingleGradient() {
if(!is_array($this->colorSteps))
$this->$gradient = $this->createGradient($this->colors[0], $this->colors[1], $this->colorSteps);
else
$this->$gradient = $this->createGradient($this->colors[0], $this->colors[1], $this->colorSteps[0]);
}
public function createMultipleGradient() {
foreach($this->colors as $k => $color) {
if(!isset($this->colors[$k+1]))
break;
if(!is_array($this->colorSteps))
$this->gradient = array_merge($this->gradient, $this->createGradient($this->colors[$k], $this->colors[$k+1], $this->colorSteps));
elseif(isset($this->colorSteps[$k]))
$this->gradient = array_merge($this->gradient, $this->createGradient($this->colors[$k], $this->colors[$k+1], $this->colorSteps[$k]));
else
$this->gradient = array_merge($this->gradient, $this->createGradient($this->colors[$k], $this->colors[$k+1], 2));
}
}
public function createGradient($start, $end, $interval) {
$colors = ["r", "g", "b"];
list($colorStart["r"], $colorStart["g"], $colorStart["b"]) = array_map("hexdec", str_split($start, 2));
list($colorEnd["r"], $colorEnd["g"], $colorEnd["b"]) = array_map("hexdec", str_split($end, 2));
foreach($colors as $color)
$colorSteps[$color] = ($colorStart[$color] - $colorEnd[$color]) / ($interval - 1);
for($count = 0; $count < $interval; $count++) {
foreach($colors as $color)
$rgb[$color] = floor($colorStart[$color] - ($colorSteps[$color] * $count));
$hexRgb = array_combine($colors, array_map(function($v){
return substr(sprintf('%02X', $v), 0, 2);
}, $rgb));
$GradientColors[] = implode("", $hexRgb);
}
return $GradientColors;
}
public function setColors(array $colors = []) {
$this->colors = $colors;
return $this;
}
public function getColors() {
return $this->colors;
}
public function setSteps($colorSteps = 2) {
if(!is_array($colorSteps))
$this->setSingleColorSteps($colorSteps);
else
$this->setMultipleColorSteps($colorSteps);
return $this;
}
public function setSingleColorSteps($colorSteps) {
$this->colorSteps = intval($colorSteps < 2 ? 2 : $colorSteps);
}
public function setMultipleColorSteps($colorSteps) {
$this->colorSteps = array_map(function($v){
return intval($v < 2 ? 2 : $v);
}, $colorSteps);
}
public function getSteps() {
return $this->colorSteps;
}
public function setChunkedGradientState($chunkedGradient) {
$this->chunkedGradient = $chunkedGradient;
return $this;
}
public function getChunkedGradientState() {
return $this->chunkedGradient;
}
}
$gradienter = new Gradienter();
$gradienter->setColors(["FD9B09", "B6E958", "F2F90B", "8FF2F8", "FB8CF8", "F05C3E"]);
$gradienter->setSteps([5, 30, 25, 60, 40]);
$gradients = $gradienter->getGradient();
foreach($gradients as $k => $color)
echo "<div style='background-color:#" . $color . "'>" . $color . "</div>";
?>
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句