Во-первых, давайте сделаем снимок: как с помощью чистого CSS добиться следующего эффекта?
Прежде чем продолжить чтение ниже, вы можете воспользоваться моментом. Попробуйте подумать над вышеуказанным эффектом или попробуйте сами, сможете ли вы гениально добиться вышеуказанного эффекта без использования JS.
Хорошо, продолжайте. Этот эффект похож на небольшую проблему, с которой я столкнулся в процессе развития бизнеса. На самом деле, даже если я использую Javascript, моя первая реакция — это очень хлопотно. Поэтому мне интересно, можно ли добиться этого эффекта, используя только CSS?
определить требования
Давайте определим простое правило со следующими требованиями:
- Предположим, что структура HTML выглядит следующим образом:
<ul>
<li>不可思议的CSS</li>
<li>导航栏</li>
<li>光标小下划线跟随</li>
<li>PURE CSS</li>
<li>Nav Underline</li>
</ul>
- Панель навигации
li
ширина не фиксирована - когда с левой стороны навигации
li
двигаться вправоli
, подчеркивание перемещается слева направо. Точно так же, когда с правой стороны навигацииli
двигаться влевоli
, подчеркивание перемещается справа налево.
Выполнить требование
В первый раз, когда я увидел этот эффект, я подумал, что эту анимацию нельзя сделать с помощью одного лишь CSS.
Если вы хотите сделать это только с помощью CSS, вам нужно найти другой способ и использовать несколько хитрых методов.
Что ж, давайте воспользуемся некоторыми приемами и уловками, чтобы шаг за шагом выполнить этот эффект с помощью CSS. Проанализируйте трудности:
Ширина не фиксирована
Первая трудность,li
Ширина не фиксирована. Таким образом, нам, возможно, придется начать сli
Поднимите шум из-за собственной ширины.
так как каждыйli
Ширина не обязательна, тогда длину соответствующего ей подчеркивания нужно адаптировать под себя. Естественно, мы подумаем, как его использовать.border-bottom
.
li {
border-bottom: 2px solid #000;
}
Ну может сейчас так (ли соединены между собой, а промежуток между ли используетсяpadding
производить):
Скрыть по умолчанию, эффект анимации
Конечно, поначалу здесь нет подчеркиваний, поэтому нам может понадобиться их скрыть.
li {
border-bottom: 0px solid #000;
}
Свергнуть и начать заново, с помощью псевдоэлементов
Кажется, это не работает, потому что после скрытия наведитеli
Когда требуется анимация подчеркивания, иli
Само по себе его точно не сдвинуть. Итак, мы рассматриваем использование псевдоэлементов. применять подчеркивание к каждомуli
поверх псевдоэлемента.
li::before {
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
border-bottom: 2px solid #000;
}
Рассмотрим анимацию первого шага ниже, при наведении подчеркивание должно расширяться с одной стороны. Итак, используя абсолютное позиционирование, мы будемli
Ширина псевдоэлемента устанавливается равной 0, а при наведении ширина меняется отwidth: 0 -> width: 100%
, CSS выглядит следующим образом:
li::before {
content: "";
position: absolute;
top: 0;
left: 0;
width: 0;
height: 100%;
border-bottom: 2px solid #000;
}
li:hover::before {
width: 100%;
}
Получите, следующий эффект:
Двигайтесь слева налево, двигайтесь справа налево
Хорошо, я чувствую, что на шаг ближе к успеху. Теперь остается самый сложный вопрос:
Как сделать так, чтобы линия следовала за движением курсора, чтобы добиться, когда с левой стороны навигацииli
двигаться вправоli
, подчеркивание перемещается слева направо. Точно так же, когда с правой стороны навигацииli
двигаться влевоli
, подчеркивание перемещается справа налево.
Давайте подробнее рассмотрим текущий эффект:
когда с первогоli
переключиться на второйli
когда первыйli
Неправильное направление отвода подчеркивания. Итак, может быть, нам нужно сместить начальное положение подчеркивания и установить его наleft: 100%
, так что каждый раз, когда подчеркивание убирается, первыйli
В самый раз:
li::before {
content: "";
position: absolute;
top: 0;
left: 100%;
width: 0;
height: 100%;
border-bottom: 2px solid #000;
}
li:hover::before {
left: 0;
width: 100%;
}
Взгляните на эффект:
Что ж, внимательно сравнив две картинки, второй эффект на самом деле состоит в том, что вы собираете семена кунжута и теряете арбуз. Первыйli
направление верное, но второеli
Подчеркивание снова движется в неправильном направлении.
Волшебный ~ селектор
Поэтому нам срочно нужен метод, который не меняет текущий ховерli
Способ перемещения подчеркивания может изменить его на следующий.li
То, как движется подчеркивание (хороший поворот).
Правильно, здесь мы можем использовать~
Выбор персонажей для выполнения этой сложной миссии также является наиболее важной частью этого примера.
для текущего наведенияli
, расположение подчеркивания, соответствующего псевдоэлементу, равноleft: 100%
, а дляli:hover ~ li::before
, их расположениеleft: 0
. Код CSS примерно такой:
li::before {
content: "";
position: absolute;
top: 0;
left: 100%;
width: 0;
height: 100%;
border-bottom: 2px solid #000;
transition: 0.2s all linear;
}
li:hover::before {
width: 100%;
left: 0;
}
li:hover ~ li::before {
left: 0;
}
На этом эффект, которого мы хотим, достигнут! Посыпать цветы. Взгляни:
Работает хорошо, просто немного жестко, мы можемИзмените функцию плавности соответствующим образоми добавитьзадержка анимации, вы можете добиться этого эффекта в начале вышеизложенного. Конечно, это вишенка на торте.
Полную ДЕМО можно найти здесь:Демонстрация CodePen — невероятный CSS-курс, подчеркивающий следующий эффект
Наконец
Этот методсамый большой недостатокПри вводе первого ли в начале линия может быть только справа налево, кроме того, очень хорошо можно добиться следующего эффекта.
Другие замечательные технические статьи по CSS собраны в моемGithub -- iCSS, продолжайте обновлять, добро пожаловать, нажмите звездочку, чтобы подписаться на коллекцию.
Ну вот и конец этой статьи, надеюсь она вам поможет :)
Если у вас есть какие-либо вопросы или предложения, вы можете общаться больше.Оригинальные статьи ограничены в написании и знаниях.Если в статье есть какие-либо неточности, пожалуйста, дайте мне знать.