【问题标题】:Nested ordered toggled list, non repeating嵌套有序切换列表,不重复
【发布时间】:2013-05-31 01:00:43
【问题描述】:

我正在编写一个二分键:一个有序的切换列表,每个级别有两个选项可供选择。嵌套项目以后不能重复编号,而是增加编号。数字需要附加'a'和'b':

1a.

2a.

3a.

3b.

2b.

4a.

4b.

1b.

5a.

6a.

6b.

5b.

7a.

7b.

基本的 HTML 有序列表:

<ol>
  <li>1a
    <ol>
      <li>2a
    <ol>
      <li>3a</li>
      <li>3b</li>
    </ol>
  </li>
  <li>2b
    <ol>
      <li>4a</li>
      <li>4b</li>
    </ol>
  </li>
</ol>

<ol>
  <li>1b
    <ol>
      <li>3a
    <ol>
      <li>5a</li>
      <li>5b</li>
    </ol>
  </li>
  <li>2b
    <ol>
      <li>6a</li>
      <li>6b</li>
    </ol>
  </li>
</ol>

嵌套项需要切换可见性,这可以通过 JQuery 和 display:none DIV 来完成,但是有没有办法避免 DIV?除非每个列出的项目都自动放置在 DIV 中,否则键太大而无法使用“1a”、“1b”进行编号。

JQuery 切换:

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
<script type="text/javascript">
function toggleDiv(divId) {
$("#"+divId).toggle();
}
</script>

随附的 CSS:

.display {display:none;
padding-left: 30px;
}

我需要什么样的 JQuery 和 CSS 反制组合才能让嵌套项目在停止的地方重新开始编号,而不是重新启动它?嵌套需要无限深,同时在列表中的任何地方都不能重复数字。

如何调整以下 CSS 以添加字母,而不是十进制数字?:

   <style>
        html>/**/body ol { /* Won't be interpreted by IE6/7. */
            list-style-type: none;
            counter-reset: level1;
        }
        ol li:before {
            content: counter(level1) ". ";
            counter-increment: level1;
        }
        ol li ol {
            list-style-type: none;
            counter-reset: level2;
        }
        ol li ol li:before {
            content: counter(level1) "." counter(level2) " ";
            counter-increment: level2;
        }
        ol li span { /* For IE6/7. */
            margin: 0 5px 0 -25px;
        }
    </style>

已询问有关嵌套列表或更改编号样式的问题,但我找不到具有这种非重复编号和切换选项的问题。见-Nested ordered listsSlide Toggle nested ordered list

【问题讨论】:

  • 为什么要避免使用 div?或者你有其他元素可以让 div 变得多余吗?请也向我们展示您的标记。
  • 使用 DIV,我可以获得带有缩进的嵌套列表的外观,但我需要一个正确的有序列表,其编号不重复。我添加了我拥有的 JQuery 和 CSS。
  • 您目前使用什么 CSS 进行编号?再次,请向我们展示您的 HTML 标记。
  • 我添加了一个有序列表的HTML,以及之前分享过的CSS countering,但是如何添加字母呢? CSS可以提供​​不重复的数字吗?谢谢你的帮助;这个问题越来越大了。
  • 感谢您的标记,我会写一个答案。顺便说一句,你忘了在第二层关闭一些&lt;ol&gt;s。

标签: javascript jquery css list toggle


【解决方案1】:

我需要哪种 JQuery 和 CSS 反击组合才能让嵌套项目从中断的地方重新开始编号,而不是重新开始?

CSS counters 无法做到这一点。

您可以在新的嵌套级别上将它们重置为零,从而确定它们的范围 - 但它们不是连续的 (Demo)。您只能将它们初始化一次,但不会为更高级别的项目重置它们 (Demo)。有了类似的东西,您甚至可以根据需要枚举第一个和最里面的项目 - 但仍然不能用于 b 项目 (Demo)。

如果您知道每个列表正好有 2 个孩子并且您的深度是固定的,那么只有可能做一些聪明的计数器数学 - 我想您也需要为每个级别设置一个单独的计数器。确实有可能:

/* The counter styles only - no list styles, not the ab-counter
Should be coded in SASS/LESS, it's no fun to do by hand :-)
Here are the rules, on an example with 4 levels max: */


/* each ol increases the counters for its and lower levels */
         ol { counter-increment: level0 level1 level2 level3; }
      ol ol { counter-increment:        level1 level2 level3; }
   ol ol ol { counter-increment:               level2 level3; }
ol ol ol ol { counter-increment:                      level3; }

/* the ol in the last list item of a level should also advance the above level
   by the number of ols inside its parent list */
      li:last-child > ol { counter-increment: level0 14 level1 level2 level3; }
   li li:last-child > ol { counter-increment: level1 6         level2 level3; }
li li li:last-child > ol { counter-increment: level2 2                level3; }
/*                                                   ^
            The number can be computed as 2 ^ (max - level) - 2
              in here: 14 = 2^4-2; 6 = 2^3-2; 2 = 2^2-2
   The extra rule on the first level can actually be omitted */

/* And each li should use the counter for its level */
         li:before { content: counter(level0)" "; }
      li li:before { content: counter(level1)" "; }
   li li li:before { content: counter(level2)" "; }
li li li li:before { content: counter(level3)" "; }

(Demo for 3 levels, Demo for 4 levels)

如何调整计数器 CSS 以添加字母,而不是十进制数字?

您可以将列表样式类型作为第二个参数传递给计数器函数 (spec):

content: counter(level1) counter(level2, lower-latin) " ";

【讨论】:

  • 谢谢伯吉。我正在考虑我的困境,可能不得不完全废弃 CSS 计数器,除非我能找到一位数学家来正式定义这种编号模式。
  • 哇,谢谢!我将尝试将其提高到 9 或 10 个嵌套级别。如果我不能得到它,我会回到这里。如果我得到它,无论如何我都会发布我所拥有的。 :)
  • 所以我将嵌套设置为 5 级,但看起来 CSS 期望每个父级的子级数量平衡 - 占据每一级。编号跳到更高的数字。 jsfiddle.net/q7qTR/3
  • 是的,我希望深度是固定的。否则不可能知道在第二个li 中有多少ols 在你的父母ol 之上。我想需要用其他计数器的值来初始化计数器……这在 CSS 中是不可能的。我担心你只能手动编号。
猜你喜欢
  • 1970-01-01
  • 2012-09-16
  • 1970-01-01
  • 2021-06-09
  • 2021-12-01
  • 1970-01-01
  • 2011-07-17
  • 1970-01-01
相关资源
最近更新 更多