如何在单击侧面导航栏元素时制作书签类功能区?

How to make Bookmark kind of Ribbon on click of side navbar element?

我的应用程序中有一个侧面导航栏,它包含 4 个导航项。在初始加载时,它们应该如下所示 -

单击每个项目时,该项目的背景应更改如下 -

我已经尝试了下面的代码(对 CSS 的了解有限)并且能够得到第一张图片中显示的内容。对于第二张图片,它显示如下,应该像第二张图片一样完成。

HTML

<div class="container">
  <nav class="col-sm-3">
    <ul class="nav nav-pills nav-stacked">
      <li><a href="javascript:void(0);">Item 1</a></li>
      <li><a href="javascript:void(0);">Item 2</a></li>
      <li><a href="javascript:void(0);">Item 3</a></li>
      <li><a href="javascript:void(0);">Item 4</a></li>
   </ul>
  </nav>
</div>

CSS

.nav-pills>li {
   margin-left: -5px;
}
.nav-pills>li {
   width: 90%;
}
.nav-pills>li>a{
  color: #0D0D0D;
  background-color: #e1e1e1;
  padding: 15px;
}

.nav-pills>li>a:focus, .nav-pills>li>a:active{
  /*background-color: white;*/
  border:       30px solid lightgreen;
  border-left:  30px solid transparent;
  border-right: 0;
  width:        100%;

}

我正在使用 bootstrap4 发布我的答案,但这里的关键点与使用 bootstrap3 还是 bootstrap4 无关。这里的关键点是如何制作三角形。

演示:http://jsfiddle.net/aq9Laaew/81019/

CSS三角形

这里已经解释的很好了,这里就不解释了:https://css-tricks.com/snippets/css/css-triangle/

这里的思路是利用activenav-link:before做一个白底三角形

计算

如果想让三角形的尖端在菜单正中间,需要计算它的总高度。

Total height = border top (1px) + 
               padding top (1rem) +
               line height (1.5 x 1rem = 1.5rem) +
               padding bottom (1rem) +
               border bottom (1px)

然后将它除以 2 为边框顶部和底部的宽度。

  • 使用::before::after伪元素创建 2 层,这些伪元素的高度等于父元素高度的 50%。
  • 在这些图层上应用 backgroundborder-radius 和其他必要的 CSS 属性。
  • 在悬停时使用 skewX() 变换来创建三角形效果。

演示:

*, *::before, *::after { box-sizing: border-box; }

body {
  background: #333 url("https://k39.kn3.net/A01CCB6AE.jpg") no-repeat;
  background-size: cover;
  height: 100vh;
  padding: 10px;
  margin: 0;
}

.nav {
  font-family: Arial, sans-serif;
  list-style: none;
  padding: 0;
  margin: 0;
}

.nav li + li {
  margin-top: 3px;
}

.nav li a {
  text-decoration: none;
  border-radius: 2px;
  position: relative;
  padding: 12px 18px;
  overflow: hidden;
  display: block;
  color: #000;
}

.nav li a::before,
.nav li a::after {
  transition: transform .2s linear;
  transform-origin: left top;
  background-color: #dcdcdc;
  position: absolute;
  opacity: 0.5;
  content: '';
  height: 50%;
  z-index: -1;
  right: 0;
  left: 0;
  top: 0;
}

.nav li a::after {
  transform-origin: left bottom;
  top: auto;
  bottom: 0;
}


.nav li a:hover::before {
  transform: skewX(30deg);
}

.nav li a:hover::after {
  transform: skewX(-30deg);
}
<ul class="nav">
  <li><a href="#">Item 1</a></li>
  <li><a href="#">Item 2</a></li>
  <li><a href="#">Item 3</a></li>
  <li><a href="#">Item 4</a></li>
</ul>

使用box-shadow and Pseudo-elements

*{
  box-sizing:border-box
}
body {
   width: 100wh;
   height: 100vh; 
   background: linear-gradient(-45deg, #EE7752, #E73C7E, #23A6D5, #23D5AB);
   background-size: 400% 400%; 
   animation: Gradient 15s ease infinite;
   }


   @keyframes Gradient {
  0%,100% { background-position: 0% 50% }
  50% { background-position: 100% 50% } 
} 
menu{
  margin: 40px auto;
  position: relative; 
  max-width: 320px
}
menu li{
  position: relative;
  list-style: none;
  overflow: hidden;  
  margin-bottom: 2px
}
menu li:before{
    content: "";
    position: absolute;
    top: 0;
    left: 0;
    z-index:-1;
    height: 40px;
    width: 40px;
    opacity:0;
    margin-left: -30px;
    box-shadow: 0px 0px 0px 480px #d1e3ab;
    transform-origin: center;
    transform: rotate(45deg);
}
menu a{
  display: block;
  text-decoration: none;
  color:#5e5e5e;
  font-size: 14px;
  background-color: #e1e1e1;
  padding: 12px 10px;
  text-indent: 24px;
} 
menu li:hover a{ 
  background-color: transparent; 
}
menu li:hover:before{ 
  opacity:1
}
<menu>
  <li><a href="#">Item 1</a></li>
  <li><a href="#">Item 2</a></li>
  <li><a href="#">Item 3</a></li>
  <li><a href="#">Item 4</a></li>
</menu>