Контур CSS появляется в неожиданных местах

#css #outline

#css #контур

Вопрос:

Это может быть глупый вопрос, но эта вещь беспокоит меня больше, чем следовало бы. Общеизвестно, что Google Chrome <input> по умолчанию выделяет элементы, когда они сфокусированы. Мне не нравится его внешний вид по умолчанию, поэтому я реализовал свой собственный outline для focus селектора в своем CSS:

 #LoginForm input:focus {
    outline: #1F377A dotted 1px;
}
  

Оригинальная реализация Chrome выглядит следующим образом (обратите внимание на синий контур вокруг ввода текста):

Контур Chrome в фокусе

Но, используя мою собственную реализацию css, это выглядит так:

Мой контур

Почему мой контур отображается внутри текстового ввода, а не вокруг, как контур Chrome по умолчанию?

Это соответствующие строки css для моего элемента ввода:

 #LoginForm input {
    display: blocK;
    float: left;
    height: 24px;
    border: none;
    font-family: inherit;
    margin: 0px 0px 0px 4px;
}

#LoginForm input:focus {
    outline: red solid 1px;
}

#LoginForm .textInput {
    padding: 0px 2px 0px 2px;
    font-size: 9pt;
}
  

Единственное, что позволяет мне изменить между моим собственным контуром и контуром chrome, — это просто комментировать input:focus селектор и ничего больше. Я не хочу использовать границы, поскольку они фактически увеличивают размер элемента, а я этого не хочу.

Комментарии:

1. бьюсь об заклад, это не свойство outline, а что-то другое, возможно, граница с каким-то цветным затенением…

2. Тест -webkit-appearance: none; .

Ответ №1:

Если вы проверите инструменты разработчика Chrome, контур не является простым контуром размером 1 пиксель, а отображается как

 :focus {
    outline-color: -webkit-focus-ring-color;
    outline-style: auto;
    outline-width: 5px;
}

input:focus, textarea:focus, keygen:focus, select:focus {
    outline-offset: -2px;
}
  

Это то outline-offset , что вы ищете. Чтобы получить красный контур, просто добавьте его в свою таблицу стилей:

 :focus {
     outline-color: #f00;
}
  

Если вы также хотите использовать его для других элементов, используйте:

 .element:focus {
    outline-color: #f00;
    outline-style: auto;
    outline-width: 5px;
    outline-offset: -2px;
}
  

Вот JSFiddle, с которым можно поиграть.


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

Чтобы контур находился точно на границе (а не внутри нее), вы должны установить

 outline-offset: 0;
  

чтобы переопределить стили пользовательского агента Chrome.

Комментарии:

1. Это отлично работает! Спасибо! кстати, поскольку некоторые браузеры (например, midori или мобильные браузеры) не используют chrome pretty outline (auto), поэтому я использовал пунктирный контур (я использовал сплошной для наглядности в примере), но мне кажется странным, что свойство shorthand не принимаетзначение смещения. Я также должен отметить, что когда я использую auto в качестве стиля, мне не нужно указывать значение смещения: оно отображается на границе в Chrome и других браузерах (когда другие отображают его как dotted ), но не тогда, когда я использую пунктирные или другие стили. Может ли это быть ошибкой?

2. Я ничего не нашел о том, почему outline-offset он не является частью outline свойства. Что касается второй части вашего комментария. Он outline-offset все еще действует, даже если вы измените цвет и / или ширину. Чтобы получить 1px solid red контур из приведенного выше примера, вы должны явно outline-offset: 0; переопределить таблицу стилей пользовательского агента.