Невозможно изменить цвет шрифта, только если текст перекрывается с div - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь изменить цвет шрифта на белый только тогда, когда селектор перекрывает текст и не может найти решение.

Требуемое поведение следующее:

  1. Измените цвет шрифта на белый только тогда, когда селектор перекрывается.
  2. Увеличьте размер шрифта активной вкладки до 18px
  3. Селектор должен перейти на активную вкладку.

Я пробовал несколько вещей, но ни одна из них не кажется работа.

Вот что у меня сейчас есть: https://codepen.io/galanflorind/pen/gOpQKPP

var tabs = $('.tabs');
var selector = $('.tabs').find('a').length;
var activeItem = tabs.find('.active');
var activeWidth = activeItem.innerWidth();
$(".selector").css({
  "left": activeItem.position.left + "px", 
  "width": activeWidth + "px"
});

$(".tabs").on("click","a",function(e){
  e.preventDefault();
  $('.tabs a').removeClass("active");
  $(this).addClass('active');
  var activeWidth = $(this).innerWidth();
  var itemPos = $(this).position();
  $(".selector").css({
    "left":itemPos.left + "px", 
    "width": activeWidth + "px"
  });
  
// Temporary fix for resizing after the transition is done
// TODO: find another solution
  setTimeout(() => {
    var activeWidth = $(this).innerWidth();
    var itemPos = $(this).position();
    $(".selector").css({
    "left":itemPos.left + "px", 
    "width": activeWidth + "px"
  });
    }, 401)
});
@import url('https://fonts.googleapis.com/css?family=Nunito');

body{
  height:100vh;
  display:flex;
  flex-direction:column;
  justify-content:center;
  align-items:center;
}

.wrapper{
  text-align:center;
  margin:50px auto;
    font-family: 'Nunito', sans-serif;
}

.tabs{
  font-size:15px;
  padding:0px;
  list-style:none;
  display:inline-block;
  border-radius:50px;
  position:relative;
}

.tabs a{
  text-decoration:none;
  color: #2f3059;
  text-transform:uppercase;
  padding:6px 20px;
  display:inline-block;
  position:relative;
  z-index:1;
  transition-duration: 0.4s;
}

.tabs a.active{
  color:#fff;
  font-size: 18px;
}

.tabs .selector{
  height:100%;
  display:inline-block;
  position:absolute;
  background: #3e40db;
  left:0px;
  top:0px;
  z-index:1;
  border-radius: 16px;
  transition: width 1s, .6s;
  transition-timing-function: easeOutCirc;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="wrapper">
  <nav class="tabs">
    <div class="selector"></div>
    <a href="#" class="active">WHOLESALE SUPPLY</a>
    <a href="#">E-LEARNING</a>
    <a href="#">MEDICAL COMPLIANCE</a>
  </nav>
</div>

На сайте Stripe есть что-то похожее - https://stripe.com/en-nl/sigma Screenshot Stripe

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

Я не вижу большого простого способа сделать это. Быстрый щелчок правой кнопкой мыши -> Inspect показывает, что даже на сайте, на который вы ссылаетесь, анимация <canvas> используется для рисования всего эффекта (т. Е. Это не CSS - это просто картинка). Вот некоторые варианты, но они либо не совсем завершены, либо для их реализации потребуется много времени.

Вариант 1.) Самый быстрый способ получить аналогичный эффект - добавить сочетание свойств CSS. -blend-mode: экран; на ваши ссылки и удалите правило color: #fff;. Однако новый цвет будет выглядеть несколько блеклым:

.tabs a {
  position: relative;
  width: 200px;
  mix-blend-mode: screen;
}

Вариант 2.) Создайте анимацию с <canvas>, как это делает ссылочный сайт, или анимированные картинки, которые меняются, когда пользователь нажимает на область вкладок. Любой из этих процессов займет много времени, так как вам придется либо создавать изображения, либо кодировать анимацию.

Вариант 3.) Оберните каждую букву в <span> и используйте setTimeouts в JavaScript установить, когда менять цвет каждого из них, основываясь на длине вашей анимации и в каком направлении движется селектор (или настроить CSS анимаций для каждой из них, если вы не против их исчезновения, а не немедленного изменения цвета) , Одна проблема здесь заключается в том, что вся буква будет менять цвет сразу, а не только немного за раз.

Вариант 4.) Если у вас есть полный контроль над расположением и размером элементов навигации, вы можно воспроизвести эффект, написав МНОГО CSS (поэтому я не буду пытаться выяснить все это здесь, но я объясню, как это сделать). Это может потребовать больше усилий, чем оно того стоит.

Создайте копию каждой ссылки, скажем, создайте два пролета в каждой гиперссылке с одинаковым текстом в каждом пролете. Расположите интервалы непосредственно друг над другом так, чтобы соответствующие тексты перекрывались (т. Е. Вы не должны видеть текст снизу).

Установите цвет текста нижнего слоя на белый, а верхний - на # 3e40db. Свойство CSS clip-path является анимируемым, поэтому вы можете использовать анимацию CSS, чтобы скрыть верхний слой пролета при перемещении по нему селектора div (поскольку у вас есть контроль над размерами элементов, временем перехода и временем анимации, вам следует быть в состоянии сделать это с достаточным количеством времени, вложенного в это). По сути, clip-path может «обрезать» прямоугольную область angular того, что отображается в элементе, поэтому, если вам приходится перекрывать элементы div, то уменьшая / увеличивая эту прямоугольную область angular с помощью управляемых анимаций, вы можете точно контролировать когда горизонтальный прямоугольник angular область вершины скрыта (то есть показана нижняя часть). Опять же, основная проблема заключается в том, что для написания / реализации потребуется много кода и много времени, потому что вам нужно оттачивать абсолютное позиционирование, синхронизацию и учет, если селектор перемещается влево или вправо по div , Но если вы готовы потратить время и работу, настройка basi c будет выглядеть примерно так:

@keyframes clip-animation-from-left {
    0% {
       clip-path: polygon(0px 0px, 0px 0px, 0px 300px, 0px 300px);
    }

    50% {
        clip-path: polygon(150px 0px, 300px 0px, 300px 300px, 150px 300px);
    }

    100% {
        clip-path: polygon(300px 0px, 300px 0px, 300px 300px, 300px 300px);
    }
}


/* You'll have to rewrite some JavaScript to add/remove classes determining which way the selector is coming */
.tabs a.active-from-left {
    animation-name: clip-animation-from-left;
    animation-duration: .4s;
}
0 голосов
/ 26 марта 2020

Вы должны иметь каждый отдельный символ, чтобы иметь собственный элемент html, чтобы иметь возможность изменить его цвет.

Нет свойства CSS для изменения цвета только нескольких букв кнопки.

Будьте осторожны, если вам нужна доступность, это испортит его для программ чтения с экрана. Советую против этого. Однако, если это временно и происходит только во время анимации, все может быть в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...