Я впервые спрашиваю, так что извините, если я спрашиваю нечетко. Я работаю с HTML и CSS, и я не знаю, почему, когда я устанавливаю наведение курсора на элемент div, чтобы создать вокруг него рамку, граница появляется, но элемент div немного смещается вниз, и это моя проблема. Кто-нибудь еще иметь это? Я выложу фото CSS-кода и буду рад, если вы мне поможете, спасибо.
`.navbar{
height: 48.48px;
width: 70px;
float: right;
margin: 10px 5.57%;
color: white;
text-align: center;
cursor: pointer;
box-sizing: border-box;
}
.text1{
color: white;
cursor: pointer;
}
.navbar :hover{
border: 1.5px white solid;
border-radius: 10px;
}
Я пытался сделать рамку вокруг div, когда на нем находится курсор при наведении курсора, хотя граница появляется, div немного перемещается.
Я даже пробовал размер коробки, но это не сработало.
Кстати, .5
пикселя не существует.
Использование границ для обозначения состояния имеет некоторые оговорки, главным образом, граница не просто плавает вокруг элемента, она добавляется к его размерам, которые в результате будут немного перемещаться при наведении на него курсора. Для этого есть несколько простых решений. Что вы выберете, может зависеть от контекста.
Демонстрация всех приведенных ниже решений: https://jsfiddle.net/r5eafkv9/
Примечание. В своих примерах я использую button
, но все это применимо независимо от того, какой элемент вы стилизуете. Это может быть гиперссылка, div
или что-то еще.
outline
вместо border
.Границы рисуются внутри границ элемента и добавляют к его окончательным размерам (по крайней мере, в блочной модели CSS по умолчанию; мы вернемся к этому*). Однако контуры рисуются вокруг элемента и могут также перекрываться, а не смещать соседние элементы. Вы можете думать о них как о абсолютно позиционированных относительно кнопки (или любого другого элемента). Они не взаимодействуют с блочной моделью, когда дело касается размеров/позиционирования.
.btn.outline:hover {
outline: 4px darkgreen solid;
}
Добавьте прозрачный border
в состояние по умолчанию. Пока это та же ширина, что и для состояния :hover
, размеры будут такими же.
.btn.transparent {
border: 4px transparent solid;
}
.btn.transparent:hover {
border: 4px darkgreen solid;
}
box-sizing
на border-box
.Это указывает блочной модели CSS учитывать отступы и границы при расчете ширины и высоты элементов, в отличие от блочной модели CSS по умолчанию (content-box
), и в этом случае добавление отступов или границ к элементу добавит к его окончательному результату. размеры экрана, и их необходимо учитывать.
.btn.borderbox {
box-sizing: border-box;
}
.btn.borderbox:hover {
box-sizing: border-box;
border: 4px darkgreen solid;
}
Я не могу выразить важность понимания блочной модели CSS. На самом деле это не так уж и сложно, и предварительное изучение сэкономит вам бесконечные часы, которые в противном случае были бы потрачены на изучение методом проб, когда вы застреваете в подобных случаях, когда в игру вступает блочная модель. Также следует знать, что это самый простой вариант ответа на вопрос «почему так?» быть «потому что коробочная модель».
Просто личная рекомендация, не обязательно евангельская, но первые строки почти каждой таблицы стилей, которую я когда-либо писал, следующие:
* {
margin: 0px;
padding: 0px;
box-sizing: border-box;
}
Обнуление margin
и padding
не является обязательным, но если вы, как и я, помешаны на контроле, вы оцените чистый лист. Более важным моментом (по крайней мере для меня) является правило box-sizing: border-box
, которое упрощает большую часть сложности блочной модели. Вы хотите, чтобы div
имел ширину 300 пикселей?... width: 300px;
Готово. Не всегда так бывает с поведением по умолчанию (box-sizing: content-box
).
Приятного кодирования!
Что касается комментария Paulie_D о половинных пикселях: они могут просто округляться большую часть времени, но они на 100% являются действительным CSS. А когда задействовано аппаратное ускорение (например, translate3d
), они вполне могут иметь реальный эффект, а не просто округление до полного пикселя. Разумно ли использовать их явно — это другой вопрос (это может привести к тому, что элементы будут выглядеть размытыми, например, когда они занимают половину пикселя, и опять же, их также можно просто округлить (я думаю, обычно в большую сторону)).
Примените прозрачную рамку той же ширины в состоянии без наведения. Таким образом, элемент будет одинакового размера как при наведении, так и при отсутствии наведения.
body {
margin: 1em;
}
nav {
float: right;
text-align: center;
cursor: pointer;
background: blue;
padding: 0.5em;
display: flex;
flex-direction: column;
margin-bottom: 1em;
}
nav a {
color: white;
text-decoration: none;
padding: 4px 8px;
}
nav a:hover {
border: 1px solid white;
border-radius: 3px;
background: rgb(0 0 0 / 0.1);
}
.n2 {
margin-top: 1em;
background: green;
}
.n2 a {
border: 1px solid transparent;
}
hr {
clear: both;
}
<nav>
<a href = "">One</a>
<a href = "">Two</a>
<a href = "">Three</a>
<a href = "">Four</a>
<a href = "">Five</a>
</nav>
<p>The problem</p>
<hr>
<nav class = "n2">
<a href = "">One</a>
<a href = "">Two</a>
<a href = "">Three</a>
<a href = "">Four</a>
<a href = "">Five</a>
</nav>
<p>The solution</p>
Примените прозрачную рамку к элементу, на который вы хотите навести курсор, и в состоянии наведения примените цвет границы к элементу наведения.
body {
margin: 1em;
}
nav {
display: flex;
flex-direction: row;
text-align: center;
cursor: pointer;
background: blue;
padding: 0.5em;
margin-bottom: 1em;
gap: 10px;
}
nav a {
color: white;
text-decoration: none;
padding: 4px 8px;
border:1px solid transparent;
border-radius: 3px;
}
nav a:hover {
border-color: white;
background: rgb(0 0 0 / 0.1);
}
.n2 {
margin-top: 1em;
background: green;
}
.n2 a {
border: 1px solid transparent;
}
hr {
clear: both;
}
<nav>
<a href = "">One</a>
<a href = "">Two</a>
<a href = "">Three</a>
<a href = "">Four</a>
<a href = "">Five</a>
</nav>
Вопросы, требующие помощи по коду, должны включать кратчайший код, необходимый для его воспроизведения, в самом вопросе, желательно в фрагменте стека с использованием значка
<>
. См. Как создать минимальный воспроизводимый пример.