在工作中,我们遇到了一个有趣的问题:我们有一个页面上有一个下拉列表,当所选选项更改时,从JSON变量的值中更新一系列项目的值。
HTML 是这样的(简化):
<select id="paises">
<option value="chile">Chile</option>
<option value="colombia">Colombia</option>
<option value="ecuador">Ecuador</option>
</select>
<div id="valores">
Pais: <span id="pais"></span><br/>
Teléfono: <span id="telefono"></span><br/>
Email: <span id="email"></span>
</div>
JSON 是这样的(简化的):
info = {
"chile": {
"nombre": "Chile",
"telefono": "123456789",
"email": "[email protected]"
},
"colombia": {
"nombre": "Colombia",
"telefono": "192837465",
"email": "[email protected]"
},
"ecuador": {
"nombre": "Ecuador",
"telefono": "987654321",
"email": "[email protected]"
}
}
JavaScript 代码与问题无关,但想法很简单:根据所选国家/地区,span
. 例如,如果选择智利,span
id 为“country”的将包含“Chile”,span
id 为“phone”的将显示“123456789”等。
现在该页面已移至新的 CMS,并且由于各种原因,我们可以使用的组件受到限制,并且它们都不允许我们嵌入 JavaScript(甚至不能嵌入),它们只允许我们嵌入 HTML 和 CSS。
所以问题是:如何模拟上述行为,但只使用 HTML+CSS 而没有任何 JavaScript 或 JSON?
关于 HTML 和 CSS,我们没有任何限制:我们可以根据需要重新排序/排列元素,我们可以添加新元素/删除现有元素,我们可以添加任意数量的代码......只要它不包含任何脚本,只是 HTML 和 CSS。
例如,我们终于找到了一个解决方案(我将在下面的答案中分享以获取灵感),将 替换select
为 list ul
,将 JSON 转换为 CSS(使用:before
and content
)并使用一系列input
隐藏的 s ......但是问题是它占用了太多空间,我们想知道是否会有不同的方法。
虽然是一个巧妙的解决方案,而不是空间问题,但我看到了两个缺点:
我建议你把你的建议转过来,把信息留在 html 正文中。像这样的东西:
这是我们找到的解决方案(我把它留在这里,以防它帮助人们看到我们正在寻找的东西和/或作为参考),尽管它的问题是它变得非常复杂(列表country 不仅是 3 个,而是 30 个),最终需要大量额外的代码。
当然可以用
:target
代替来做一些事情:checked
,它会简化事情(你可以全部更改label
为a
并避免所有复选框)。思路如下:
select
并模拟一个下拉列表。ul
input
类型;radio
li
,我们为我们在上一步中创建的每个ul
添加一个;label
input
:checked
和选择器~
,我们添加 CSS 规则,这些规则将根据当前选择的半径添加内容。代码最后看起来像这样:
仅使用 :target 选择器,可以稍微简化一下。