2015-01-26 2 views
1

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

<div> 
    <h2> 
     <a href="#"> 
      <span>20</span><span>of</span><span>the</span><span>most</span><span>romantic</span><span>places</span><span>to</span><span>propose</span><span>in</span><span>Gloucestershire</span> 
     </a> 
    </h2> 
</div> 

Мой JQuery до сих пор выглядит следующим образом

$("h2 a span").each(function() { 
    console.log($(this).position()); 
}); 

Мой CSS является только основной CSS, которые можно увидеть здесь

div { 
    width: 550px; 
} 

h2 { 
    font-size: 36px; 
} 
    h2 a { 
     text-decoration: none; 
     padding: 10px 0px; 
     width: 200px; 
     display: inline; 
     color: #fff; 
    } 
     h2 a span { 
      background: #ff00ff; 
      padding: 10px 5px; 
      position: relative; 
      display: inline-block; 
      margin: 5px 0; 
     } 

Я это jsfiddle установить до сих пор: http://jsfiddle.net/nshk5cvd/10/

Скрипка показывает мое левое позиционирование для каждого диапазона, мне просто нужна помощь в поиске hte f первый и последний пролет на каждой линии.

+0

Вы можете использовать $ ("h2 пролета"). Первый() и $ ("h2 пролета"). Последний() –

ответ

2

Итерация по коллекции пролетов, а также:
Если это первый пролет в коллекции, это первое в линии;
Если последний в коллекции, последний в строке;
В противном случае наблюдайте смещение сверху, и после его изменения вы знаете, что оно находится в новой строке, поэтому диапазон по текущему индексу является первым в строке, его предыдущий брат - последним из предыдущих строк.

var spans = $("h2 a span"), refTop = 0, top = 0; 
spans.each(function(i) { 
    var $t = $(this), top = this.getClientRects()[0].top; 
    if(i==0){ 
     $t.addClass('first'); 
     // set the reference top position to match the first span 
     refTop = this.getClientRects()[0].top; 
    } 
    if(i == spans.length - 1){ 
     $t.addClass('last'); 
    } 

    // if the top is greater than the reference it's the beginning of a new line 
    if(top > refTop){ 
     // if the current element is first, its previous sibling is the last. 
     $t.addClass('first').prev().addClass('last'); 
     // update the reference for next line pass 
     refTop = top; 
    } 
}); 

http://jsfiddle.net/nshk5cvd/19/

+0

Привет, спасибо. это работает очень хорошо. не сто процентов. Я добавил функцию изменения размера, но столкнулся с несколькими проблемами http: // jsfiddle.net/nshk5cvd/17/ , когда есть только словосочетание, мне нужно будет сделать что-то отличное от первого и последнего пролета. Когда вы идете довольно маленьким, а затем обратно в большой (по ширине), первый класс больше не появляется. – ltjfansite

+0

http://jsfiddle.net/nshk5cvd/19/ - избавиться от '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'и выполнить код для каждого элемента и удалить простейшие добавленные имена первого и последнего классов, чтобы он обновлялся при изменении размера. – pawel

+0

Я знаю, я сказал, что это работает. Ive просто переместил сценарий на мой сайт (я использую его в слайдере), и я столкнулся с другой проблемой. если вы посмотрите на скрипку, вы увидите, что я имею в виду: http://jsfiddle.net/VYfCh/169/ Ive продублировал h2, но не скрипт добавляет контент со всех h2 в каждый Другие. – ltjfansite

0
$("h2 a").each(function() { 
    $(this).children("span:first");//this is first span of this line 
    $(this).children("span:last");//this is last span of this line 
}); 
+0

что просто находит первые и последние из каждого пункта , не каждая строка. если вы посмотрите на jsfiddle, параграф переходит к строкам. – ltjfansite

+0

что я сказал, я имею в виду тег 'a'. – jarvanJiang

0

Существует несколько способов сделать это. Функция $ .each дает счетчик в скобках:

http://jsfiddle.net/nshk5cvd/13/

//Solution 1 
$("h2 a span").each(function(i) { 
    if (i == 0 || i == $("h2 a span").length - 1) 
    { 
     console.log($(this).position()); 
    } 
}); 

//Solution 2 
console.log($("h2 a span").first().position()); 
console.log($("h2 a span").last().position()); 
+1

Во-первых, спасибо за помощь. Но это не работает для того, что я хочу. Он подобрал «20» и «Глостершир», но им также хотелось поднять слова «до» и «предложить» , поэтому первое и последнее слово каждой строки, а не каждый абзац/заголовок – ltjfansite

0
var first_span = $("h2 a span:first"); 
var last_span = $("h2 a span:last"); 

Кэширование элементов всегда хорошая идея для исполнения.

Fiddle: http://jsfiddle.net/bu82170f/1/

+0

спасибо за takign взгляд, но это не работает для того, что я хочу. Он подобрал «20» и «Глостершир», но им также хотелось поднять слова «на» и «предложить», поэтому первое и последнее слово каждой строки, а не каждый абзац/заголовок – ltjfansite

+0

Это первый и последний в сбор, а не в линию. – pawel

Смежные вопросы