You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现鼠标悬停时贯穿li元素及其marker的删除线效果?

解决
  • 悬停时删除线覆盖marker的问题
  • 默认情况下,给<li>添加text-decoration: line-through只会作用于内容部分,内置的::marker伪元素不会继承这个样式,而且无法直接给::marker添加:hover伪类(因为:hover是作用于父元素<li>的)。

    以下是两种可行的解决方案:

    方案一:自定义Marker(推荐)

    通过禁用默认列表标记,用计数器和伪元素模拟marker,让删除线能覆盖整个元素:

    ol {
      list-style: none;
      counter-reset: list-counter;
      padding-left: 0;
    }
    
    li {
      counter-increment: list-counter;
      padding-left: 1.5em;
      position: relative;
    }
    
    li::before {
      content: counter(list-counter) ".";
      position: absolute;
      left: 0;
    }
    
    li:hover {
      text-decoration: line-through;
    }
    
    <ol>
      <li>Foo</li>
      <li>Bar</li>
      <li>Foobar</li>
    </ol>
    

    这种方法的优势是删除线是原生的text-decoration,和文本的对齐更自然,完全覆盖自定义的marker区域。

    方案二:背景模拟删除线

    如果想保留默认的marker,可以用绝对定位的背景横线模拟贯穿效果:

    li {
      position: relative;
    }
    
    li:hover::after {
      content: "";
      position: absolute;
      top: 50%;
      left: 0;
      width: 100%;
      height: 1px;
      background-color: currentColor;
      transform: translateY(-50%);
    }
    
    <ol>
      <li>Foo</li>
      <li>Bar</li>
      <li>Foobar</li>
    </ol>
    

    这个方案不用修改默认marker,代码更简洁,但横线是背景元素,需要根据字体大小微调top或transform值来保证对齐准确。

    内容的提问来源于stack exchange,提问作者lukeypook

    相关产品推荐
    方舟 Agent Plan

    超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

    最近更新时间:2026.07.05 13:07:42