CSS 关注子元素改变父元素

Posted

技术标签:

【中文标题】CSS 关注子元素改变父元素【英文标题】:CSS focus on child element change a parent element 【发布时间】:2016-12-03 08:12:30 【问题描述】:

我想在表单域内设置一个带有标签和输入的表单,当我在输入中写一些东西(可能有焦点)时,我希望边框以一些蓝色点亮。现在我有这样的东西:

html

<div class="login-form-field">
  <label for="email" class="login-form-label">Email:</label>
  <input class="login-form-input" autofocus="autofocus" type="email" value="" name="user[email]" id="user_email">
</div>

CSS

.login-form-input
  margin-left: 20px;
  width: 90%;
  outline: none;
  border: none;
  -webkit-box-shadow: none;
  -moz-box-shadow: none;
  box-shadow: 0 0 0px 1000px white inset;

.login-form-label 
  font-size: 13px;
  font-weight: 300;
  padding-left: 20px;

.login-form-field
  width: 100%;
  border-radius: 0px;
  height: 6rem;
  border: 0.5px solid grey;
  box-shadow: 0px 0px 0px;

我已经尝试选择父级进行一些更改以及我在谷歌上找到的其他内容。我得到的最接近的是当鼠标悬停在它上方时用蓝色突出显示:悬停,但我需要颜色保持不变,因为我选择了输入。

.login-form-field:hover 
  border-color: blue !important;

这是JSFiddle,如果有人可以提供帮助,我将不胜感激!

【问题讨论】:

【参考方案1】:

虽然这是一个旧答案。我正在回答这个问题,所以任何登陆这里的人都可以只使用 CSS 来实现这一点。

使用 CSS3 伪元素:focus-within

你可以这样做:

form:focus-within 
  border-color: blue !important;

【讨论】:

没有focus-with!!【参考方案2】:

您现在可以在纯 CSS 中执行此操作,因此不需要 javascript

新的 CSS 伪类 :focus-within 将有助于解决此类情况,并有助于提高人们使用制表符进行导航时的可访问性,这在使用屏幕阅读器时很常见。

.login-form-field:focus-within 
  border-color: blue !important;


:focus-within 伪类匹配自身的元素 匹配 :focus 或具有匹配 :focus 的后代。

你可以查看哪些浏览器支持这个http://caniuse.com/#search=focus-within

【讨论】:

【参考方案3】:

与 jquery 反应:

$( document ).ready(function() 
    console.log( "ready!" );

    $('.login-form-input').focus(function() 
         $(this).parent().css( "border", "#99f 2px solid" );
    );

    $('.login-form-input').focusout(function() 
         $(this).parent().css( "border", "" );
    );

);

【讨论】:

jsfiddle.net/7AaDc/220 感谢您的帮助!它有效并且根本没有弄乱代码,我认为我可以在 css 中做到这一点而不会弄得一团糟哈哈【参考方案4】:

您可以这样做,在其中添加一个额外的div,绝对定位,作为边框,......并且不需要脚本。

.login-form-input 
  margin-left: 20px;
  width: 90%;
  outline: none;


.login-form-label 
  font-size: 13px;
  font-weight: 300;
  padding-left: 20px;


.login-form-field 
  position: relative;
  width: 100%;
  border-radius: 0px;
  height: 6rem;
  box-shadow: 0px 0px 0px;

.login-form-field input ~ .login-form-field-border 
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  box-sizing: border-box;  
  border: 0.5px solid grey;
  z-index: -1

.login-form-field input:focus ~ .login-form-field-border 
  border: 2px solid blue;  
<div class="login-form-field">
  <label for="email" class="login-form-label">Email:</label>
  <input class="login-form-input" autofocus="autofocus" type="email" value="" name="user[email]" id="user_email">
  <div class="login-form-field-border"></div>
</div>

【讨论】:

感谢您的帮助!【参考方案5】:

CSS 没有对父选择的原生支持。如果您的目标是让.login-form-fieldfocus 上有一个蓝色边框,那么您将不得不依赖 JavaScript 来添加相应的 CSS。

以下 CSS:

.login-form-field.highlight 
  border-color: blue;

用下面的jQuery

$('.login-form-field').hover(function() 
    $(this).toggleClass('highlight');
);

会实现这个目标。我应该注意,这里肯定不需要 jQuery。这正是我喜欢使用的。

【讨论】:

@nicael 是的;对于更具体的事件,我可能会使用类似于$('.login-form-input').focus(function() $(this).parent().addClass('highlight'); ).blur(function() $(this).parent().removeClass('highlight'); ); 的东西,因为这只会在确切的input 焦点上触发。 感谢您的帮助!【参考方案6】:

如果您想在输入处于活动状态时赋予边框颜色,您可以这样添加:

.login-form-input:focus 
  border:1px solid blue;

【讨论】:

以上是关于CSS 关注子元素改变父元素的主要内容,如果未能解决你的问题,请参考以下文章

CSS 子元素宽度变宽时,如何撑开父元素?

如何使用CSS让img跟父元素的宽或者高自适应

CSS如何只改变父元素背景透明度不改变子元素透明度

CSS减轻父鼠标悬停的子元素

css父元素和子元素,我点击父元素让其隐藏,但为啥点击子元素也会隐藏?

同级DIV占满父元素,CSS。