javascript - 基于动态生成的文本和特定图案的颜色 li 元素
问题描述
我尝试了几个小时的东西,但现在希望从“外部”获得帮助。
我有一个<span>
内部的 li 元素,用户可以根据需要重命名。名称约定始终相同,并用下划线分隔。
- 分类名称
- 类别
- 元素名称
- 有时甚至更多标识符为 3。
例子:
由于此列表可能会变得很长,因此我的想法是使用随机背景颜色使其更加清晰。问题来了。
如何根据提到的 1-3 语法为每个 li 元素设置颜色?它应该是这样的:
这是我到目前为止得到的。显然只是迭代每个 li 而无法对其进行分类:
编码:
var lastPick;
var rand;
$('[tree-item-name]').each(function() {
$(this).css('background',randomColor());
});
function randomColor() {
var back = ["#ffc0cb61","rgba(192,255,210,0.38)","rgba(192,220,255,0.38)","rgba(241,192,255,0.38)","rgba(192,240,255,0.38)","rgba(255,221,192,0.38)","rgba(231,255,192,0.38)"];
rand = back[Math.floor(Math.random() * back.length)];
rand==lastPick?randomColor():rand;
lastPick = rand;
return rand;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<li>
<span class="ect-tree-title" tree-item-name="BJ_Mission_Start">BJ_Mission_Start</span>
</li>
<li>
<span class="ect-tree-title" tree-item-name="BJ_Mission_Start">BJ_Mission_Start_Go</span>
</li>
<li>
<span class="ect-tree-title" tree-item-name="BJ_Mission_Start">BJ_Mission_Cooldown_Won</span>
</li>
<li>
<span class="ect-tree-title" tree-item-name="BJ_Mission_Start">BJ_Mission_Cooldown_Won_Clear</span>
</li>
<li>
<span class="ect-tree-title" tree-item-name="BJ_Mission_Start">BJ_Mission_Cooldown_Lost</span>
</li>
<li>
<span class="ect-tree-title" tree-item-name="BJ_Mission_Start">BJ_Mission_Cooldown_Lost_Clear</span>
</li>
<li>
<span class="ect-tree-title" tree-item-name="BJ_Mission_Start">BJ_Quest_AskBet</span>
</li>
<li>
<span class="ect-tree-title" tree-item-name="BJ_Mission_Start">BJ_Quest_AskBet_Statistics</span>
</li>
<li>
<span class="ect-tree-title" tree-item-name="BJ_Mission_Start">BJ_Mission_Rules</span>
</li>
TL;博士:
我想要的逻辑是:
- 检查所有 li 元素及其文本(跨度)
- 根据标识符将组匹配在一起
- 用下划线分隔的前三个组应该具有相同的颜色
- A_B_C_123 应该具有与 A_B_C_321 相同的颜色,但 A_B_D_423 应该具有不同的颜色,依此类推。
希望它清晰而“简单”
解决方案
您可以执行以下操作。首先从innerHTML
每个元素中获取前三个组,然后检查对象中是否key
已经存在items
。如果是,则采用分配的颜色,如果不是,则获取新的未使用的随机颜色并将其分配给新创建的key
. 为了跟踪使用的颜色,我使用了一个数组 ( picked
)。
测试并运行(运行几次以查看颜色是如何分配的):
var picked = [];
var rand;
var items = {};
$('[tree-item-name]').each(function() {
let groups = $(this).html().split("_");
if(groups.length >= 3) {
let item = [groups[0], groups[1], groups[2]].join("_");
if(!items[item]) { // if the key doesn't exist
items[item] = { // make a new one
"color": randomColor()
};
}
$(this).css('background', items[item].color);
}
});
function randomColor() {
var back = ["#ffc0cb61","rgba(192,255,210,0.38)","rgba(192,220,255,0.38)","rgba(241,192,255,0.38)","rgba(192,240,255,0.38)","rgba(255,221,192,0.38)","rgba(231,255,192,0.38)"];
rand = back[Math.floor(Math.random() * back.length)];
if(picked.includes(rand)) { // if the color was already chosen before
rand = randomColor(); // generate a new one
} else {
picked.push(rand); // otherwise add the newly selected color to the tracker array
}
return rand;
}
body {
background-color: #444;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul>
<li>
<span class="ect-tree-title" tree-item-name="BJ_Mission_Start">BJ_Mission_Start</span>
</li>
<li>
<span class="ect-tree-title" tree-item-name="BJ_Mission_Start">BJ_Mission_Start_Go</span>
</li>
<li>
<span class="ect-tree-title" tree-item-name="BJ_Mission_Start">BJ_Mission_Cooldown_Won</span>
</li>
<li>
<span class="ect-tree-title" tree-item-name="BJ_Mission_Start">BJ_Mission_Cooldown_Won_Clear</span>
</li>
<li>
<span class="ect-tree-title" tree-item-name="BJ_Mission_Start">BJ_Mission_Cooldown_Lost</span>
</li>
<li>
<span class="ect-tree-title" tree-item-name="BJ_Mission_Start">BJ_Mission_Cooldown_Lost_Clear</span>
</li>
<li>
<span class="ect-tree-title" tree-item-name="BJ_Mission_Start">BJ_Quest_AskBet</span>
</li>
<li>
<span class="ect-tree-title" tree-item-name="BJ_Mission_Start">BJ_Quest_AskBet_Statistics</span>
</li>
<li>
<span class="ect-tree-title" tree-item-name="BJ_Mission_Start">BJ_Mission_Rules</span>
</li>
</ul>
推荐阅读
- ios - 如何将 PickerView 行内容显示到标签中
- c++ - 错误:没有用于调用 'objc_msgSend' 的匹配函数,候选函数不可行
- python - 如何在 python 中使用多处理而不复制大型只读字典
- java - Android Studio 中冻结的动画
- linux - 使用 shell 脚本将 .htm 文件从一个目录复制并附加到另一个目录中的 .htm 文件
- ios - 如何通过终端从真实的 iPhone 制作屏幕截图和截屏
- react-native - 运行 pod install 时反应原生 0.64.0 与 CocoaPods 1.10.0 不兼容
- amazon-web-services - AWS - 为无服务器创建策略,但不授予查看其他存储桶文件的权限
- elasticsearch - 查询嵌套字段返回结果,就好像没有嵌套映射一样
- python - 如何用两个类表示