如何设置ul/ols的样式以便能够灵活地包裹浮动内容?

Dan*_*son 7 html css html-lists css-float rich-text-editor

我觉得应该是一个相对简单的约束,我似乎无法找到解决方案.我正在尝试构建一组WYSIWYG组件样式,这些样式将灵活地一起工作,并且无法获得项目符号/编号列表的组合,以便可预测地围绕浮动数字进行包装而不会丢失缩进或导致重叠内容:

限制:

  • 对于每个嵌套级别,嵌套列表应缩进更多
  • 浮动内容可以浮动到右侧或左侧
  • 列表可以任意长,并且应该可以预测地围绕浮动内容进行包装

这是具有"float:left"设置的内容右侧列表的默认样式.子弹与浮动内容重叠,并且压痕丢失.

.pull-left {
  background: #3333ff;
  color: white;
  float: left;
  width: 50%;
  height: 80px;
}
Run Code Online (Sandbox Code Playgroud)
<div class="pull-left">Floating content</div>

<ul>
  <li>First Item
    <ul>
      <li>Nested Item</li>
      <li>Nested Item</li>
    </ul>
  </li>
  <li>Second Item</li>
  <li>Third Item
    <ul>
      <li>Nested Item</li>
      <li>Nested Item</li>
    </ul>
  </li>
</ul>
Run Code Online (Sandbox Code Playgroud)

在元素上设置值overflow(即overflow: hidden)可以<ul>修复项目符号格式+缩进,但不允许内容换行:

.pull-left {
  background: #3333ff;
  color: white;
  float: left;
  width: 50%;
  height: 80px;
}

ul {
  overflow: hidden;
}
Run Code Online (Sandbox Code Playgroud)
<div class="pull-left">Floating content</div>

<ul>
  <li>First Item
    <ul>
      <li>Nested Item</li>
      <li>Nested Item</li>
    </ul>
  </li>
  <li>Second Item</li>
  <li>Third Item
    <ul>
      <li>Nested Item</li>
      <li>Nested Item</li>
    </ul>
  </li>
</ul>
Run Code Online (Sandbox Code Playgroud)

我能想到的唯一其他解决方案是使用嵌套的transforms和offset padding来使其工作:

.pull-left {
  background: #3333ff;
  color: white;
  float: left;
  width: 50%;
  height: 80px;
}

ul {
  padding: 0;
}

li {
  list-style-position: inside;
  transform: translateX(30px);
  padding-right: 30px;
}
Run Code Online (Sandbox Code Playgroud)
<div class="pull-left">Floating content</div>

<ul>
  <li>First Item
    <ul>
      <li>Nested Item</li>
      <li>Nested Item</li>
    </ul>
  </li>
  <li>Second Item</li>
  <li>Third Item
    <ul>
      <li>Nested Item</li>
      <li>Nested Item</li>
    </ul>
  </li>
</ul>
Run Code Online (Sandbox Code Playgroud)

但是,当浮动内容向右浮动时,此解决方案不起作用:

.pull-right {
  background: #3333ff;
  color: white;
  float: right;
  width: 50%;
  height: 80px;
}

ul {
  padding: 0;
}

li {
  list-style-position: inside;
  transform: translateX(30px);
  padding-right: 30px;
}
Run Code Online (Sandbox Code Playgroud)
<div class="pull-right">Floating content</div>

<ul>
  <li>First Item
    <ul>
      <li>Nested Item with long enough text that it overlaps the floating content</li>
      <li>Nested Item</li>
    </ul>
  </li>
  <li>Second Item</li>
  <li>Third Item
    <ul>
      <li>Nested Item</li>
      <li>Nested Item</li>
    </ul>
  </li>
</ul>
Run Code Online (Sandbox Code Playgroud)

我已经在网上搜索了一个灵活的解决方案,并且在任何地方找不到任何东西.这套(非常合理的)限制是不是可以做到的事情?或者我错过了什么?

Tem*_*fif 1

我认为您已经接近transform解决方案,但您可能可以更改它以使用text-indent和调整每个级别的缩进。

.pull-left {
  background: #3333ff;
  color: white;
  float: left;
  width: 50%;
  height: 80px;
}

ul {
  padding: 0;
}

li {
  list-style-position: inside;
  text-indent: 10px;
  padding-right: 30px;
}

ul ul>li {
  text-indent: 20px;
}

ul ul ul>li {
  text-indent: 30px;
}

ul ul ul ul>li {
  text-indent: 40px;
}
Run Code Online (Sandbox Code Playgroud)
<div class="pull-left">Floating content</div>

<ul>
  <li>First Item
    <ul>
      <li>Nested Item</li>
      <li>Nested Item
        <ul>
          <li>Nested Item</li>
          <li>Nested Item</li>
        </ul>
      </li>
    </ul>
  </li>
  <li>Second Item</li>
  <li>Third Item
    <ul>
      <li>Nested Item</li>
      <li>Nested Item</li>
    </ul>
  </li>
</ul>
Run Code Online (Sandbox Code Playgroud)

右浮动也可以:

.pull-right {
  background: #3333ff;
  color: white;
  float: right;
  width: 50%;
  height: 80px;
}

ul {
  padding: 0;
}

li {
  list-style-position: inside;
  text-indent: 10px;
  padding-right: 30px;
}

ul ul>li {
  text-indent: 20px;
}

ul ul ul>li {
  text-indent: 30px;
}

ul ul ul ul>li {
  text-indent: 40px;
}
Run Code Online (Sandbox Code Playgroud)
<div class="pull-right">Floating content</div>

<ul>
  <li>First Item
    <ul>
      <li>Nested Item long long long long long long long long long text</li>
      <li>Nested Item
        <ul>
          <li>Nested Item with long long long long long long long long long text</li>
          <li>Nested Item</li>
        </ul>
      </li>
    </ul>
  </li>
  <li>Second Item</li>
  <li>Third Item
    <ul>
      <li>Nested Item</li>
      <li>Nested Item</li>
    </ul>
  </li>
</ul>
Run Code Online (Sandbox Code Playgroud)