Страницы

Поиск по вопросам

понедельник, 25 ноября 2019 г.

Как сделать необычную рамку при наведении на элемент?


Как лучше реализовать такую рамку при наведении на элемент? 


    


Ответы

Ответ 1



Для этого можно использовать псевдоэлементы :before и :after. Например, так: html, body { padding: 10px; margin: 0px; background: #1a244e; } .block { width: 176px; height: 246px; position: relative; z-index: 1; margin: 20px auto; } .block:before, .block:after { content: ''; position: absolute; display: block; width: 75px; height: 195px; border: green solid 2px; transition: all 0.4s ease-in-out; opacity: 0; visibility: hidden; } .block:before { right: -5px; top: -5px; border-left: none; border-bottom: none; } .block:after { left: -5px; bottom: -5px; border-right: none; border-top: none; } .block:hover:before, .block:hover:after { opacity: 1; visibility: visible; }
Можно немного поиграться со стилями и получить разные эффекты. Вариант #1 с transform: translate(): html, body { padding: 10px; margin: 0px; background: #1a244e; } .block { width: 176px; height: 246px; background: #000; position: relative; z-index: 1; cursor: pointer; margin: 20px auto; } .block:before, .block:after { content: ''; position: absolute; display: block; width: 75px; height: 195px; border: green solid 2px; transition: all 0.4s ease-in-out; opacity: 0; visibility: hidden; } .block:before { right: -5px; top: -5px; transform: translate(10px, -10px); border-left: none; border-bottom: none; } .block:after { left: -5px; bottom: -5px; transform: translate(-10px, 10px); border-right: none; border-top: none; } .block:hover:before, .block:hover:after { opacity: 1; visibility: visible; transform: translate(0, 0); }
Вариант #2 с transform: translate(): html, body { padding: 10px; margin: 0px; background: #1a244e; } .block { width: 176px; height: 246px; background: #000; position: relative; z-index: 1; cursor: pointer; margin: 20px auto; } .block:before, .block:after { content: ''; position: absolute; display: block; width: 75px; height: 195px; border: green solid 2px; transition: all 0.4s ease-in-out; z-index: -1; opacity: 0; visibility: hidden; } .block:before { right: -5px; top: -5px; border-left: none; border-bottom: none; transform: translate(-10px, 10px); } .block:after { left: -5px; bottom: -5px; border-right: none; border-top: none; transform: translate(10px, -10px); } .block:hover:before, .block:hover:after { opacity: 1; visibility: visible; transform: translate(0, 0); }
Вариант #3 с width и height: html, body { padding: 10px; margin: 0px; background: #1a244e; } .block { width: 176px; height: 246px; background: #000; position: relative; z-index: 1; cursor: pointer; margin: 20px auto; } .block:before, .block:after { content: ''; position: absolute; display: block; width: 0px; height: 0px; border: green solid 2px; transition: all 0.4s ease-in-out; opacity: 0; visibility: hidden; } .block:before { right: -5px; top: -5px; border-left: none; border-bottom: none; } .block:after { left: -5px; bottom: -5px; border-right: none; border-top: none; } .block:hover:before, .block:hover:after { width: 75px; height: 195px; opacity: 1; visibility: visible; }
Вариант #4 на SVG: html, body { padding: 10px; margin: 0px; background: #1a244e; } .block { width: 176px; height: 246px; position: relative; z-index: 1; margin: 20px auto; } .border { width: 186px; height: 256px; display: block; position: absolute; left: -5px; bottom: -5px; } .border polyline { stroke: green; stroke-width: 2px; stroke-dasharray: 271; stroke-dashoffset: 271; transition: all 0.6s ease-in-out; } .block:hover .border polyline { stroke-dashoffset: 0; opacity: 1; visibility: visible; }
UPDATE Вариант #5 с вынесением рамки в отдельные блоки и использованием transform: translate(): html, body { overflow: hidden; padding: 10px; margin: 0px; background: #1a244e; } .block { width: 176px; height: 246px; position: relative; z-index: 1; margin: 20px auto; } .border { position: absolute; left: -5px; top: -5px; right: -5px; bottom: -5px; } .border:before, .border:after { content: ''; position: absolute; display: block; background: green; transition: all 0.2s ease-in-out; opacity: 0; visibility: hidden; } .border:before { width: 75px; height: 2px; } .border:after { width: 2px; height: 195px; } .border.border-rt:before, .border.border-rt:after { right: 0px; top: 0px; } .border.border-lb:before, .border.border-lb:after { left: 0px; bottom: 0px; } .border.border-rt:before { transform: translate(100%, 0); } .border.border-rt:after { transform: translate(0, -100%); } .border.border-lb:before { transform: translate(-100%, 0); } .border.border-lb:after { transform: translate(0, 100%); } .block:hover .border:before, .block:hover .border:after { opacity: 1; visibility: visible; transform: translate(0, 0); }


Ответ 2



Пример анимации с помощью одновременного смешения четырёх линий вдоль границ изображения. Ниже поясняющая схема достижения эффекта: body { background: #2c3e50; } .box { width: 176px; height: 246px; position: relative; background-image: url("http://i.imgur.com/15ofDrj.png"); display: inline-block; cursor: pointer; opacity: 0.8; } .box:hover { opacity: 1; -webkit-transition: all .8s ease-in-out; transition: all .8s ease-in-out; } .box svg { position: absolute; top: 0; left: 0; } .box svg line { stroke-width: 4; stroke: skyblue; fill: none; -webkit-transition: all .8s ease-in-out; transition: all .8s ease-in-out; } .box:hover svg line { -webkit-transition-delay: 0.1s; transition-delay: 0.1s; } .box svg line.top, .box svg line.bottom { stroke-dasharray: 176 176; } .box svg line.left, .box svg line.right { stroke-dasharray: 246 246; } .box:hover svg line.top { -webkit-transform: translateX(-352px); transform: translateX(-352px); } .box:hover svg line.bottom { -webkit-transform: translateX(352px); transform: translateX(352px); } .box:hover svg line.left { -webkit-transform: translateY(492px); transform: translateY(492px); } .box:hover svg line.right { -webkit-transform: translateY(-492px); transform: translateY(-492px); }
Более подробно о реализации данного эффекта здесь

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

Отправить комментарий