没有CSS的文本的多色渐变效果?

人群

我想要帮助此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)
                         //^^^^^^^^^
里齐尔123

这应该为您工作:

因此,基本上我刚刚添加的是,如果您提供两种以上的颜色,则它将简单地将第一个渐变与下一个渐变合并,直到您拥有所有想要的渐变为止。它还允许您针对每个梯度使用不同的步骤。因此,您可以定义它应该以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>";


?>

Demo 1 Demo 2

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我可以在Excel中创建没有渐变的多色单元格吗?

来自分类Dev

如何在 CSS 中制作多色渐变效果?

来自分类Dev

Highchart多色渐变

来自分类Dev

动态多色渐变图像

来自分类Dev

CSS文本输入带有标签的效果

来自分类Dev

具有不透明度和渐变文本描边/轮廓的CSS渐变文本

来自分类Dev

有没有办法使CSS渐变不连贯?

来自分类Dev

css3渐变的朝阳效果

来自分类Dev

CSS3中的块状渐变效果

来自分类Dev

CSS3聚光灯效果,使用带有渐变的圆角矩形

来自分类Dev

在CSS中使用线性背景渐变效果后,带有超链接的图像不起作用

来自分类Dev

如何使UIView具有透明渐变效果?

来自分类Dev

具有渐变效果的背景图像

来自分类Dev

现有按钮上的循环渐变效果

来自分类Dev

有没有办法进行多色边框

来自分类Dev

以编程方式创建了一个UIButton,但是没有单击效果(仅文本效果)

来自分类Dev

以编程方式创建了一个UIButton,但是没有单击效果(仅文本效果)

来自分类Dev

实体渐变不是真的实体吗?在色标处没有清晰的边缘

来自分类Dev

为什么我没有CSS过渡效果?

来自分类Dev

没有悬停效果?

来自分类Dev

具有线性渐变,阴影和文本轮廓的CSS文本?

来自分类Dev

HTML5 / JavaScript画布文本渐变效果

来自分类Dev

有没有办法在没有任何其他元素的情况下为 div 提供类似“矩形”或“菱形”的渐变效果?

来自分类Dev

样式化没有CSS的html文本

来自分类Dev

有没有办法为特定像素创建css3边框渐变?

来自分类Dev

FFmpeg 中的多色文本

来自分类Dev

带有CSS的渐变文字

来自分类Dev

带有CSS的渐变文字

来自分类Dev

带有渐变的CSS箭头

Related 相关文章

热门标签

归档