1
resposta

Regra do :hover não sobrepõe regra de animação e vertical-align não é aplicado

Fala pessoal,

Neste exercício cada div tem um padrão de animação e uma regra no CSS determina que, no :hover, a animação seja pausada e o background-color mude para darkviolet.

A animação do div número V, no entanto, que transiciona por 5 cores diferentes, não está respeitando a regra do :hover. Apesar da animação ser interrompida, ela pára na cor que estava no momento, e não muda para darkviolet, como a regra do :hover pede.

No meu entendimento a especificidade está correta. O .shape:hover, além de estar depois na ordem do CSS, tem uma especificidade maior que .shape.

Uma dúvida secundária: eu tentei centralizar o conteúdo dos div's. O text-align funcionou sem problemas, como sempre, mas eu ainda não consegui me entender com o vertical-align. Tentei colocar um h1 dentro do div e aplicar a regra a esse, além de aplicar no prório div. Também tentei aplicar no .container. Nada funcionou.

Conseguem saber o que eu não estou enxergando?

Segue o CodePen.io e abaixo o código.

Obrigado!

HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link href="https://fonts.googleapis.com/css?family=Crimson+Text:400,400i,600|Open+Sans+Condensed:700" rel="stylesheet">
    <link rel="stylesheet" href="transition.css">
    <title>Transition</title>
</head>
<body>
    <div class="container">
        <div class="shape one"><h1>I</h1></div>
        <div class="shape two"><h1>II</h1></div>
        <div class="shape three"><h1>III</h1></div>
        <div class="shape four"><h1>IV</h1></div>
        <div class="shape five"><h1>V</h1></div>
    </div>
</body>
</html>

CSS

* {
    box-sizing: border-box;
    margin: 0;
}
.container {
    height: 100vh;
    max-width: 50vw;
    margin: 0 auto;
    border: 2px solid hotpink;
}
.shape {
    height: 20vh;
    width: calc(10vw - 0.8px);
    border: 2px solid black;
    float: left;
    background-color: lightgray;
    font-family: 'Crimson Text', serif;
    font-size: 2em;
    text-align: center;
    vertical-align: middle;
    transition: background-color 0.5s;
}
h1 {
    vertical-align: middle;
}
.one {
    animation: gira 2s infinite linear alternate;
}
@keyframes gira {
    0% {
        transform: rotate(0);
    }
    50% {
        transform: rotate(180deg);
    }
    100% {
        transform: rotate(360deg);
    }
}
.two {
    position: relative;
    animation: quica 0.5s infinite alternate;
}
@keyframes quica {
    from {
        top: 0;
    }
    to {
        top: 10em;
    }
}
.three {
    animation: arredonda 0.5s infinite alternate;
}
@keyframes arredonda {
    from {
        border-radius: 0;
    }
    to {
        border-radius: 50%;
    }
}
.four {
    animation: encolhe 3s infinite alternate-reverse ease-out;
}
@keyframes encolhe {
    from {
        transform: scale(0);
    }
    to {
        transform: scale(1);
    }
}
.five {
    animation: aparece 1s infinite linear;
}
@keyframes aparece {
    0% {
        background-color: lightgray;
    }
    25% {
        background-color: deepskyblue;
    }
    50% {
        background-color: gold;
    }
    75% {
        background-color: olive;
    }
    100% {
        background-color: crimson;
    }
}
.shape:hover {
    animation-play-state: paused;
    background-color: darkviolet;
}

Abraços,

Maurice

1 resposta

Observe que quando a animation-play-state é colocado em ''paused'', a animação é pausada. O estado da animação continua sendo aplicado continuamente, por exemplo, se eu pausei num momento em que o estado era background-color: blue, esse estado será aplicado continuamente.

Uma forma que encontrei foi especificando ainda mais o CSS e retirando a animação. Daí, adicionei:

.five:hover{
    animation: none;
    background-color: darkviolet;
}

Isso daí funciona... Só não é algo elegante.