Добавление теней при перекрытии вкладок в CSS

Я создаю систему на основе вкладок, в которой вы можете добавлять дни и добавлять информацию для каждого дня. Я пытаюсь добиться перекрывающегося вида, когда дело доходит до вкладок, и хотел бы добавить своего рода эффект тени, когда вкладка перекрывается другой с левой стороны. В этом конкретном примере, когда активен первый день, внутренняя левая часть дня 2 будет иметь небольшую тень, чтобы она выглядела так, как будто она перекрывается. Как я могу добиться этого эффекта?

.breakout-holder {
  width: 100%;
  border: 1px solid black;
}

.heading {
  /* background-color: grey; */
  height: 40px;

  display: flex;
  align-items: flex-end;
}

.active {
  background-color: lightgreen !important;

  /* box-shadow: inset 0 20px 20px -20px #000000; */
  z-index: 5000;
}

.tab {
  font-weight: bold;
  background-color: lightgrey;
  color: black;

  height: 90%;
  width: auto;
  padding: 0 20px;
  text-align: center;
  display: flex;
  justify-content: center;
  align-items: center;
  border-top: 1px solid black;
  border-right: 1px solid black;
  border-left: 1px solid black;

  border-radius: 15px 15px 0 0;

  cursor: pointer;
}

.tab:not(:first-child) {
  margin-left: -5px;
}
<!DOCTYPE html>
<html lang = "en">
<head>
    <meta charset = "UTF-8">
    <meta name = "viewport" content = "width=device-width, initial-scale=1.0">
    <link rel = "stylesheet" href = "https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
    <link rel = "stylesheet" href = "breakoutStyle.css">
    <title>Breakout room form</title>
</head>
<body>
    <div class = "breakout-holder">
        <div class = "heading">
            <div class = "tab active">
                Day 1
            </div>
            <div class = "tab">
                Day 2
            </div>
            <div class = "tab" style = "z-index: -10">
                +
            </div>
        </div>
        <div class = "body"></div>
    </div>
</body>
<script src = "app.js"></script>
</html>

Я попытался добавить тень окна к элементам вкладки, которые находятся поверх другой вкладки. Этот метод не сработал, так как выглядит немного дешево, на мой взгляд.

Вот css, который я пытался добавить в класс css для вкладок

-webkit-box-shadow: 34px 0px 25px -13px rgba(0, 0, 0, 0.75);
  -moz-box-shadow: 34px 0px 25px -13px rgba(0, 0, 0, 0.75);
  box-shadow: 34px 0px 25px -13px rgba(0, 0, 0, 0.75);

🤔 А знаете ли вы, что...
CSS позволяет разработчикам разделять структуру и стиль веб-содержимого.


155
4

Ответы:

.breakout-holder {
  width: 100%;
  border: 1px solid black;
}

.heading {
  /* background-color: grey; */
  height: 40px;

  display: flex;
  align-items: flex-end;
}

.active {
  background-color: lightgreen !important;
  -webkit-box-shadow: 0px 10px 4px -2px rgba(0,0,0,0.75);
  -moz-box-shadow: 0px 10px 4px -2px rgba(0,0,0,0.75);
  box-shadow: 0px 10px 4px -2px rgba(0,0,0,0.75);
  z-index: 5000;
}

.tab {
  font-weight: bold;
  background-color: lightgrey;
  color: black;

  height: 90%;
  width: auto;
  padding: 0 20px;
  text-align: center;
  display: flex;
  justify-content: center;
  align-items: center;
  border-top: 1px solid black;
  border-right: 1px solid black;
  border-left: 1px solid black;

  border-radius: 15px 15px 0 0;

  cursor: pointer;
}

.tab:not(:first-child) {
  margin-left: -5px;
}
<!DOCTYPE html>
<html lang = "en">
<head>
    <meta charset = "UTF-8">
    <meta name = "viewport" content = "width=device-width, initial-scale=1.0">
    <link rel = "stylesheet" href = "https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
    <link rel = "stylesheet" href = "breakoutStyle.css">
    <title>Breakout room form</title>
</head>
<body>
    <div class = "breakout-holder">
        <div class = "heading">
            <div class = "tab active">
                Day 1
            </div>
            <div class = "tab">
                Day 2
            </div>
            <div class = "tab" style = "z-index: -10">
                +
            </div>
        </div>
        <div class = "body"></div>
    </div>
</body>
<script src = "app.js"></script>
</html>

Добавьте это на активную вкладку: box-shadow: 2px 1px 2px 1px rgba(0, 0, 0, 0.4);

.breakout-holder {
  width: 100%;
  border: 1px solid black;
}

.heading {
  /* background-color: grey; */
  height: 40px;

  display: flex;
  align-items: flex-end;
}

.active {
  background-color: lightgreen !important;

  box-shadow: 2px 1px 2px 1px rgba(0, 0, 0, 0.4); 
  z-index: 5000;
}

.tab {
  font-weight: bold;
  background-color: lightgrey;
  color: black;

  height: 90%;
  width: auto;
  padding: 0 20px;
  text-align: center;
  display: flex;
  justify-content: center;
  align-items: center;
  border-top: 1px solid black;
  border-right: 1px solid black;
  border-left: 1px solid black;

  border-radius: 15px 15px 0 0;

  cursor: pointer;
}

.tab:not(:first-child) {
  margin-left: -5px;
}
<!DOCTYPE html>
<html lang = "en">
<head>
    <meta charset = "UTF-8">
    <meta name = "viewport" content = "width=device-width, initial-scale=1.0">
    <link rel = "stylesheet" href = "https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
    <link rel = "stylesheet" href = "breakoutStyle.css">
    <title>Breakout room form</title>
</head>
<body>
    <div class = "breakout-holder">
        <div class = "heading">
            <div class = "tab active">
                Day 1
            </div>
            <div class = "tab">
                Day 2
            </div>
            <div class = "tab" style = "z-index: -10">
                +
            </div>
        </div>
        <div class = "body"></div>
    </div>
</body>
<script src = "app.js"></script>
</html>

Решено

Вы можете использовать для этого псевдоэлементы, но предостережение: вы не можете использовать отрицательный z-index из-за контекста стека и необходимости, чтобы вкладка active находилась над другими вкладками.

Это в основном использование box-shadow и transform: skew для имитации любой стороны активной вкладки.

Затем у меня есть стили для первой и последней вкладок active, поэтому :before и :after соответственно не отображаются, если они активны.

Этот подход дает вам немного более «полированный» вид вместо того, чтобы просто использовать box-shadow на активной вкладке.

.breakout-holder {
  width: 100%;
  border: 1px solid black;
}

.heading {
  /* background-color: grey; */
  height: 40px;
  display: flex;
  align-items: flex-end;
  position: relative;
}

.tab.active {
  position: relative;
  background-color: lightgreen !important;
  z-index: 5;
}

.tab {
  position: relative;
  font-weight: bold;
  background-color: lightgrey;
  color: black;
  height: 90%;
  width: auto;
  padding: 0 20px;
  text-align: center;
  display: flex;
  justify-content: center;
  align-items: center;
  border-top: 1px solid black;
  border-right: 1px solid black;
  border-left: 1px solid black;
  border-radius: 15px 15px 0 0;
  cursor: pointer;
}

.tab:not(:first-child) {
  margin-left: -5px;
}

.tab::before,
.tab::after {
  content: '';
  position: absolute;
  left: 0;
  bottom: 2px;
  box-shadow: -3px 0px 4px 1px rgba(0, 0, 0, .3);
  transform: skew(-5deg,-10deg);
  width: 1px;
  height: 60%;
  border-radius: 0;
  display: none;
}

.tab::after {
  left: auto;
  right: 0;
  box-shadow: 3px 1px 4px 1px rgba(0, 0, 0, .3);
  transform: skew(5deg,10deg);
}

.tab.active::before,
.tab.active::after {
  z-index: -1;
  display: block;
}

.tab.active:first-child::before {
  display: none;
}

.tab.active:last-child::after {
  display: none;
}
<!DOCTYPE html>
<html lang = "en">

<head>
  <meta charset = "UTF-8">
  <meta name = "viewport" content = "width=device-width, initial-scale=1.0">
  <link rel = "stylesheet" href = "https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
  <link rel = "stylesheet" href = "breakoutStyle.css">
  <title>Breakout room form</title>
</head>

<body>
  <div class = "breakout-holder">
    <div class = "heading">
      <div class = "tab">
        Day 1
      </div>
      <div class = "tab active">
        Day 2
      </div>
      <div class = "tab">
        +
      </div>
    </div>
    <div class = "body"></div>
  </div>
</body>
<script src = "app.js"></script>

</html>

Было бы неплохо, если бы вы могли связать несколько примеров того, что вы собираетесь делать, но вы можете сделать следующее:

/*   background-image: linear-gradient(#134C13, #66AF66, lightgreen); */
  
  .breakout-holder {
  width: 100%;
  border: 1px solid black;
}

.heading {
  /* background-color: grey; */
  height: 40px;

  display: flex;
  align-items: flex-end;
}



.tab {
  font-weight: bold;
  background-color: lightgrey;
  color: black;
  height: 90%;
  width: auto;
  padding: 0 20px;
  text-align: center;
  display: flex;
  justify-content: center;
  align-items: center;
  border-top: 1px solid black;
  border-right: 1px solid black;
  border-left: 1px solid black;

  border-radius: 15px 15px 0 0;

  cursor: pointer;
}


.active {
  background-color: lightgreen !important;
  border-right: 5px solid black;
  border-bottom: 2px solid black;
  /* box-shadow: inset 0 20px 20px -20px #000000; */
  z-index: 5000;
}

.tab:not(:first-child) {
  margin-left: -5px;
}
<!DOCTYPE html>
<html lang = "en">
<head>
    <meta charset = "UTF-8">
    <meta name = "viewport" content = "width=device-width, initial-scale=1.0">
    <link rel = "stylesheet" href = "https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
    <link rel = "stylesheet" href = "breakoutStyle.css">
    <title>Breakout room form</title>
</head>
<body>
    <div class = "breakout-holder">
        <div class = "heading">
            <div class = "tab active">
                Day 1
            </div>
            <div class = "tab">
                Day 2
            </div>
            <div class = "tab" style = "z-index: -10">
                +
            </div>
        </div>
        <div class = "body"></div>
    </div>
</body>
<script src = "app.js"></script>
</html>