You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

CSS display:none/block在HTML FORM内失效问题咨询

问题:纯CSS语言切换器在FORM标签内无法生效?

你遇到的这个问题其实是CSS选择器的作用范围导致的——咱们先拆解一下原因:

你的代码里用了兄弟选择器(~来控制语言内容的显示,比如#eng:target ~ .eng,但这个选择器只能选中#eng处于同一个父元素下的后续兄弟元素。而<form>是一个独立的容器,里面的.tab元素属于form的子元素,和外面的#eng/#deu锚点根本不是同一个父级的兄弟,所以你的选择器根本找不到form内部的元素,自然就不会生效啦。

解决方案:扩展选择器范围,覆盖form内部元素

我们只需要调整CSS选择器,明确指定要同时选中form外的兄弟元素和form内的子元素,就能解决这个问题。这里有两种可行的写法:

写法1:明确指定form内的元素(兼容性好)

修改你的CSS代码如下:

/* 默认隐藏所有tab,显示默认的英文内容 */
.tab { display: none; }
.default-tab { display: block; }

/* 切换到英文时:显示所有.eng元素,隐藏.deu元素 */
#eng:target ~ .eng,
#eng:target form .eng {
  display: block;
}
#eng:target ~ .deu,
#eng:target form .deu {
  display: none;
}

/* 切换到德文时:显示所有.deu元素,隐藏.eng元素 */
#deu:target ~ .deu,
#deu:target form .deu {
  display: block;
}
#deu:target ~ .eng,
#deu:target form .eng {
  display: none;
}

这样不管语言内容是在form外面还是里面,只要带有.eng/.deu类,就能被正确控制显示状态。

写法2:用:has()选择器(更简洁,需现代浏览器支持)

如果你的项目不需要兼容旧版浏览器,可以用CSS的:has()选择器实现全局控制,代码更简洁:

.tab { display: none; }
.default-tab { display: block; }

/* 当#eng被激活时,全局显示.eng,隐藏.deu */
body:has(#eng:target) .eng { display: block; }
body:has(#eng:target) .deu { display: none; }

/* 当#deu被激活时,全局显示.deu,隐藏.eng */
body:has(#deu:target) .deu { display: block; }
body:has(#deu:target) .eng { display: none; }

:has()选择器可以检测父容器下的目标状态,直接控制全局所有对应类的元素,不用再逐个指定form内外的选择器。

测试修改后的完整代码

把调整后的CSS和你的原有HTML结合,就能看到form内外的语言内容都能正常切换了:

<a href="#eng"><img src="http://icons.iconarchive.com/icons/custom-icon-design/flat-europe-flag/48/United-Kingdom-icon.png"></a> 
<a href="#deu"><img src="http://icons.iconarchive.com/icons/custom-icon-design/flat-europe-flag/48/Germany-icon.png"></a> 
<a id="eng"></a> 
<a id="deu"></a> 

<div class="tab eng default-tab">Some English content</div> 
<div class="tab deu">Was auf deutsch.</div>

<form>
  <input type="radio" name="gender" value="male" checked> 
  <div class="tab eng default-tab">Male</div> 
  <div class="tab deu">Männlich</div> 
  <br> 
  <input type="radio" name="gender" value="female"> 
  <div class="tab eng default-tab">Female</div> 
  <div class="tab deu">Weiblich</div> 
</form> 

<hr> 
<div class="tab eng default-tab">Male</div> 
<div class="tab deu">Männlich</div>

内容的提问来源于stack exchange,提问作者yello

火山引擎 最新活动