CSS、UL/OL : Incorrect indent with custom counter

标签 css html-lists counter before-filter

更新:这个问题已经找到了一个非常令人满意的解决方案,但在生产中弹出了副作用,我在 this thread 中对此进行了描述。 .


所以,我在我的 OL 中使用自定义计数器来获得像“1 - 1.1 - 1.1.1”这样的编号
工作正常。

但是当我这样做的时候,LI 的缩进是错误的。文本与数字的左边缘对齐,而不是与右边缘对齐(像标准 OL 那样)。
编辑:为了按照我想要的方式排列数字,我不得不弄乱 OL 的标准填充/边距。
现在文本与数字的左边缘对齐,而不是与右边缘对齐(像标准 OL 那样)。

我尝试了很多方法,但不知何故我似乎无法控制 LI 内容的左边缘。
此外,此功能显然并不经常使用,因此网络搜索没有产生任何提示:-(

有人知道我遗漏了什么吗?

在下面,您可以找到 CSS 和 HTML,我已将测试用例放入此 cssdesk:http://cssdesk.com/EzPBG


CSS:

ol.wrong {
  margin-left: 0;
  padding-left: 20px;
  counter-reset: counter_level1;
  list-style: none outside none;
  display: block;
  line-height: 18px;
  width: 500px;
}
ol.wrong li {
  position: relative;
  list-style: none;
  margin-right:20px;
}
ol.wrong li:before {
  display: inline-block;
  position: relative;
  content: counter(counter_level1) ". ";
  counter-increment: counter_level1;
  font-weight: bold;
  width: 20px;
}

ol.wrong ol {
  counter-reset: counter_level2;
}  
ol.wrong ol li {
  margin-right:0px;
}
ol.wrong ol li:before {
  width: 40px;
  margin-left: 20px;
  content: counter(counter_level1, decimal) "." counter(counter_level2, decimal) ". ";
  counter-increment: counter_level2;
}

HTML

  <ol class="wrong">
        <li>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
            <ol>
                <li>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</li>
                <li>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</li>
            </ol>
        </li>
        <li>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
            <ol>
                <li>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</li>
                <li>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</li>
            </ol>
        </li>
        <li>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</li>
        <li>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</li>
    </ol>

最佳答案

这是一种方法:

ol.wrong {
  margin-left: 0;
  padding-left: 20px;
  counter-reset: counter_level1;
  list-style: none outside none;
  display: block;
  line-height: 18px;
  width: 500px;
}
ol.wrong li {
  position: relative;
  list-style: none;
  margin-right:20px;
  padding-left: 20px; /* create some space for the counter label */
  outline: 1px dotted blue;
}
ol.wrong li:before {
  display: inline-block; /* block would also work */
  position: absolute; /* move this out of the way of the text*/
  left: 0; /* move the counter labe into the space from the padding */
  content: counter(counter_level1) ". ";
  counter-increment: counter_level1;
  font-weight: bold;
  width: 20px;
}

您可以在以下位置查看代码:http://jsfiddle.net/audetwebdesign/wsmnJ/

伪元素技巧非常有用,在这个应用程序中是一个不错的选择。

首先在 ol.wrong li 的左侧添加一些填充,这将为放置标签创建一些空白。

在您的伪元素样式中,ol.wrong li:before,使用position: absolute 将标签从文本中移除并将其定位左:0。显示类型可以是 blockinline-block

然后您可以对内部嵌套的 ol 进行仿效。

刚刚在左侧创建了宽度等于计数器/标签元素所需宽度的填充。

关于CSS、UL/OL : Incorrect indent with custom counter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16521330/

相关文章:

html - CSS 网格创建不相等的网格

html - 如何使固定选取框居中?

css - 无法使此 CSS 按钮起作用

javascript - 动态创建 jquery 输入并从变量设置其值

python - While 循环计数器困惑

CSS - 如何为不同高度设置渐变色背景

jquery - 使用 jQuery 创建 div 时的 CSS 定位问题

html - 使省略号在 LI 中工作

html - ol 中的标题,左缩进或负文本缩进

PHP使用flock()的计数器问题