задний план
Я сегодня посетил CodePen и увидел такой очень интересный эффект:
CodePen Demo -- Material Design Menu By Bennett Feely
Этот эффект все еще имеет некоторые моменты, которые стоит изучить и изучить, давайте посмотрим на него вместе.
Как добиться такого подобного эффекта?
Прежде всего, подумайте, если бы вас попросили добиться вышеуказанного эффекта, что бы вы сделали?
Здесь я просто перечисляю некоторые возможные решения:
- теневой ящик-тень
- Градиент радиально-градиентный
- Преобразование масштаба: масштаб()
Быстро пройдите их один за другим.
Реализовано с помощью box-shadow
При использованииbox-shadow
Код следующим образом:
<div class="g-container">
<div class="g-item"></div>
</div>
.g-container {
position: relative;
width: 400px;
height: 300px;
overflow: hidden;
}
.g-item {
position: absolute;
width: 48px;
height: 48px;
border-radius: 50%;
background: #fff;
top: 20px;
left: 20px;
box-shadow: 0 0 0 0 #fff;
transition: box-shadow .3s linear;
&:hover {
box-shadow: 0 0 0 420px #fff;
}
}
Ядро:
- Внешний слой установлен
overflow: hideen
маска - Когда внутренний элемент зависает, реализуйте
box-shadow: 0 0 0 0 #fff
прибытьbox-shadow: 0 0 0 420px #fff
Изменение
Эффект следующий:
Общая анимация смоделирована, но у нее есть две фатальные проблемы:
- Когда наша мышь покидает круг, вся анимация начинает переворачиваться, и белая область начинает исчезать.Если мы хотим выполнять операции с кнопками, это невозможно.
- Элементы, спрятанные внутри расширенного прямоугольника анимации, не так просто разместить
так,box-shadow
Выглядит хорошо, но я могу только сдаться. Код приведенной выше демонстрации --CodePen Demo -- box-shadow zoom in animation
Реализовано с использованием градиентного радиального градиента
Ниже мы используем радиальный градиентradial-gradient
Добавление CSS @property также может восстановить описанный выше эффект:
<div class="g-container"></div>
@property --size {
syntax: '<length>';
inherits: false;
initial-value: 24px;
}
.g-container {
position: relative;
width: 400px;
height: 300px;
overflow: hidden;
background: radial-gradient(circle at 44px 44px, #fff 0, #fff var(--size), transparent var(--size), transparent 0);
transition: --size .3s linear;
&:hover {
--size: 450px;
}
}
Управляя анимационным эффектом радиального градиента, при наведении курсора фон маленького круга становится фоном большого круга, и эффект выглядит следующим образом:
эммм, эффект действительно восстанавливается, и проблема тоже фатальная:
- Так как фон меняется, мышке не нужно наводить курсор на кружочек, а нужно только войти в диапазон div, и запустится анимация, что явно неправильно
- и первый
box-shadow
Метод аналогичен, DOM элементов навигации, скрытых под белым цветом, расположен не очень удачно.
Код приведенной выше демонстрации --CodePen Demo -- radial-gradient zoom in animation
эммм, есть еще один способ, путем масштабированияtransform: scale()
, тоже будут какие-то проблемы, и мы не будем здесь дальше расширяться.
Итак, здесь, для достижения вышеуказанного эффекта, ядром является:
- Мышь должна навести курсор на круг, чтобы запустить анимацию, и мышь может свободно перемещаться в пределах расширенного диапазона, не сворачивая эффект анимации.
- После того, как анимация развернута, размещение DOM внутри не должно вызывать особых затруднений, лучше всего управлять отображением и сокрытием содержимого внутри без помощи Javascript.
Использование clip-path для достижения динамического отсечения области
Итак, вот нам на самом деле нуженДинамическая обрезка области.
В этой моей статье --Как реализовать overflow: hidden без использования overflow: hidden?, представляет несколько способов обрезки элементов в CSS, и среди них наиболее подходящий для этого эффекта —clip-path.
использоватьclip-path
, функцию динамической обрезки можно реализовать очень хорошо, да и код очень простой:
<div class="g-container"></div>
.g-container {
position: relative;
width: 400px;
height: 300px;
overflow: hidden;
transition: clip-path .3s linear;
clip-path: circle(20px at 44px 44px);
background: #fff;
&:hover {
clip-path: circle(460px at 44px 44px);
}
}
нам просто нужно использоватьclip-path
, в самом начале поместите прямоугольный div, используяclip-path: circle(20px at 44px 44px)
Вырежьте его в круг.При наведении курсора расширьте радиус вырезаемого круга на весь прямоугольник.
Эффект следующий:
Таким образом, мы можем отлично добиться эффекта карты заголовков, а встроенные DOM-элементы могут быть записаны прямо в этот div.
<div class="g-container">
<ul>
<li>11111</li>
<li>22222</li>
<li>33333</li>
<li>44444</li>
</ul>
</div>
Эффект следующий:
CodePen Demo -- clip-path zoom in animation
Очень интересная техника, использующая clip-path для достижения динамического отсечения области, я надеюсь, что каждый сможет ее освоить.
наконец
Хорошо, это конец этой статьи, я надеюсь, что эта статья поможет вам :)
Если вы хотите получить самую интересную информацию о CSS, не пропустите мой официальный аккаунт --Интересные факты о внешнем интерфейсе iCSS😄
Другие замечательные технические статьи по CSS собраны в моемGithub -- iCSS, продолжайте обновлять, добро пожаловать, нажмите звездочку, чтобы подписаться на коллекцию.
Если у вас есть какие-либо вопросы или предложения, вы можете общаться больше.Оригинальные статьи ограничены в написании и знаниях.Если в статье есть какие-либо неточности, пожалуйста, дайте мне знать.