Как я могу сбросить CSS-счетчик на начальный атрибут данного списка

Я использую самозваный нумерованный список. Как прочитать атрибут start и добавить его в счетчик с помощью CSS?

HTML

<ol>
    <li>Number One</li>
    <li>Number Two</li>
    <li>Number Three</li>
</ol>
<ol start="10">
    <li>Number Ten</li>
    <li>Number Eleven</li>
    <li>Number Twelve</li>
</ol>

CSS

ol {
    list-style-type: none;

    /* this does not work like I expected */
    counter-reset: lis attr(start, number, 0);

}
li {
    counter-increment: lis
}
li:before {
    content: counter(lis)". ";
    color: red;
}

FIDDLE

10 ответов

Вы можете просто использовать атрибут start в качестве фильтра:

ol[start="10"] {
   counter-reset: lis 9;
}

Демо, но это будет применяться только для этого ol приписывать. Вам нужно немного javaScript, чтобы получить значение атрибута, чтобы применить, генерировать правильный counter-reset,


<ins data-extra="Use of Scss">

Посмотрите это: DEMO для генерации 100 правил из этих строк:

@for $i from 1 through 100 {
  .ol[start="#{$i}"] {
    counter-reset: lis $i ;
  }
}

Затем просто скопируйте и вставьте сгенерированные правила, если Scss недоступен на вашем хостинге.

</in>

<ins data-extra="jQueryFix">:

Решение jQuery можно легко настроить: DEMO

$( "ol" ).each(function() {
  var   val=1;
    if ( $(this).attr("start")){
  val =  $(this).attr("start");
    }
  val=val-1;
 val= 'lis '+ val;
$(this ).css('counter-increment',val );
});

Заметить, что: $(this ).css('counter-reset',val ); тоже работает:)

, </ins>

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

Вы не можете прочитать атрибут в свойствах счетчика CSS. Вместо этого вы можете использовать встроенный CSS с counter-reset определить начальный номер для определенного списка.
(Да, я знаю, что не рекомендуется использовать inline css, но его можно и нужно использовать для крайних случаев, подобных этому)

Первый элемент увеличивает значение сброса на 1, поэтому помимо предоставления имени счетчика вам нужно будет вычесть число, с которого вы хотите начать список, на 1:

HTML

<ol>
    <li>Number One</li>
    <li>Number Two</li>
    <li>Number Three</li>
</ol>

<!-- NOTE: List numbering starts at counter-reset + 1 -->
<ol style="counter-reset: lis 9;">
    <li>Number Ten</li>
    <li>Number Eleven</li>
    <li>Number Twelve</li>
</ol>

CSS

ol {
    list-style-type: none;
    counter-reset: lis; /* Resets counter to zero unless overridden */
}
li {
    counter-increment: lis
}
li:before {
    content: counter(lis)". ";
    color: red;
}

http://jsfiddle.net/hcWpp/308/

Просто предоставляем оптимизированную версию решения GCyrillus JS

$('ol[start]').each(function() {
    var val = parseFloat($(this).attr("start")) - 1;
    $(this).css('counter-increment','lis '+ val);
});

Я бы хотел, чтобы CSS мог читать и использовать числовые значения из атрибутов HTML:(

Вы можете использовать настраиваемые свойства (переменные) CSS, см.

Например, используйте встроенные стили для списка и добавьте настраиваемое свойство --start-value: 1;. В CSS вы можете использовать это как var(--start-value, 0); с запасным значением ( 0). Если вы пропустите это настраиваемое свойство, список будет запускаться по умолчанию.

HTML

      <ol style="--start-value: 1;">
    <li>Number Two</li>
    <li>Number Three</li>
    <li>Number Four</li>
</ol>

CSS

      ol {
    list-style-type: none;

    counter-reset: lis var(--start-value, 0);
}
li {
    counter-increment: lis;
}
li:before {
    content: counter(lis)". ";
    color: red;
}

Просто добавьте:

ol:not(:nth-of-type(1)){
    counter-increment: lis 10;
}

Демо Фиддл

Вы не можете использовать attr в counter-reset к сожалению, но вы можете добавить правила для изменения суммы приращения.

Альтернатива 1

Если у вас будет несколько списков, более устойчивой версией будет:

ol {
    list-style-type: none;
    /* this does not work like I expected */
    counter-reset: lis;

}
ol:not(:first-of-type){
     counter-increment: ol
}
li {
    counter-increment: lis
}
li:before {
    content: counter(lis)". ";
    color: red;
}
ol:not(:first-of-type) li:before {
    content: counter(ol) counter(lis)". ";
    color: red;
}

Альтернатива 2

Если числовой префикс может быть чем-либо, нижеследующее обеспечит это:

HTML

<ol>
    <li>Number One</li>
    <li>Number Two</li>
    <li>Number Three</li>
</ol>
<ol>
    <li data-prefix="1">Number Ten</li>
    <li data-prefix="1">Number Eleven</li>
    <li data-prefix="1">Number Twelve</li>
</ol>
<ol>
    <li data-prefix="a">Number Ten</li>
    <li data-prefix="b">Number Eleven</li>
    <li data-prefix="c">Number Twelve</li>
</ol>

CSS

ol {
    list-style-type: none;
    counter-reset: lis;
}
li {
    counter-increment: lis
}
li:before {
    content: attr(data-prefix) counter(lis)". ";
    color: red;
}

Вернемся к старому вопросу, о котором я забыл.

В настоящее время есть настраиваемые свойства CSS, которые можно использовать, даже в этом случае требуется добавитьstyle отнести в сторону ваш start атрибут

Пользовательские свойства (иногда называемые переменными CSS или каскадными переменными) - это сущности, определенные авторами CSS, которые содержат определенные значения, которые можно повторно использовать в документе. Они устанавливаются с использованием обозначения пользовательских свойств (например, --main-color: black;) и доступны с помощью функции var() (например, color: var(-main-color);).

пример (если код сгенерирован, кажется, что проще установить оба значения одинаковыми дляstart=x а также var(--s:x)чтобы избежать ошибки):

ol {
    list-style-type: none;
    /* this does not work like I expected
    counter-reset: lis attr(start, number, 0); */
    
    /* update using the css varaiable from html */
    counter-reset: lis calc(var(--s) - 1) ;
    /* calc() is used to keep html attributes values coherent */

}
li {
    counter-increment: lis
}
li:before {
    content: counter(lis)". ";
    color: red;
}
<ol>
    <li>Number One</li>
    <li>Number Two</li>
    <li>Number Three</li>
</ol>
<ol start="10" style="--s:10"><!-- or set it right away to nine to get rid of calc() in the css rule-->
    <li>Number Ten</li>
    <li>Number Eleven</li>
    <li>Number Twelve</li>
</ol>
<ol start="30" style="--s:30"><!-- or set it right away to twenty nine to get rid of calc() in the css rule -->
    <li>Number Thirty</li>
    <li>Number Thirty one</li>
    <li>Number Thirty two</li>
</ol>

Пока слишком поздно для ответа, но теперь может быть полезно кому-нибудь еще.

Вы пытаетесь составить список с пользовательскими маркерами, используя естественную нумерацию, верно? Вы можете использовать встроенный счетчик под названием list-item, вам не нужно определять свой собственный счетчик.

      ol {
    list-style: none;
}
li::before {
    content: counter(list-item) '. ';
}

Однако, если вы установите это программно, Chrome и Safari в настоящее время не применяют изменения без перерисовки (например, переключение отображения: нет).

Для поддержки

    , даже если сброс счетчика был включен в Firefox:

    $('ol[start]').each(function() {
        var val = parseFloat($(this).attr("start"));
        $(this).find("li").first().attr("value", val);
    });
    

    Скрипт jQuery основан на вводе Дэниела Тонона.

Мое решение: добавить класс без сброса. У меня это сработало!

      <ol>
    <li>Number One</li>
    <li>Number Two</li>
    <li>Number Three</li>
</ol>
<ol start="10" class="no-reset">
    <li>Number Ten</li>
    <li>Number Eleven</li>
    <li>Number Twelve</li>
</ol>

CSS

      ol {
    list-style-type: none;
    counter-reset: lis;
}    
li:before {
    content: counter(lis)". ";
    counter-increment:lis;
    color: red;
}
ol.no-reset{
  counter-reset: none;
}

Приведенный выше код спасает жизнь. Быстрая модификация: включите атрибут [start] в селектор CSS с помощью calc, чтобы мы могли различать, какие числа списка нужно вычислять. В противном случае вы должны установить начало и атрибут стиля для каждого списка (после первого использования этих атрибутов).

Другие вопросы по тегам