You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅在input获焦而非button获焦时为元素应用样式?

仅在input聚焦而非button聚焦时为父元素应用样式

你写的SCSS选择器逻辑有误,.div:focus-within:is(button)是试图选择本身是button且包含聚焦元素的div,这完全不符合需求——我们要实现的是:当div的聚焦状态来自内部的input,而非button时,为div设置样式。

方案1:纯CSS实现(现代浏览器支持)

利用:focus-within判断div内存在聚焦元素,再通过:not(:has(button:focus))排除button聚焦的场景,就能精准匹配input聚焦的情况:

.div:focus-within:not(:has(button:focus)) {
  // 示例样式:添加蓝色边框
  border: 2px solid #007bff;
  padding: 4px;
}

如果需要更严谨地限定只有input聚焦时才生效,可以补充:has(input:focus)条件:

.div:focus-within:has(input:focus):not(:has(button:focus)) {
  border: 2px solid #007bff;
  padding: 4px;
}

方案2:JavaScript辅助(兼容旧浏览器)

如果需要兼容不支持:has()选择器的旧版浏览器(如Firefox 108及更早版本),可以通过监听焦点事件手动控制类名:

JS代码

const container = document.querySelector('.div');
const input = container.querySelector('input');
const button = container.querySelector('button');

function toggleFocusClass() {
  container.classList.toggle('input-focused', document.activeElement === input);
}

input.addEventListener('focus', toggleFocusClass);
input.addEventListener('blur', toggleFocusClass);
button.addEventListener('focus', toggleFocusClass);
button.addEventListener('blur', toggleFocusClass);

对应SCSS

.div.input-focused {
  border: 2px solid #007bff;
  padding: 4px;
}

内容的提问来源于stack exchange,提问作者Get Off My Lawn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 22:12:10