CSS: изменение родителя в фокусе ребенка

Скажем, у вас есть что-то вроде:

<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 все будет $ digest'd, поэтому текстовый ввод снова теряет фокус. Поскольку текстовый ввод никогда не получает фокуса, использование ng-blur для возврата назад к показу метки не работает. Пользователь должен щелкнуть по текстовому вводу, а затем снова щелкнуть его, чтобы вернуться к показу метки.

Редактировать:

Здесь приведен пример проблемы: http://plnkr.co/edit/synSIP?p=preview

Ответы

Ответ 1

Теперь вы можете сделать это в чистом CSS, поэтому JavaScript не нужен.

Новый псевдо-класс CSS :focus-within поможет в подобных случаях и поможет с доступностью, когда люди используют табуляцию для навигации, обычную при использовании программ чтения с экрана.

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

Псевдокласс класса focus-in сопоставляет элементы, которые либо сами по себе соответствуют: фокус, либо у потомков, которые соответствуют: focus.

Вы можете проверить, какие браузеры поддерживают этот http://caniuse.com/#search=focus-within

Ответ 2

Нет никакого шанса, как это сделать с помощью 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 класс добавляется к родительскому. При размытии этот класс удаляется.

Ответ 3

Вы можете использовать чистый 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;
}

Ответ 4

Попробуйте атрибут contenteditible. Однако это может потребовать больше работы, чтобы превратить его в пригодные для использования данные формы.

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

<span class="parent" contenteditable>Click me</span>