Эффект Jquery для отображения текста переполнения элемента меню при наведении курсора мыши

#javascript #jquery #html #css

#javascript #jquery #HTML #css

Вопрос:

У меня есть очень обычное меню наведения css, с БОЛЬШИМ количеством ссылок href в нем. Проблема в том, что при наведении курсора на каждую вложенную ячейку меню отображается небольшое «окно» с белым фоном, в котором будут содержаться элементы наведенного отца. Вот пример, при наведении курсора FATHER1 (меню полностью управляется CSS):

 _____________________________
FATHER1 | FATHER 2 | FATHER 3
________|__________|_________
.--^-------------------------------
|Title Of Cont1    Title Of Cont2  |
| Lia element        Lia element   |
| Lia element        Lia element   |
| Lia element        Lia element   |    ( "Lia element" stands for <li><a> )
|                                  |
|Title of Cont3    Title of Cont4  |
| Lia element        Lia element   |
| Lia element        Lia element   |
'----------------------------------'
  

Вот в чем проблема: таким образом, когда ширина элемента <li><a> превышает определенное количество пикселей (в моем случае это число равно 156px), макет прерывается из-за отсутствия параллелизма по высоте.

Решение простое, с помощью CSS для элементов <li><a>:

 display: block; width: 156px; overflow: hidden; white-space:nowrap;
  

Таким образом, весь переполненный текст от 156 пикселей до бесконечности остается скрытым.

Теперь мне нужен второй шаг к моему проекту: когда пользователь проводит мышью по этим «урезанным» элементам <li><a> , я хотел бы показать ему остальной текст «карусельным» способом, буква за буквой. Таким образом, ширина остается 156 пикселей в каждый момент времени, но пользователь действительно может видеть, какой текст скрыт.

Есть какой-нибудь необычный способ сделать это? Я никогда в жизни не видел такого фрагмента кода, и в данном случае я застрял на ключевых словах Google

Комментарии:

1. Вы действительно хотите такого поведения, подобного «карусели»? Потому что вы можете просто отобразить полное содержимое с помощью простой всплывающей подсказки.

Ответ №1:

вы могли бы попробовать что-то в этом роде:

 .menu *{
    -webkit-transition  : all 1s ease-in-out;
    -moz-transition     : all 1s ease-in-out;
    -o-transition       : all 1s ease-in-out;
    -ms-transition      : all 1s ease-in-out;
}
.item{
    width               : 100px;
    line-height         : 20px;
    height              : 20px;
    border              : 1px solid red;
    display             : block;
    overflow            : hidden;
    cursor              : pointer;
}
.item a{
    position            : relative;
    display             : block;
    text-decoration     : none;
    height              : 20px;
    white-space         : nowrap;
}
.item:hover a{
    -webkit-transform   : translate(-100%, 0px);
    -moz-transform      : translate(-100%, 0px);
    -o-transform        : translate(-100%, 0px);
    -ms-transform       : translate(-100%, 0px);
}
</style>
<div class="menu">
    <ul>
        <li class="item"><a href="#">item 1</a></li>
        <li class="item"><a href="#">somewhat longer item 2</a></li>
        <li class="item"><a href="#">item 3</a></li>
        <li class="item"><a href="#">item 4</a></li>
        <li class="item"><a href="#">item 5</a></li>
    </ul>
</div>
  

вы можете сделать аналогичную вещь, используя javascript, конечно

Комментарии:

1. Спасибо тебе за твою помощь, Маттиас! Вы показали мне технику, о которой я совершенно не знал, это блестяще 🙂 Знаете ли вы какой-либо способ повторить тот же эффект с помощью css jquery, чтобы сделать его совместимым с браузером? К сожалению, мне приходится запускать этот фрагмент кода на веб-сайте, который посещается огромным количеством различных браузеров и версий … : (

Ответ №2:

После тщательного поиска в Интернете и документации jQuery я нашел решение:

CSS (исправьте ширину и высоту элементов в соответствии с вашими потребностями)

 #nav ul.sub_cat li { display: block; width: 156px; overflow: hidden; height: 13px; }
#nav ul.sub_cat li a { display: block; position: relative; height: 13px; white-space: nowrap; }
  

Фрагмент jQuery

  • Я фильтрую элементы li, которым требуется функция автоматической прокрутки, с помощью rel =»filter»
  • Я использую «22» в качестве разбивки длины текста li для запуска анимации
  • Я использую коэффициент 8 пикселей для каждого символа, превышающего разбивку по 22 символам

Очевидно, измените эти значения в соответствии с вашими потребностями

 $('ul li[rel="filter"]').hover (
    function() {
        var lihref = $(this).find('a');
        var lihreftextlengthbreakdown = 22;
        var pixelfactor = 8;

        if ( $(lihref).text().length > lihreftextlengthbreakdown ) {
            var slidelen = ( ( $(lihref).text().length ) - lihreftextlengthbreakdown ) * pixelfactor;
            $(this).animate ( { scrollLeft: slidelen }, 5000 );
        }
    },
    function() {
        $(this).animate ({ scrollLeft: 0 });
    }
);