В настоящее время я практикуюсь в CSS-анимации, переходах и разрабатываю множество кнопок, но на некоторых кнопках сталкиваюсь с ошибками. Я пытаюсь реализовать эффект наведения на кнопку, но эффект работает неправильно.
Более подробно, overflow:hidden вызывает скрытие, в частности, нижней и правой границ. Возможная причина может заключаться в том, что родительский тег body имеет свойство CSS Grid с выравниванием элементов по центру. Я делаю кнопки, как показано в моем фрагменте кода, и более полный пример в моем Codepen .
Просмотрите фрагмент кода, чтобы увидеть эффект в действии.
В частности, я говорю о кнопке с классом border-4-but. В идеале границы разрастаются следующим образом:
top: расти слева направо и появиться на светright: сверху внизbottom: слева направоleft: снизу вверхПробовал различные свойства переполнения, чтобы решить проблему, но безрезультатно, любые объяснения/альтернативы будут оценены по достоинству.
.border-4-but {
margin-top: 20px;
/* border : solid 3px ; */
position: relative;
color: deepskyblue;
padding: 10px 20px;
overflow: hidden;
}
.border-4-but:before {
content: "";
position: absolute;
top: 0;
left: -100%;
height: 100%;
width: 100%;
border-top: solid 2px;
transition: all 1s;
}
.border-4-but:after {
content: "";
position: absolute;
top: -100%;
left: 0;
width: 100%;
height: 100%;
border-right: solid 2px;
transition: all 1s;
}
.border-4-but span:after {
content: "";
position: absolute;
top: 0;
left: 100%;
width: 100%;
height: 100%;
border-bottom: solid 2px;
transition: all 1s;
}
.border-4-but span:before {
content: "";
position: absolute;
top: 100%;
left: 0;
height: 100%;
width: 100%;
border-left: solid 2px;
transition: all 1s;
}
.border-4-but:hover:before,
.border-4-but:hover:after,
.border-4-but:hover span:after,
.border-4-but:hover span:before {
top: 0;
left: 0;
}<body>
// some other buttons
<a class = "border-4-but"><span class = "border-4-span"></span>hover here</a>
// some other buttons
</body>





Все ваши псевдоэлементы :before и :after должны иметь атрибут box-sizing: border-box;. Это заставит систему поместить границу внутри элемента, а не снаружи (так сказать).
Итак, ваш код должен быть примерно таким:
.border-4-but:before{
content : "";
position : absolute;
top : 0;
left : -100%;
height : 100%;
width : 100%;
border-top : solid 2px;
box-sizing: border-box;
transition : all 1s;
}
.border-4-but:after{
content : "";
position : absolute ;
top : -100%;
left : 0;
width : 100%;
height : 100%;
border-right : solid 2px;
box-sizing: border-box;
transition : all 1s;
}
.border-4-but span:after{
content : "";
position : absolute;
top : 0;
left : 100%;
width : 100%;
height : 100%;
border-bottom : solid 2px;
box-sizing: border-box;
transition : all 1s;
}
.border-4-but span:before{
content : "";
position : absolute;
top : 100%;
left : 0;
height : 100%;
width : 100%;
border-left : solid 2px;
box-sizing: border-box;
transition : all 1s;
}
Надеюсь это поможет!
Помимо ответа BlenderTimer, overflow:hidden не будет работать с inline элементами. Вам нужно будет добавить display:inline-block в этот <a> контейнер, чтобы границы отображались только тогда, когда они появятся.
.border-4-but {
display: inline-block;
margin-top: 20px;
/* border : solid 3px ; */
position: relative;
color: deepskyblue;
padding: 10px 20px;
overflow: hidden;
}
.border-4-but:before {
content: "";
position: absolute;
top: 0;
left: -100%;
height: 100%;
width: 100%;
border-top: solid 2px;
box-sizing: border-box;
transition: all 1s;
}
.border-4-but:after {
content: "";
position: absolute;
top: -100%;
left: 0;
width: 100%;
height: 100%;
border-right: solid 2px;
box-sizing: border-box;
transition: all 1s;
}
.border-4-but span:after {
content: "";
position: absolute;
top: 0;
left: 100%;
width: 100%;
height: 100%;
border-bottom: solid 2px;
transition: all 1s;
box-sizing: border-box;
}
.border-4-but span:before {
content: "";
position: absolute;
top: 100%;
left: 0;
height: 100%;
width: 100%;
border-left: solid 2px;
transition: all 1s;
box-sizing: border-box;
}
.border-4-but:hover:before,
.border-4-but:hover:after,
.border-4-but:hover span:after,
.border-4-but:hover span:before {
top: 0;
left: 0;
}<a class = "border-4-but"><span class = "border-4-span"></span>hover here</a>