«взаимосвязанные» изображения с HTML и CSS - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь создать эффект раздвижной двери, который открывает главную страницу сайта, но у меня возникают некоторые проблемы с z-индексом используемых изображений. По существу, z-индекс изображений должен быть выше, чем у их родительских контейнеров, чтобы предотвратить обрезание части изображений. Это сложно объяснить, поэтому, пожалуйста, взгляните на этот кодовый блок , который я собрал для демонстрации. Проблема будет очевидна, но просто изображения должны блокироваться, но часть одного покрывается родительским z-индексом другого. HTML и CSS довольно просты, это просто вопрос получения z-индексов изображений выше, чем у их родительских контейнеров, что не работает, и я не уверен почему.

Редактировать: я должен четко указать, что проблема в том, что левая часть нижнего изображения в символе обрезается контейнером левого изображения. Это можно решить, сделав z-индексы изображений выше, чем у контейнеров, но я не уверен, почему это не работает.

.curtain {
  width: 100%;
  height: 100vh;
  overflow: hidden;
}

.right-panel {
  width: 50%;
  height: 100vh;
  float: left;
  z-index: 2;
  position: relative;
  background-color: #333;
  transition: transform 5s;
}

.left-panel {
  width: 50%;
  height: 100vh;
  float: left;
  z-index: 3;
  position: relative;
  background-color: #333;
  transition: transform 5s;
}

.content {
  position: absolute;
  width: 100%;
  top: 50%;
  background: 333;
  z-index: 1;
  text-align: center;
}

.left-img {
  right: 0%;
  margin-right: -12.5%;
  width: 25%;
  height: 50%;
  z-index: 2;
  position: absolute;
}

.right-img {
  float: left;
  width: 25%;
  height: 50%;
  margin-left: -12.5%;
  position: absolute;
}

.curtain:hover .left-panel {
  transform: translateX(-130%);
}

.curtain:hover .right-panel {
  transform: translateX(130%);
}
<div class="curtain">
  <div class="left-panel">
    <img src="https://i.ibb.co/30TCGB3/logo-top.png" class="left-img">
  </div>
  <div class="right-panel">
    <img src="https://i.ibb.co/GFCwpF0/logo-bottom.png" class="right-img">
  </div>
  <div class="content">
    <p>main site stuff</p>
  </div>
</div>

Ответы [ 2 ]

2 голосов
/ 01 апреля 2020

Ваш .left-panel имеет более высокий z-индекс, поэтому он перекрывает изображение внутри .right-panel. И z-index создает новый контекст стека , который предотвращает взаимную блокировку изображений. По сути, z-индекс относится к контексту стека, а не к абсолютному числу.

Я бы порекомендовал вам структурировать z-индексы таким образом, чтобы фоны панели имели одинаковый z-индекс, а изображения имели более высокий один (по сути, создавая 3 слоя: контент, фон обложки, изображения обложек).

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

body {
  overflow: hidden;
}

.curtain {
  width: 100vw;
  height: 100vh;
  overflow: hidden;
  z-index: 0;
  
  /* CSS variables to prevent duplication below */
  --piece-width: 100px;
}

.curtain .content {
  /* I used flex since I'm more comfortable with that, but you can use floats if you prefer. */
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  height: 100%;
  z-index: 0;
}

.curtain-panel {
  display: flex;
  align-items: center;
  position: absolute;
  width: 50%;
  height: 100%;
  
  transition: left, right;
  transition-duration: 3s;
}

.curtain-panel.left {
  left: 0;
  justify-content: end;
}

.curtain-panel.right {
  right: 0;
}

.curtain-panel::before {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 1;
  
  background-color: #333;
}

.curtain-piece {
  width: var(--piece-width);
  height: auto;
  z-index: 2;
  margin: calc(var(--piece-width) / -2);
}

.curtain:hover .left {
  left: -100%;
}

.curtain:hover .right {
  right: -100%;
}
<div class="curtain">
  <div class="curtain-panel left">
    <img src="https://i.ibb.co/30TCGB3/logo-top.png" class="curtain-piece">
  </div>
  <div class="curtain-panel right">
    <img src="https://i.ibb.co/GFCwpF0/logo-bottom.png" class="curtain-piece">
  </div>
  <div class="content">
    <p>main site stuff</p>
  </div>
</div>

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

0 голосов
/ 01 апреля 2020

При таком подходе ваши поплавки сохраняются, но при этом добавляется дополнительная разметка для хранения элементов изображения, которые будут размещаться над фоновыми фрагментами.

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

.curtain {
  width: 100%;
  height: 100vh;
  overflow: hidden;
  z-index: 1;
  position: relative;
}

.panel {
  width: 50%;
  height: 100vh;
  z-index: 2;
  position: absolute;
  transition: transform 5s;
}

.left-panel,
.left-image-panel {
  left: 0;
}

.right-panel,
.right-image-panel {
  right: 0;
}

.left-panel,
.right-panel {
  background-color: #333;
}

.left-image-panel,
.right-image-panel {
  background-color: transparent;
  z-index: 10;
}

.content {
  position: absolute;
  width: 100%;
  top: 50%;
  background: 333;
  z-index: 1;
  text-align: center;
}

.left-img {
  right: 0%;
  margin-right: -12.5%;
  width: 25%;
  height: 50%;
  z-index: 2;
  position: absolute;
}

.right-img {
  float: left;
  width: 25%;
  height: 50%;
  margin-left: -12.5%;
  position: absolute;
}

.curtain:hover .left-image-panel,
.curtain:hover .left-panel {
  transform: translateX(-130%);
}

.curtain:hover .right-image-panel,
.curtain:hover .right-panel {
  transform: translateX(130%);
}
<div class="curtain">
  <div class="left-image-panel panel">
    <img src="https://i.ibb.co/30TCGB3/logo-top.png" class="left-img">
  </div>
  <div class="right-image-panel panel">
    <img src="https://i.ibb.co/GFCwpF0/logo-bottom.png" class="right-img">
  </div>
  <div class="left-panel panel">
  </div>
  <div class="right-panel panel">
  </div>
  <div class="content">
    <p>main site stuff</p>
  </div>
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...