如何弯曲接近圆的div/li

How to curve the div/li which is near to circle

我有以下代码。我想要实现的是 li:before 圆形部分应该具有曲线形式,以便与圆形相匹配。我试过了,但不知道怎么做。在这方面帮助我。

.test {
  list-style: none;
  margin: 0;
  padding: 0
}

.test li {
  float: left;
  margin: auto;
  width: 192px;
  height: 50px;
  border: 4px black double;
  text-align: center;
}
<div style="border:4px black double; height:200px;position:relative;background:url('')">
  <div class="myimage" style="width:200px; height:200px; position:absolute; top: 200;left: 0;right: 0;bottom: 0;margin: auto;border:8px gray double; border-radius:100px;background:url('') 200px; ">
  </div>
</div>
<div style="clear:both"></div>
<div style="border:1px green solid">
  <div style="border:1px red solid;float:left;width:602px;">
    <ul class="test">
      <li>1</li>
      <li>2</li>
      <li style="">3</li>
    </ul>
  </div>
  <div style="border:1px red solid;float:right;width:602px">
    <ul class="test">
      <li>4</li>
      <li>5</li>
      <li>6</li>
    </ul>
  </div>
  <div style="clear:both"></div>
</div>

您可以只使用 border-radiuspadding 属性以及一些其他技巧来实现所需的布局。演示:

.test {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
}

.test li {
  width: 192px;
  height: 50px;
  border: 4px black double;
  text-align: center;
}

.test li:nth-child(3) {
  padding-right: 25px;
  border-top-right-radius: 25px;
  border-bottom-right-radius: 25px;
}

.test li:nth-child(4) {
  padding-left: 25px;
  border-top-left-radius: 25px;
  border-bottom-left-radius: 25px;
}
<div style="border:4px black double; height:200px;position:relative;background:url('')">
  <div class="myimage" style="box-sizing: border-box; width:200px; height:200px; position:absolute; top: 200;left: 0;right: 0;bottom: 0;margin: auto;border:8px gray double; border-radius:100px;background:url('') 200px; ">
  </div>
</div>
<div style="border: 1px green solid">
  <div style="border:1px red solid;">
    <ul class="test">
      <li>1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
      <li>5</li>
      <li>6</li>
    </ul>
  </div>
</div>

您正在寻找的是一种反边界边界遵循圆的外部形状的场景。

我有put together a solution。看看吧。

编辑:添加说明
为了达到结果,您需要添加一个div 在 li/div 中,您希望其边框弯曲。

为 child div 设置 position: relative 允许它四处移动,同时也给它一个默认值 z-index 这使得它的可见性高于 parent。由于只需要parentli/div的底部是弧形的,设置border-bottom-right-radiusborder-bottom-left-radius 的 child div 到 100%。这将形成一个 semi-circle 从而有效地使您的 parent 的下边框看起来弯曲。但是现在,li/div 元素看起来好像它们的底部 right/left 边框已经消失了。要模拟这些边界,只需设置childdivborder-left/right属性。

也不要忘记在容器中添加 overflow: hidden 并将相同的 background-colour 应用到所有涉及到的元素,因为如果不设置颜色,需要隐藏的部分将可见,解决方案将不起作用。

这是相同的代码。

ul {
  list-style: none;
  overflow: hidden;
  background-color: white;
}

li {
  float: left;
  border: 2px solid black;
  width: 100px;
  height: 30px;
  text-align: center;
  background-color: white;
}

.right-circle {
  position: relative;
  border-bottom-left-radius: 100%;
  border-bottom-right-radius: 100%;
  width: 60px;
  height: 40px;
  background-color: white;
  border-left: 2px solid black;
  top: -22px;
  left: 90px;
}

.left-circle {
  position: relative;
  border-bottom-left-radius: 100%;
  border-bottom-right-radius: 100%;
  width: 60px;
  height: 40px;
  background-color: white;
  border-right: 2px solid black;
  top: -22px;
  left: -50px;
}

.empty {
  border: none;
  width: 50px;
}
<ul>
  <li>Element
    <div class="right-circle"></div>
  </li>

  <li class="empty"></li>
  <li>Element
    <div class="left-circle"></div>
  </li>
</ul>

你不能在 css 中创建这样的 div 形状,只能伪造它。

方法一:

#normal{
  /*box with normal border*/
  display: inline-block;
  width: calc(200px);
  height: calc(50px);
  border: 4px solid black;  
}
#curved{
  /*Faking the border*/
  display: inline-block;
  margin-top: 100px; 
  width: calc(200px + 4*0px);
  height: calc(50px + 4*0px);
  padding:4px; /* faking border space */
  border-width: 0;

  /*faking full border border*/
  background:
  radial-gradient(
    circle at 250px -50px,   /*center at 250,-50 from top left corner*/
    white,
    white calc(50*1.414px + 30px),  
    black calc(50*1.414px + 30px),
    black calc(53*1.414px + 30px),
    transparent calc(53*1.414px + 30px),
    transparent
    ), 
  /*faking straight lines*/
  linear-gradient(to bottom,black,black 4px,transparent 4px,transparent), /*top border*/
  linear-gradient(to left,black 4px,transparent 4px,transparent), /*right border*/
  linear-gradient(to top,black 4px,transparent 4px,transparent), /*bottom border*/
  linear-gradient(to right,black 4px,transparent 4px,transparent) /*left border*/
  ;

}
<div id="normal">1</div>
<div id="curved">2</div>

图片说明:

框外的所有内容都被剪掉了,这就是渐变的工作原理。可以创建不同尺寸的椭圆或圆。径向渐变位于其他四个假边框之上。

方法二:

div{
  margin: 50px;
  position: relative;
  background-color: red;
  width: 200px;
  height: 50px;
  overflow: hidden;
}
div::before{
  content: '';
  position: absolute;
  width: 100%;
  height: 100%;
  border: 2px solid black;
  box-sizing:border-box;
}
div::after{
  content: '';
  position: absolute;
  background-color: white;
  width: 100px;
  height: 100px;
  border-radius: 100%;
  top: -2px;
  left:200px;
  transform:translate(-50%,-50%);

  border: 2px solid black; 
}
<div></div>