2 votes

Pourquoi la propriété de transition ne fonctionne-t-elle pas pour box-shadow ?

Je veux créer un effet de bouton de survol lisse en faisant une transition d'un box-shadow . Pourquoi la transition au survol ne fonctionne-t-elle pas ? Quelles sont les erreurs qui pourraient l'empêcher de fonctionner comme prévu ?

body{
  background: rgb(180, 181, 180);
 }
.btn{
  height: 100px;
  width: 100px;
  margin: auto;
  border-radius: 20%;
  background: rgb(172, 171, 171);
  box-shadow: 3px 3px 5px rgb(84, 84, 84),-3px -3px 5px rgb(255, 255, 255);
  transition: box-shadow 1s ease-in-out;
  background-image: linear-gradient(135deg,rgb(215, 215, 215),rgb(84, 84, 84));
}

.btn:hover{
  transition: box-shadow 1s ease-in-out;
  box-shadow: inset 3px 3px 5px rgb(84, 84, 84),inset -3px -3px 5px rgb(255, 255, 255);
}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div class="btn"></div>
</body>
</html>

3voto

Temani Afif Points 69370

Vous ne pouvez pas avoir de transition entre inset et les ombres non insérées. Assurez-vous d'avoir toujours les deux et jouez avec l'opacité des couleurs :

 body{
  background: rgb(180, 181, 180); 
}
.btn{
  height: 100px;
  width: 100px;
  margin: auto;
  border-radius: 20%;
  background: rgb(172, 171, 171);
  box-shadow: 
    inset 3px 3px 5px rgb(84 84 84 / 0%),
    inset -3px -3px 5px rgb(255 255 255 / 0%),
     3px 3px 5px rgb(84 84 84),
    -3px -3px 5px rgb(255 255 255);
  transition: box-shadow 1s ease-in-out;
  background-image: linear-gradient(135deg,rgb(215, 215, 215),rgb(84, 84, 84));
}

.btn:hover{
  box-shadow: 
    inset 3px 3px 5px rgb(84 84 84),
    inset -3px -3px 5px rgb(255 255 255),
     3px 3px 5px rgb(84 84 84 / 0%),
    -3px -3px 5px rgb(255 255 255 / 0%);
}

 <div class="btn"></div>

Vous pouvez également jouer avec la position :

body{
 background: rgb(180, 181, 180); 
}
.btn{
  height: 100px;
  width: 100px;
  margin: auto;
  border-radius: 20%;
  background: rgb(172, 171, 171);
  box-shadow: 
    inset 0 0 0 rgb(84 84 84 / 0%),
    inset 0 0 0 rgb(255 255 255 / 0%),
     3px 3px 5px rgb(84 84 84),
    -3px -3px 5px rgb(255 255 255);
  transition: box-shadow 1s ease-in-out;
  background-image: linear-gradient(135deg,rgb(215, 215, 215),rgb(84, 84, 84));
}

.btn:hover{
  box-shadow: 
    inset 3px 3px 5px rgb(84 84 84),
    inset -3px -3px 5px rgb(255 255 255),
     0 0 0 rgb(84 84 84 / 0%),
     0 0 0 rgb(255 255 255 / 0%);
}

<div class="btn"></div>

1voto

Kameron Mayers Points 59

Si vous souhaitez définir un transition pour un inset box-shadow sur un élément le non :hovered état doit être également un inset box-shadow .

Vous pouvez contourner ce problème en créant un nouvel élément parent et en définissant une option inset box-shadow et un transition sur le nouvel élément.

.btn {
  box-shadow: 3px 3px 5px rgb(84, 84, 84), -3px -3px 5px rgb(255, 255, 255);
}

.btn-container:hover {
  box-shadow: inset 3px 3px 5px rgb(84, 84, 84), inset -3px -3px 5px rgb(255, 255, 255);
}

.btn-container {
  background-image: linear-gradient(135deg, rgb(215, 215, 215), rgb(84, 84, 84));
  transition: box-shadow 1s ease-in-out;
  height: 100px;
  width: 100px;
  border-radius: 20%;
  margin: auto;
}

body {
  background: rgb(180, 181, 180);
}

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <div class="btn-container">
    <div class="btn"></div>
  </div>
</body>

</html>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X