Если есть известная связь между дочерним и родительским элементом, вы можете легко применить перевод.
Вот базовый пример
.box {
height:100px;
width:50px;
margin:50px;
border:3px solid;
position:relative;
}
.box:before {
content:"";
position:absolute;
top:0;
width:100%;
height:143%;
background:red;
transition:1s all;
}
.box:hover::before {
transform:translateY(-30%)
/* 143% is 100%
100% is X% ---> X = 70% so we move by (100% - 70%)
*/
}
<div class="box">
</div>
Вы можете выразить с помощью переменной CSS:
.box {
height:100px;
width:50px;
margin:50px;
display:inline-block;
border:3px solid;
position:relative;
}
.box:before {
content:"";
position:absolute;
top:0;
width:100%;
height:calc(var(--p)*1%);
background:red;
transition:1s all;
}
.box:hover::before {
transform:translateY(calc((10000/var(--p))*1% - 100%))
}
<div class="box" style="--p:143;">
</div>
<div class="box" style="--p:170;">
</div>
<div class="box" style="--p:120;">
</div>
ОБНОВЛЕНИЕ
В случае динамического содержимого вы можете добавить небольшой код JS, как показано ниже:
$('.box').each(function() {
var h0 = $(this).height();
var h1 = $(this).find('span').height();
$(this).css('--t',(h0-h1));
})
.box {
height: 100px;
width: 50px;
margin: 50px;
display: inline-block;
border: 3px solid;
position: relative;
}
.box span {
position: absolute;
top: 0;
width: 100%;
background: red;
transition: 1s all;
}
.box:hover span{
transform: translateY(var(--t));
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="box">
<span>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed est ex, pretium tempus turpis vitae, </span>
</div>
<div class="box">
<span>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</span>
</div>
<div class="box">
<span>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed est ex, pretium </span>
</div>