代码之家  ›  专栏  ›  技术社区  ›  Mike Lischke

如何在一个::after伪元素中自动调整圆的大小?

css
  •  3
  • Mike Lischke  · 技术社区  · 4 年前

    我正在尝试创建一个圆作为 ::after 伪元素,根据其内容自动调整大小。

    .container {
        display: flex;
        flex-direction: row;
    }
    
    #dividerHost2 #left {
        flex: 1 1 auto;
        background-color: yellowgreen;
        height: 200px;
    }
    
    #dividerHost2 #right {
        flex: 1 1 auto;
        background-color: dodgerblue;
    }
    
    #dividerHost2 .divider {
        background-color: white;
        margin: 0px;
        width: 6px;
        font-weight: 800;
    }
    
    .divider.vertical {
        --divider-color: transparent;
        display: inline-flex;
    
        width: 1px;
        border-left: 1px solid rgb(var(--divider-color));
        margin: 0px 2px 0px 2px;
        overflow: show;
    }
    
    .divider.vertical.title::after {
        flex: 0 0 auto;
        align-self: center;
        border-radius: 50%;
        content: "OR";
        padding: 9px 8px 11px 8px;
        background-color: white;
        color: black;
    
        transform: translateX(-44%);
        z-index: 10;
    }
    <div id="dividerHost2" class="container">
      <div id="left" class="container" style="flex-direction: row;"></div>
      <div id="divider3" class="divider vertical title"></div>
      <div id="right" class="container" style="flex-direction: row;"></div>
    </div>

    enter image description here

    JSFiddle公司 https://jsfiddle.net/jsnbtmh3/

    但是,如果文本较长,圆圈将变为椭圆形:

    enter image description here

    如何根据内容自动调整圆的大小?

    1 回复  |  直到 4 年前
        1
  •  3
  •   Temani Afif BoltClock    4 年前

    这里有一个使用径向梯度的技巧。其思想是保持元素的完整高度并使用 circle closest-side 它将始终创建一个从中心开始并扩展到最近边(左边和右边)的圆

    我简化了代码,只保留了相关部分:

    .container {
      display: flex;
      flex-direction: row;
      margin:10px;
    }
    
    .left {
      flex: 1 1 auto;
      background-color: yellowgreen;
      height: 200px;
    }
    
    .right {
      flex: 1 1 auto;
      background-color: dodgerblue;
    }
    
    .divider {
      background-color: white;
      width: 6px;
      font-weight: 800;
      display: flex;
      justify-content: center;
    }
    
    .divider::after {
      display: flex;
      align-items: center;
      flex: 0 0 auto;
      content: attr(data-text);
      padding: 0 8px;
      background: radial-gradient(circle closest-side, white 98%, transparent 100%);
      z-index: 10;
    }
    <div  class="container">
      <div class="left "></div>
      <div class="divider" data-text="OR"></div>
      <div class="right "></div>
    </div>
    
    <div class="container">
      <div class="left "></div>
      <div class="divider" data-text="longer"></div>
      <div class="right "></div>
    </div>
    
    <div class="container">
      <div class="left "></div>
      <div class="divider" data-text="even longer"></div>
      <div class="right "></div>
    </div>
        2
  •  2
  •   Paulie_D    4 年前

    body {
      text-align: center;
    }
    
    .divider {
      margin: 3em;
      display: inline-block;
      position: relative;
      padding: 1em;
      font-weight: bold;
    }
    
    .divider:after {
      content: "";
      position: absolute;
      width: 100%;
      padding-top: 100%;
      background: lightblue;
      border-radius: 50%;
      left: 50%;
      top: 50%;
      transform: translate(-50%, -50%);
      z-index: -1;
    }
    <div class="divider">OR</div>
    
    <div class="divider">LONG TEXT</div>