CSS在两个元素之间创建弯曲角?
-
25-09-2019 - |
题
我的UI在左侧有一个无序的列表。选择列表项目时, div
出现在右侧。我想弯曲 外角 在哪里 <li>
和 <div>
遇见。有些人称之为 负边界半径 或一个 倒角. 。请参阅下图中的白色箭头。
延长蓝色 <li>
到 <ul>
, ,我打算做这样的事情:
li {
right-margin: 2em;
border-radius: 8px;
}
li.active {
right-margin: 0;
border-bottom-right-radius: 0;
border-top-right-radius: 0;
}
有更好的方法扩展 <li>
到 <ul>
?显然,我还将包括Webkit和Mozilla边界半径CSS。
我不确定的主要事情是 外角 在活动的右下角下方 <li>
. 。我有一些想法,但它们似乎是黑客。有什么建议么?
请注意 <ul>
用灰色表示,但在真正的设计中是白色的。另外,我打算使用JavaScript来定位 <div>
正确时正确 <li>
选择。
解决方案
好吧,事实证明,我设法自己解决了问题。我一起砍了一个演示 - 一探究竟.
从本质上讲,还需要其他几个DOM元素,并且需要大量的CSS。如@Steve提供的链接中所述,需要坚实的背景。我不认为有任何方法可以在梯度背景或其他模式上做到这一点。
我最终像这样遇到了HTML:
ul.selectable {
padding-top: 1em;
padding-bottom: 1em;
width: 50%;
float: left;
}
ul.selectable li {
margin: 0 3em 0 4em;
border-radius: 8px;
-webkit-border-radius: 8px;
-khtml-border-radius: 8px;
-moz-border-radius: 8px;
}
ul.selectable li.active {
margin-right: 0;
}
ul.selectable li.active dl {
background-color: #4f9ddf;
}
ul.selectable li dt {
background-color: #dfd24f;
padding: 1em;
margin-left: -2em;
margin-right: -2em;
-webkit-border-radius: 8px;
-khtml-border-radius: 8px;
-moz-border-radius: 8px;
border-radius: 8px;
}
ul.selectable li dd {
padding: 0.25em;
background-color: #fff;
}
ul.selectable li.active dt {
background-color: #4f9ddf;
margin-right: 0;
-webkit-border-top-right-radius: 0;
-webkit-border-bottom-right-radius: 0;
-khtml-border-top-right-radius: 0;
-khtml-border-bottom-right-radius: 0;
-moz-border-radius-topright: 0;
-moz-border-radius-bottomright: 0;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
ul.selectable li.active dd.top {
-webkit-border-bottom-right-radius: 8px;
-khtml-border-bottom-right-radius: 8px;
-moz-border-radius-bottomright: 8px;
border-bottom-right-radius: 8px;
}
ul.selectable li.active dd.bot {
-webkit-border-top-right-radius: 8px;
-khtml-border-top-right-radius: 8px;
-moz-border-radius-topright: 8px;
border-top-right-radius: 8px;
}
div.right {
float: left;
padding-top: 3em;
width: 50%;
}
div.content {
height: 15em;
width: 80%;
background-color: #4f9ddf;
padding: 1em;
-webkit-border-radius: 8px;
-khtml-border-radius: 8px;
-moz-border-radius: 8px;
border-radius: 8px;
}
<ul class="selectable">
<li>
<dl>
<dd class="top"></dd>
<dt>Title</dt>
<dd class="bot"></dd>
</dl>
</li>
<li class="active">
<dl>
<dd class="top"></dd>
<dt>Title</dt>
<dd class="bot"></dd>
</dl>
</li>
<li>
<dl>
<dd class="top"></dd>
<dt>Title</dt>
<dd class="bot"></dd>
</dl>
</li>
</ul>
<div class="right">
<div class="content">This is content</div>
</div>
当我只是将其砍在一起时,我还没有优化任何CSS。但是也许这会帮助别人。我仅在Mac OSX上的Google Chrome中对此进行了测试。
其他提示
清洁器解决方案(较少的代码& 允许背景梯度)
<ul class="selectable">
<li>Title</li>
<li class="active">Title</li>
<li>Title</li>
<li>Title</li>
</ul>
<div class="right">
<div class="content">This is content</div>
</div>
和此CSS(关键是允许 border-radius
和 border-width
在伪元素上为您制作倒圆;我省略了 gradient
代码。):
ul.selectable {
padding-top: 1em;
padding-bottom: 1em;
width: 50%;
float: left;
}
ul.selectable li {
margin: 1em 1em 1em 2em;
padding: 1em;
border-radius: 8px;
-webkit-border-radius: 8px;
-khtml-border-radius: 8px;
-moz-border-radius: 8px;
background-color: #dfd24f;
position: relative;
}
ul.selectable li.active {
margin-right: 0;
background-color: #4f9ddf;
-webkit-border-top-right-radius: 0;
-webkit-border-bottom-right-radius: 0;
-khtml-border-top-right-radius: 0;
-khtml-border-bottom-right-radius: 0;
-moz-border-radius-topright: 0;
-moz-border-radius-bottomright: 0;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
ul.selectable li.active:before,
ul.selectable li.active:after {
content: '';
position: absolute;
left: 100%; /* I use this instead of right: 0 to avoid 1px rounding errors */
margin-left: -8px; /* I use this because I am using left: 100% */
width: 8px;
height: 8px;
border-right: 8px solid #4f9ddf;
z-index: -1;
}
ul.selectable li.active:before {
top: -8px;
border-bottom: 8px solid #4f9ddf;
-webkit-border-bottom-right-radius: 16px;
-khtml-border-bottom-right-radius: 16px;
-moz-border-radius-bottomright: 16px;
border-bottom-right-radius: 16px;
}
ul.selectable li.active:after {
bottom: -8px;
border-top: 8px solid #4f9ddf;
-webkit-border-top-right-radius: 16px;
-khtml-border-top-right-radius: 16px;
-moz-border-radius-topright: 16px;
border-top-right-radius: 16px;
}
div.right {
float: left;
padding-top: 3em;
width: 50%;
}
div.content {
height: 15em;
width: 80%;
background-color: #4f9ddf;
padding: 1em;
-webkit-border-radius: 8px;
-khtml-border-radius: 8px;
-moz-border-radius: 8px;
border-radius: 8px;
}
我提出了一个解决方案,该解决方案需要更少的加价。总而言之,而不是使用边缘,而是使用白色圆形边界,而是将活跃的li定位在白色圆形边界后面,以达到倒边界 - 拉迪乌斯效应。
<ul class="selectable">
<li>
<a href="#">Title</a>
</li>
<li class="active">
<a href="#">Title</a>
</li>
<li>
<a href="#">Title</a>
</li>
<li>
<a href="#">Title</a>
</li>
</ul>
<div class="right">
<div class="content">This is content</div>
</div>
而且CSS也更少! (这是头脑弯曲):
a { color: #000; text-decoration: none;}
ul.selectable {
padding: 1em 1em;
width: 40%;
float: left;
}
ul.selectable li {
margin: -1em 0 0 0;
border-radius: 8px;
-webkit-border-radius: 8px;
-khtml-border-radius: 8px;
-moz-border-radius: 8px;
border: solid #fff 1em;
position: relative;
}
ul.selectable li a {
background-color: #dfd24f;
padding: 1em;
display: block;
border-radius: 8px;
-webkit-border-radius: 8px;
-khtml-border-radius: 8px;
-moz-border-radius: 8px;
}
ul.selectable li.active {
margin: -1em -1em -1em 1em;
border: solid #4f9ddf 1em;
border-left: solid #fff 1em;
background-color: #4f9ddf;
position: static;
}
ul.selectable li.active a {
margin: 0 0 0 -1em;
border-left: solid #4f9ddf 1em;
background-color: #4f9ddf;
position: static;
text-indent: -1em;
}
div.right {
float: left;
padding-top: 3em;
width: 50%;
margin-left: -1em;
}
div.content {
height: 15em;
width: 80%;
background-color: #4f9ddf;
padding: 1em;
-webkit-border-radius: 8px;
-khtml-border-radius: 8px;
-moz-border-radius: 8px;
border-radius: 8px;
}
说实话,我不确定它是一个更好的版本,它确实使梯度/图像背景变得容易(至少对于非活动性LI),但是您不能将图像/梯度背景应用到身体上。它也是“坏魔法”的感觉,它以一种非直觉的方式工作。
不是真的,对不起,per
为了通过非固体BG执行此操作,我认为您不能使用CSS来做到这一点,但是您可以使用帆布或SVG达到相同的效果 - 不过,您的要求并非完全如此。
但是,似乎确实有一个 负边界半径的建议 那将解决问题。也许有一天,对。
这很好 CSS教程中的逆边界半径 可以做到这一点。说明如何对选项卡进行反边界半径。但是它可以很容易地适应您的CSS,因为它使用了 :after
而不是创建太多额外的元素。