CSS / JQuery включил боковую прокрутку текста при наведении - PullRequest
9 голосов
/ 21 января 2011

У меня есть твиттер на моем веб-сайте.Однако на маленьких экранах его обрезают.У меня есть достаточно высокий бар для 1 строки текста, в котором у меня есть последний твит.Я хочу, чтобы твит эллипсировал или исчезал в конце, если он слишком длинный.Но при наведении курсора я хочу, чтобы текст медленно сдвигался влево, обнажая скрытую часть.

Этот эффект используется на iPod classic, когда вы выделяете песню, название которой шире, чем экран,(Надеюсь, вы понимаете, для чего я иду.)

Мне просто интересно, как бы я реализовал что-то подобное?Как заставить текст остаться на одной строке?

Ответы [ 6 ]

14 голосов
/ 21 января 2011

Наконец, вот моя запись: http://jsfiddle.net/sdleihssirhc/AYYQe/3/

Прикольные вещи:

  1. Библиотека агностиков
  2. Использует scrollLeft вместо абсолютного позиционирования, поэтому он плавнее и быстрее
  3. Использует text-overflow:ellipsis вместо добавления любых элементов DOM
7 голосов
/ 21 января 2011

Вот довольно простой способ сделать это. Сначала настройте div, содержащий ваш длинный текст:

<div id="container">
Here is the long content, long long content. So long. Too long.
</div>

Вы можете использовать некоторые CSS для автоматической обработки усечения и многоточия:

div#container {
    /* among other settings: see fiddle */
    width: 200px;
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
}

Если вы затем определите собственную, не усеченную ширину контента, вы можете использовать jQuery .animate() для перемещения этого контента с постоянной скоростью - даже если вы не знаете длину текста до времени выполнения (как быть в случае с твиттером). Вот несколько механический способ получить измерение:

var true_width = ( function(){
  var $tempobj = $('#container') // starting with truncated text div container
      .clone().contents() // duplicate the text
      .wrap('<div id="content"/>') // wrap it in a container
      .parent().appendTo('body') // add this to the dom
      .css('left','-1000px'); // but put it far off-screen
  var result = $tempobj.width(); // measure it
  $tempobj.remove(); // clean up
  return result;
})();

Наконец, немного анимации:

$('#container').one('mouseenter', function(){ // perhaps trigger once only
  var shift_distance = true_width - $(this).width(); // how far to move
  var time_normalized = parseInt(shift_distance / 100, 10) * 1000; // speed
  $(this).contents().wrap('<div id="content">').parent() // wrap in div
    .animate({
        left: -shift_distance,
        right: 0
    }, time_normalized, 'linear'); // and move the div within its "viewport"
});

Независимо от длины текста, вы получите постоянную скорость около одной секунды на 100 пикселей (отрегулируйте по желанию). Сброс или перемотка содержимого при отпускании мышью оставлено в качестве упражнения. Этот подход имеет несколько наивных моментов, но может дать вам некоторые идеи.

Вот рабочий пример: http://jsfiddle.net/redler/zdvyj/

2 голосов
/ 21 января 2011

Есть несколько плагинов, которые делают это (например, Реми Шарп: http://remysharp.com/demo/marquee.html), но если вы строили с нуля:

Для прокручиваемого элемента должен быть "белый цвет".-space: nowrap; "(чтобы держать его на одной строке), «position: absolute» (чтобы прокрутить его влево и вправо) и обернуть в относительно позиционированный элемент, имеющий «overflow: hidden» (чтобы он выглядел так, как показывает только та ширина, которую вы хотите),

Используя jQuery, вы можете использовать .animate () для перемещения элемента прокрутки слева направо при событии наведения мыши

1 голос
/ 28 апреля 2016

Мое решение для jsfiddle или здесь, в конце, оно использует CSS3 Animations.Я позаимствовал идеи у здесь и здесь .Моя идея состояла в том, чтобы позволить контейнеру div, т.е. div.s, стать достаточно широким, чтобы он мог содержать весь текст, что позволило использовать проценты для свойства left в правиле @keyframes, отсюда

.s {
   display: inline-block;
}
.t:hover, .s:hover {
  width: auto;
}

Вот код:

.t {
    white-space: nowrap;
    position: relative;
    overflow: hidden;   
    text-overflow: ellipsis;
    display: block;
    width: 100%;
}
.s {
  display: inline-block;
  width: 100%;
}
.t:hover, .s:hover {
  width: auto;
}
.s:hover .t { 
  animation: scroll 15s;
}
.f {
  width: 100px;
  background: red;
  overflow: hidden;
}
@keyframes scroll {
    0% {left: 0px;}
    100% {left: -100%;}                   
}
<div class="f">
  <div class="s">
    <div class="t">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Id impedit accusamus nulla facilis unde sed ipsum maiores adipisci, eius excepturi saepe perspiciatis sequi optio ipsam odio quibusdam quo libero repudiandae.
    </div>
  </div>
</div>
0 голосов
/ 20 марта 2012

Вы можете посмотреть на jRollingNews
Используйте генератор кода для настройки баров и предварительного просмотра результата.

Отказ от ответственности: я сделал это.

0 голосов
/ 21 января 2011

Штеффен Русичка написал для этого скрипт jQuery, RUZEE.Ellipsis .

...