#html #css #html5 #css3 #css_animation
Например у div есть прямоугольная тень. При вращении прямоугольника происходит вращение
направления прямоугольной тени, что вызывает проблемы, так как тень прямоугольника
должна создать иллюзию освещения.
Пример: jsfiddle
div {
width: 50px;
height: 50px;
margin: 20px;
box-shadow: 10px 10px 10px #000;
display: inline-block;
}
#box1 {
background-color: #b00;
}
#box2 {
background-color: #0b0;
transform: rotate(30deg);
}
#box3 {
background-color: #00b;
transform: rotate(60deg);
}
#box4 {
background-color: #b0b;
transform: rotate(90deg);
}
@keyframes spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
#box6 {
background-color: #0bb;
animation-name: spin;
animation-duration: 2s;
animation-iteration-count: infinite;
}
Ответ для решения этой проблемы должен выглядеть примерно так:
Как я могу повернуть div и сохранить прямоугольную тень от него в том же направлении?
Решение должно быть только -- CSS...
Перевод вопроса : Keep box-shadow direction consistent while rotating @Chris
Ответы
Ответ 1
Размеры квадрата и его положение зададим родительскому блоку, а псевдоэлементы пусть их наследуют. «Блок-тень» немного сдвинем, добавим ему размытие (имитация тени) и будем вращать псевдоэлементы. body { background-color: #8694ef; } .square { width: 100px; height: 100px; position: relative; top: 50px; left: 100px; } .square:before, .square:after { position: absolute; content: ''; width: 100%; height: 100%; top: 20px; left: 20px; background-color: rgba(0,0,0,0.6); filter: blur(8px); animation: rotate linear 5s infinite; } .square:after { top: 0; left: 0; filter: none; background-color: #ccc; } @keyframes rotate { to { transform: rotate(1turn); } }Ответ 2
Сохранение направления смещения прямоугольника-тени, согласованного во время вращения, реализуется с помощью CSS-transforms. Этот подход основан на том, что фактически transform origin перемещается с помощью преобразований. Это означает, что когда несколько преобразований установлены на один и тот же элемент, система координат каждого преобразования изменяется в соответствии с предыдущими. В следующем примере синий элемент является псевдоэлементом, а тень - элементом div: div { width: 40px; height: 40px; margin: 40px; box-shadow: 0px 0px 10px 5px #000; animation: spinShadow 2s infinite; background-color: #000; } @keyframes spinShadow { to { transform: rotate(360deg); } } div:before { content: ''; position: absolute; left:-5px; top:-5px; width: 50px; height: 50px; transform: rotate(0deg) translate(-10px, -10px) rotate(0deg); animation:inherit; animation-name: spinElt; background-color: #0bb; } @keyframes spinElt { to { transform: rotate(-360deg) translate(-10px, -10px) rotate(360deg); } } Объяснение свойства transition для псевдоэлемента (см. Следующий фрагмент кода для иллюстрации этапов): transform: rotate(-360deg) translate(-10px, -10px) rotate(360deg) rotate(-360deg) - Счетчик вращение родительского элемента, чтобы сделать псевдоэлемент статическим translate (-10px, -10px) - псевдоэлемент сдвигается, чтобы сделать смещение тени rotate(360deg), псевдоэлемент поворачивается в том же направлении, что и родительский элемент Чтобы увидеть все элементы откройте сниппет "на всю страницу" div { width: 40px; height: 40px; margin: 40px; box-shadow: 0px 0px 10px 5px #000; animation: spinShadow 2s infinite; background-color: #000; } @keyframes spinShadow { to { transform: rotate(360deg); } } div:before { content: ''; position: absolute; left:-5px; top:-5px; width: 50px; height: 50px; animation:inherit; background-color: #0bb; } #first:before{ transform: rotate(0deg); animation-name: first; } @keyframes first { to { transform: rotate(-360deg); } } #second:before{ transform: rotate(0deg) translate(-10px, -10px); animation-name: second; } @keyframes second { to { transform: rotate(-360deg) translate(-10px, -10px); } } #complete:before{ transform: rotate(0deg) translate(-10px, -10px) rotate(0deg); animation-name: complete; } @keyframes complete { to { transform: rotate(-360deg) translate(-10px, -10px) rotate(360deg); } }
- Counter rotate:
- Translate :
- Rotate:
Перевод ответа: Keep box-shadow direction consistent while rotating @web-tiki
Ответ 3
Вы также можете интегрировать направление прямоугольной тени внутри кадров анимации: div { display: inline-block; margin: 1em ; height: 50px; width: 50px; box-shadow: 15px 15px 15px 5px gray; animation: rte 5s infinite linear; } .red { background: red } .green { background: green; animation-delay:2s; } .blue { background: blue; animation-delay:4s; } .bob { background: #b0b; animation-delay:6s; } .cyan { background: cyan; animation-delay:8s; } @keyframes rte { 25% { box-shadow: 15px -15px 15px 5px gray; } 50% { box-shadow: -15px -15px 15px 5px gray; } 75% { box-shadow: -15px 15px 15px 5px gray; } 100% { transform: rotate(360deg); } } Перевод ответа: Keep box-shadow direction consistent while rotating@GCyrillus
Комментариев нет:
Отправить комментарий