【问题标题】:how to connect circles with lines without overlapping如何用线连接圆而不重叠
【发布时间】:2017-07-26 20:07:22
【问题描述】:

我如何将这个圆圈与 css(或 js/jquery)连接起来,以便在屏幕较小时它可以响应并且线条不会重叠。我也尝试过在整个容器后面排线,但由于我的圆圈需要透明,所以线总是在圆圈后面:

这是线不在每个圆圈后面的唯一方法。但我不知道如何使它不重叠,我需要我的线从一个边界到另一个边界。 此外,当我减小宽度时,线条重叠并在圆圈后面。

演示:http://codepen.io/riogrande/pen/jqVKBb

css:

.flex-container {
  padding: 0;
  margin: 0;
  list-style: none;
  -ms-box-orient: horizontal;
  display: -webkit-box;
  display: -ms-flexbox;
  display: -moz-flex;
  display: -webkit-flex;
  display: flex;
  -webkit-box-pack: justify;
  -webkit-justify-content: space-between;
      -ms-flex-pack: justify;
          justify-content: space-between;
}
.flex-container .flex-item {
  background: transparent;
  width: 50px;
  height: 50px;
  margin: 5px;
  line-height: 50px;
  color: #ffefbd;
  font-weight: bold;
  font-size: 22px;
  text-align: center;
  border: 6px solid #ffefbd;
  border-radius: 50%;
  position: relative;
}
.flex-container .flex-item:after {
  width: 100%;
  border-top: 6px solid #ffefbd;
  content: '';
  display: block;
  position: absolute;
  left: 100%;
  top: 50%;
  -webkit-transform: translateY(-50%);
          transform: translateY(-50%);
}
.flex-container .flex-item:before {
  width: 100%;
  border-top: 6px solid #ffefbd;
  content: '';
  display: block;
  position: absolute;
  right: 100%;
  top: 50%;
  -webkit-transform: translateY(-50%);
          transform: translateY(-50%);
}
.flex-container .flex-item:last-child:after {
  display: none;
}
.flex-container .flex-item:first-child:before {
  display: none;
}

html:

<ul class="flex-container space-between">
  <li class="flex-item">1</li>
  <li class="flex-item">2</li>
  <li class="flex-item">3</li>
  <li class="flex-item">4</li>
  <li class="flex-item">5</li>
  <li class="flex-item">6</li>
  <li class="flex-item">7</li>
</ul>

【问题讨论】:

  • 因为您使用的是伪元素(::before 和::after),所以在加载 DOM 时没有可用于 JS/JQ 的元素。我能看到让这些行响应式行为的唯一方法是在页面操作期间手动将样式添加到样式表(请参阅stackoverflow.com/questions/5041494/…)。
  • 但我怎么连圈子?
  • 由于您需要它们的背景透明并且不能使用 CSS,我建议您重写其中的线条是单独的元素。这将允许您使用 JQ/JS 执行基本的数学运算,允许您将它们连接到圆的边缘。不幸的是,由于我的工作量,我无法帮助重写:/ 有很多不同的解决方案 (stackoverflow.com/questions/19382872/…),还有一些 GitHub 项目可能会让你觉得这很简单 (github.com/jfmdev/jqSimpleConnect, jfmdev.github.io/jqSimpleConnect/demo2.html)
  • 啊,那对不起。不过,它绝对可以使用 JS/JQ。很久以前,我以这种方式为游戏 PowerGrid 的在线版本制作了一个节点/边图生成器,但该代码丢失了。祝你好运,希望我能有所帮助。
  • 不知道如何用 CSS 来做这件事,编写代码来计算每行的位置和宽度以在浏览器调整大小时呈现可能需要做很多工作。但是如果你必须坚持使用 img 和 css,那就这样吧。但是,在表格中应该很简单。

标签: javascript jquery html css


【解决方案1】:

我使用简单的标记和 CSS 提出了这个解决方案。 Codepen 包含动画示例,以防这是一种进步。

Codepen:http://codepen.io/jpecor-pmi/pen/GZNPWO

HTML

<section id="circles">
    <div data-num="1"></div>
    <div data-num="2"></div>
    <div data-num="3"></div>
    <div data-num="4"></div>
    <div data-num="5"></div>
    <div data-num="6"></div>
    <div data-num="7"></div>
</section>

CSS

/*
  @circle-diameter: 50px;
  @circle-count: 7;
  @border-width: 6px;
  @border-color: #ffefbd;
*/

/* circle containers */

#circles > div {
    background: transparent;
    font-weight: bold;
    float: left;
    height: 50px; /* @circle-diameter */
    position: relative;
    width: calc((100% - 50px) / 6 - .1px); /* (100% - @circle-diameter) / (@circle-count - 1) - 0.1px for IE :( */
}

/* circle */

#circles > div::before {
    border: 6px solid #ffefbd; /* @border-thickness solid @border-color */
    border-radius: 25px; /* @circle-diameter / 2 */
    color: #ffefbd;
    content: attr(data-num); /* value from data-num attribute */
    display: block;
    float: left;
    font: 21px sans-serif;
    height: 50px; /* @circle-diameter */
    line-height: 38px;
    text-align: center;
    width: 50px; /* @circle-diameter */
}

/* line */

#circles > div::after {
    background: #ffefbd; /* @border-color */
    content: '';
    display: block;
    height: 6px; /* @border-thickness */
    position: absolute;
    right: -1px; /* removes gap between circle and line */
    top: calc(50% - 3px); /* 50% - (@border-thickness / 2) */
    width: calc(100% - 48px); /* 100% - (@circle-diameter - 2px) */
}

/* first circle */

#circles > div:first-child {
    width: 50px; /* @circle-diameter */
}

#circles > div:first-child::after {
    display: none; /* hide line for first circle */
}

/* reset */

#circles,
#circles > div,
#circles > div::before,
#circles > div::after {
    box-sizing: border-box;
    margin: 0;
    padding: 0;
}

【讨论】:

  • 漂亮的解决方案!你有没有看我的方式?只是想知道你的想法?
  • 谢谢!是的,实际上在 codepen 上尝试您的解决方案激发了我对它的尝试。
  • 嘿伙计,我将您的答案标记为正确,因为我喜欢您的做法和动画效果!再次感谢
【解决方案2】:

好的,所以我设法仅使用 CSS 来做到这一点。解决方案是将圆圈包装成宽度为“100%/n”的 div,其中“n”是您要显示的圆圈数。所以你需要知道有多少。在我的示例中,有 7 个圆圈。在这些 div 中,我放置了另一个名为 circle 的 div。此 div 具有圆形样式,其位置位于父 div 的中心,margin: 0 auto;。使用伪元素,我创建了需要非常大(长度)的线条,因此不会有任何孔。然后用position: relative;overflow: hidden; 纠正重叠。圆圈是透明的,但线条永远不会与其他 div 交叉。哈克但有效。

完整代码在:http://codepen.io/riogrande/pen/reWQeK

css:

* {
  box-sizing: border-box;
}

.progress {
  .sevent{
    width: (100/7) * 1%;
    text-align: center;
    float: left;
    background:lightblue;
    position: relative;
    overflow: hidden;
    .circle {
      width: 60px;
      height:60px;
      margin: 0 auto;
      border: 6px solid red;
      border-radius:50%;
      position: relative;
      &:before {
        content: "";
        width: 300%;
        border-top: 6px solid red;
        position: absolute;
        right: 100%;
        top: 50%;
        transform:translateY(-50%);
      }
      &:after {
        content: "";
        width: 300%;
        border-top: 6px solid red;
        position: absolute;
        left: 100%;
        top: 50%;
        transform:translateY(-50%);
      }
    }
    &:last-child {
      .circle {
        &:after {
          display: none;
        }
      }
    }
    &:first-child {
      .circle {
        &:before {
          display: none;
        }
      }
    }
  }
}

HTML:

<div class="progress">

  <div class="sevent">
    <div class="circle">
      1
    </div>
  </div>

  <div class="sevent">
    <div class="circle">
      1
    </div>
  </div>

  <div class="sevent">
    <div class="circle">
      1
    </div>
  </div>

  <div class="sevent">
    <div class="circle">
      1
    </div>
  </div>

  <div class="sevent">
    <div class="circle">
      1
    </div>
  </div>

  <div class="sevent">
    <div class="circle">
      1
    </div>
  </div>

  <div class="sevent">
    <div class="circle">
      1
    </div>
  </div>

</div>

【讨论】:

  • 你能告诉我什么浏览器和宽度?
  • Chrome v49 - 1920x1080
  • 请您打开我的codepen并尝试从宽度:300%增加前后圆圈的宽度;到宽度:9999%;之前和之后。然后看看有没有破?非常感谢
  • 这似乎有效。仅供参考,Stack Snippets 让这样的事情更容易演示。不必离开网站对我个人而言是一件的事情。
  • 感谢您的帮助,并提供信息,会考虑!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 2021-12-04
  • 2018-05-02
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
相关资源
最近更新 更多