CSS:改变父母对孩子的关注


75

假设您有类似的内容:

<div class="parent">
    <input class="childInput" type="text" />
    <div class="sibling"></div>
</div>

当孩子获得焦点时,我想更改父母/兄弟姐妹的外观。做这样的事情有CSS技巧吗?

编辑:

我的问题的原因如下:

我正在创建一个需要可编辑文本字段的Angular应用。在单击之前,它应该看起来像一个标签,此时它应该看起来像是普通的文本输入。我基于:focus设置了文本字段样式,以实现此效果,但是文本被文本输入的边界所截断。我还使用ng-show,ng-hide,ng-blur,ng-keypress和ng-click在标签和基于模糊,按键和点击的文本输入之间进行切换。除一件事外,此方法运行良好:标签的ng-click =“ setEdit(this,$ event)”将ng-show和ng-hide使用的编辑布尔值更改为true后,它使用jQuery调用.select()文字输入。但是,直到ng-click完成后,所有内容才被$ digestd,因此文本输入再次失去焦点。由于文字输入从未真正获得焦点,

编辑:

这是该问题的一个小例子:http ://plnkr.co/edit/synSIP? p= preview


javascript没有选择吗?
安迪2014年

1
仅使用CSS不能做到这一点,您需要使用js。
Tushar 2014年

是的,但是我很好奇它是否可以通过样式来完成。我将添加一个编辑以弄清楚我提出问题的原因。
AaronF 2014年

1
仅使用CSS不能完成父级匹配。仅当元素与定义元素相邻时,才能进行同级匹配。见developer.mozilla.org/en-US/docs/Web/CSS/...
haim770

Answers:


214

您现在可以在纯CSS中完成此操作,因此不需要JavaScript😁

新的CSS伪类:focus-within将对此类情况有所帮助,并在人们使用制表键进行导航时提供可访问性,而在使用屏幕阅读器时会很常见。

.parent:focus-within {
  border: 1px solid #000;
}

:focus-within伪类匹配那些元素本身匹配:focus或后代匹配:focus的元素。


我可以用吗...

您可以通过访问http://caniuse.com/#search=focus-within来检查哪些浏览器支持此功能


演示版

fieldset {
  padding: 0 24px 24px !important;
}

fieldset legend {
  opacity: 0;
  padding: 0 8px;
  width: auto;
}

fieldset:focus-within {
  border: 1px solid #000;
}

fieldset:focus-within legend {
  opacity: 1;
}
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" rel="stylesheet" />

<div class="container">
  <form>
    <fieldset>
      <legend>Parent Element</legend>
      <div class="form-group">
        <label for="name">Name:</label>
        <input class="form-control" id="name" placeholder="Enter name">
      </div>
      <div class="form-group">
        <label for="email">Email:</label>
        <input type="email" class="form-control" id="email" placeholder="Enter email">
      </div>
    </fieldset>
  </form>
</div>


18
真的很棒!
杰米·卡特

3
IE浏览器应该踢了。RIP
Mike Aron


哎呀!没注意到。抱歉。
Anurag Hazra

@AnuragHazra没问题。我更新了帖子以使其现在更加清晰,并包括浏览器支持表的图像。
JJB

5

没有机会用CSS做到这一点。CSS只能样式化兄弟姐妹,孩子等,而不是父母。

您可以像这样简单地使用JS:

<style>
.parent {background: green}
.focused {background: red;}
</style>
<div class="parent">
    <input class="childInput" type="text" />
    <div class="sibling"></div>
</div>

<script>
$('.parent > *')
    .focus(function() {
        $('.parent').addClass('focused');
    })
    .blur(function() {
        $('.parent').removeClass('focused');
    });
</script>

http://jsfiddle.net/C4bZ6/

此代码接受所有的直接子代,.parent如果您关注其中的一个,则将类focused添加到父代。模糊时,将删除此类。


感谢您的回答。我添加了关于问题原因的编辑:我想在标签和焦点/模糊输入之间切换,并且在Angular中遇到了一些问题。
AaronF 2014年

这不是普通的JS,而是使用jQuery。
MrVanilla '19

1

您可以使用纯CSS来使文本输入看起来像不是文本输入,除非重点突出

http://jsfiddle.net/michaelburtonray/C4bZ6/13/

input[type="text"] {
    border-color: transparent;
    transition-duration: 600ms;
    cursor: pointer;
    outline-style: none;
    text-overflow: ellipsis;
}

input[type="text"]:focus {
    border-color: initial;
    cursor: auto;
    transition-duration: 300ms;
}

谢谢。我实际上尝试过,但是遇到了一些问题:“ ...我根据:focus设置了文本字段的样式,以实现此效果,但是文本被文本输入的边界所截断了。。。” 显示省略号肯定比剪辑好,但如果可能的话,我想看一看。我刚刚问过的一个相关问题在这里:stackoverflow.com/questions/24289266/…,如果您有兴趣。
AaronF 2014年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.