Применение анимации к элементам меню CSS без доступа к HTML - PullRequest
1 голос
/ 08 июля 2019

Я создаю сайт Wordpress, на котором некоторые разделы разметки недоступны для непосредственного редактирования, потому что тема, которую я адаптирую, создается для их динамического создания с помощью JavaScript, что мне не известно.

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

Обычно я просто оборачиваю текст каждого подменю в промежуток и анимирую этот промежуток при наведении, но теперь мне нужно найти способ сделать это, не касаясь разметки HTML.

Вот соответствующий CSS для меню:

.primary-menu,
.primary-menu ul {
    margin: 0;
    padding: 0;
    list-style: none
}

.primary-menu {
    display: -webkit-box;
    display: -ms-flexbox;
    display: flex;
    -ms-flex-wrap: wrap;
    flex-wrap: wrap;
    margin-left: calc(var(--menuItemsSpacing) / -2);
    margin-right: calc(var(--menuItemsSpacing) / -2)
}

.primary-menu a {
    display: -webkit-box;
    display: -ms-flexbox;
    display: flex;
    -webkit-box-align: center;
    -ms-flex-align: center;
    align-items: center;
    text-align: initial
}

.primary-menu>li {
    font-size: 18px;
    font-family: 'Open Sans', sans-serif; 
    font-weight: 400;
    position:relative;
    margin-bottom: 20px;
}

.primary-menu>li a {
    padding: 10px 25px 10px 25px;
    -webkit-transform: perspective(1px) translateZ(0); 
    transform: perspective(1px) translateZ(0);
    box-shadow: 0 0 1px rgba(0, 0, 0, 0);
    -webkit-transition-duration: 0.3s;
    transition-duration: 0.3s;
    -webkit-transition-property: color, background-color;
    transition-property: color, background-color; 
}

.primary-menu>li:hover a,
.primary-menu>li:focus a,
.primary-menu>li:active a {
    background-color: #000;
    color: #FFF;
}

.primary-menu .sub-menu {
    position: absolute;
    left: calc(var(--menuItemsSpacing) / -4);
    top: 100%;
    margin-top: var(--dropdownTopOffset);
    min-width: 100%;
    display:block;
    margin-left:6px;
    border-radius: 2px;
    width: var(--dropdownMenuWidth);
    background: var(--dropDownBackground);
    -webkit-box-shadow: 0px 10px 20px 0px rgba(41, 51, 61, 0.1);
    box-shadow: 0px 10px 20px 0px rgba(41, 51, 61, 0.1)
}

.primary-menu .sub-menu li {
    font-size: 16px;
    font-weight: 400;
    text-transform: initial;
    line-height: 1.6;
}

.primary-menu .sub-menu li a {
    padding: 13px 25px;
}

.primary-menu .sub-menu li a:hover {
    color: var(--menuHoverColor);
}

.primary-menu .sub-menu:before {
    position: absolute;
    content: '';
    width: 100%;
    height: var(--dropdownTopOffset);
    top: calc(var(--dropdownTopOffset) * -1);
    left: 0
}

А вот кропотливо упрощенная версия сгенерированной разметки HTML:

<nav class="main-navigation">
  <ul id="primary-menu" class="primary-menu menu">
    <li class="menu-item"><a href="http://localhost/wordpress">Home</a></li>
    <li class="menu-item"><a href="http://localhost/wordpress/about">About</a>
      <ul class="sub-menu">
        <li class="menu-item"><a href="http://localhost/wordpress/about/history/">History</a></li>
        <li class="menu-item"><a href="http://localhost/wordpress/about/people">People</a></li>
      </ul>
    </li>
    <li class="menu-item"><a href="http://localhost/wordpress/services/">Services</a></li>
    <li class="menu-item"><a href="http://localhost/wordpress/what-we-do">What We Do</a></li>
    <li class="menu-item"><a href="http://localhost/wordpress/the-library/">The Library</a>
      <ul class="sub-menu">
        <li class="menu-item"><a href="http://localhost/wordpress/the-library/gallery/">Gallery</a></li>
        <li id="menu-item" class="menu-item"><a href="http://localhost/wordpress/audio-and-video/">Audio and Video</a></li>
      </ul>
    </li>
    <li class="menu-item"><a href="http://localhost/wordpress/donate/">Donate</a></li>
    <li class="menu-item"><a href="http://localhost/wordpress/contact/">Contact</a></li>
  </ul>
</nav>

Я боролся с этим какое-то время, но пока не могу понять, как этого можно добиться с помощью текущей разметки, поэтому я очень признателен за помощь.

1 Ответ

3 голосов
/ 08 июля 2019

Как на счет этого?

.primary-menu .sub-menu li a {
    transition: 300ms padding ease-in-out;
}

.primary-menu .sub-menu li a:hover {
    padding-left: 10px;
}

Демо: https://jsfiddle.net/anf29thg/

...