Най-добрият начин за генериране на произволен фонов цвят с php при зареждане на страницата

Опитвам се да създам някакъв код, който генерира произволен цвят на фона при зареждане на страницата, но също така извежда текст с цвят, зависим от цвета на фона. Например, ако цветът на фона е тъмен, той ще покаже светъл текст.

Досега съм създал следното, което работи - въпреки че не съм сигурен дали това е най-добрият начин да го постигна.

Създадох масив, който решава на случаен принцип дали цветът на фона трябва да е светъл или тъмен, и направих това, за да мога да имам два алтернативни цвята на шрифта въз основа на схемата $. Сигурен съм, че ще има много по-динамичен начин да направите това?

След това зададох още два масива, изброяващи множество цветове както за тъмните, така и за светлите схеми, с оператор elseif за извеждане на съответния css.

Има няколко неща за това, които бих искал да попитам:

1) защо последният низ в масив никога не се извежда? това го прави така, че трябва да добавя празен низ във всеки масив, така че предишният да не бъде пропуснат.

2) коя е най-добрата практика за постигане на това, както и най-динамичният метод.

<?php
header("Content-type: text/css; charset: UTF-8");


$input = array("dark", "light", "");
$rand_keys = array_rand($input, 2);

$scheme = $input[$rand_keys[0]];


if ($scheme == "dark") {

$darkBg = array('212a34', '383838', '000');
$rand_keys_1 = array_rand($input, 2);

$bg_colour = $darkBg[$rand_keys_1[0]];

echo 'body {background-color:#' . "$bg_colour" . '}';
echo 'h2 { color:#fff; }';

}

elseif ($scheme == "light") {

$lightBg = array('ebecee', '31a989', 'fff');
$rand_keys_2 = array_rand($input, 2);

$bg_colour = $lightBg[$rand_keys_2[0]];

echo 'body {background-color:#' . "$bg_colour" . '}' ;
    echo 'h2 { color:#000; }'; 

}

else { echo 'body {background-color: #ef3c39;}'; }


?>

// Вероятно трябваше да отбележим, че ще бъде предварително дефиниран списък с цветове


person s3r3nd1p1ty    schedule 08.01.2014    source източник
comment
не бих искал да посетя сайт, който прави това   -  person    schedule 08.01.2014
comment
aaahhhhhhhhhhh... очите ми! о.о   -  person Jakub    schedule 08.01.2014
comment
Спокойно, това е просто учебен проект.   -  person s3r3nd1p1ty    schedule 09.01.2014


Отговори (3)


За всеки, който се интересува, открих по-добър метод, който е следният по отношение на намаляване на количеството код, получаване на по-добро произволно разпределение и също по-динамично.

<?php

$bgColours = array(

"414245"=>"dark", //one
"333333"=>"dark", //two
"e25359"=>"dark", //three
"ebeced"=>"light", //six
"edd6b4"=>"light" //seven

);

$bgColour = (array_rand($bgColours,1));

$colourScheme = $bgColours[$bgColour];

if ("$colourScheme" == "dark") {

 echo 'body {background-color:#' . "$bgColour" . '}';
 echo 'h2 { color:#fff; }';
}

elseif ($colourScheme == "light") {

echo 'body {background-color:#' . "$bgColour" . '}' ;
    echo 'h2 { color:#333333; }'; 

}

else  { echo 'body {background-color: #ef3c39;}'; }

?>
person s3r3nd1p1ty    schedule 11.01.2014

Както Дагон каза, това звучи като ужасна идея за потребителски интерфейс, но ето как бих го направил:

//starts off with dark text
$textcolor = '222222';

$rand1 = rand(0,255);
$rand2 = rand(0,255);
$rand3 = rand(0,255);

$bgcolor = sprintf("%02X",$rand1) . sprintf("%02X",$rand2) . sprintf("%02X",$rand3);

$total = $rand1 + $rand2 + $rand3;
//if total is less than 400 it is most likely a darker color unless one or more color is accounting for most of the 400
if($total < 400 && $rand1 < 180 && $rand2 < 180 && $rand3 < 180) {
    $textcolor = 'dddddd';
}

Не е перфектно, но 99% от времето текстът е четлив в сравнение с фона.

person Pitchinnate    schedule 08.01.2014
comment
Наистина оценявам вашата помощ, въпреки че трябваше да спомена първоначално, че това е за предварително определен списък с цветове. - person s3r3nd1p1ty; 09.01.2014

Това ще свърши работа:

echo dechex(mt_rand(0, 0xFFFFFF));

ако искате случаен от набор от известни цветове, направете следното:

$colors = array($color1, $color2);
echo $colors[array_rand($colors)];
person jccguimaraes    schedule 08.01.2014
comment
Благодаря за помощта, мислех, че забравих да спомена, че ще бъде за предварително зададена цветова палитра. Все пак хубав код, който трябва да разгледам и да науча. - person s3r3nd1p1ty; 09.01.2014
comment
Можете да зададете масив от цветове като $colors = array($color1, $color2) и след това да извикате $colors[array_rand($colors)] - person jccguimaraes; 09.01.2014