Подтвердить что ты не робот

Является ли `overflow: hidden 'изменением положения абсолютных детей?

У меня есть картинная галерея скользящих изображений в формате только с css. См. http://codepen.io/anon/pen/xmhzE?editors=110 для примера или прилагаемого кода.

Он отлично работает, пока #images -div не имеет overflow: hidden. Когда переполнение установлено в скрытое, абсолютное позиционирование отдельных изображений больше не работает. Когда я использую отрицательные значения для left -property изображений, он также работает с скрытым переполнением.

Изменяет ли стиль overflow:hidden способ отображения абсолютных детей?

У кого-нибудь есть решение этой проблемы?


Источники

index.html

<div id="images">
  <img id="image1" src="http://i.imgur.com/dL3io.jpg" />
  <img id="image2" src="http://i.imgur.com/qASVX.jpg" />
  <img id="image3" src="http://i.imgur.com/fLuHO.jpg" />
  <img id="image4" src="http://i.imgur.com/5Sd3Q.jpg" />
</div>
<div id="slider">
  <a href="#image1">1</a>
  <a href="#image2">2</a>
  <a href="#image3">3</a>
  <a href="#image4">4</a>
</div>

base.css:

body {
    text-align: center;
  }
#images {
  width: 400px;
  height: 250px;
  /*overflow: hidden; if this is set absolute positioning of images breaks*/
  position: relative;
  background-color: red;

  margin: 20px auto;
}
#images img {
  width: 400px;
  height: 250px;
  display: block;

  position: absolute;
  top: 0px;
  left: 400px;
  z-index: 1;
  opacity: 0;

  transition: all linear 500ms;
  -o-transition: all linear 500ms;
  -moz-transition: all linear 500ms;
  -webkit-transition: all linear 500ms;
}
#images img:target {
  top: 0px;
  left: 0px;
  z-index: 9;
  opacity: 1;
}
#slider a {
  text-decoration: none;
  background: #E3F1FA;
  border: 1px solid #C6E4F2;
  padding: 4px 6px;
  color: #222;
}
#slider a:hover {
  background: #C6E4F2;
}
4b9b3361

Ответ 1

Эта головоломка заставила меня идти. Я просто не мог этого оставить. Так что прошлым вечером я возился с ним, но не смог его исправить (пока еще нет:)).

Тестирование 1

Упрощая вещи, я удалил непрозрачность из элементов изображения и оставил только 1 изображение и одну ссылку. Сначала я установил изображение на 390px, чтобы я мог убедиться, что он находится в этом положении (вы можете видеть только немного слева от него).

http://codepen.io/anon/pen/tpCrc

Вывод:

Итак, что важно заметить, это тот факт, что изображение изначально есть там, где оно должно быть. Затем при нажатии кнопки 1 вы можете просто пропустить переход. Таким образом, браузер не меняет положение элемента из-за переполнения: скрытый (как говорится в заголовке этого сообщения). Это относится к позиции, упомянутой в CSS (в целевой части), но без перехода.

Тестирование 2

Тогда мне стало интересно, почему браузер будет действовать таким образом, и я думал, что, возможно, фокусировка элемента изображения имеет к этому какое-то отношение. Если вы думаете об этом: при нажатии одной из кнопок вы добавляете #target к URL-адресу страницы и браузера, затем пытается "прокручивать" этот элемент. Для этого этот элемент должен быть видимым.

Итак, я подумал: возможно, CSS не имеет к этому никакого отношения. Попробуйте: поэтому я полностью удалил: target-часть и переходы.

http://codepen.io/anon/pen/IvfBE

Вывод:

Ничего себе! Что мы видим там? При нажатии одной из кнопок изображение все еще скачет влево: 0!! Я думаю, что у нас там есть лидерство. Тем не менее, я не знал, как это исправить. Мне все еще кажется ошибкой браузера.

Исправление

Затем - после хорошей ночи сна я проснулся с новой новой идеей. Что делать, если мы на самом деле не нацеливаем элемент, который хотим перейти?

Итак, я добавил контейнер для каждого элемента изображения и цели, вместо этого.

<div id="images">
    <div id="img1container"><img id="image1" src="http://i.imgur.com/dL3io.jpg" /></div>
    <div id="img2container"><img id="image2" src="http://i.imgur.com/qASVX.jpg" /></div>
    <div id="img3container"><img id="image3" src="http://i.imgur.com/fLuHO.jpg" /></div>
    <div id="img4container"><img id="image4" src="http://i.imgur.com/5Sd3Q.jpg" /></div>
</div>
<div id="slider">
    <a href="#img1container">1</a>
    <a href="#img2container">2</a>
    <a href="#img3container">3</a>
    <a href="#img4container">4</a>
</div>

В CSS позиция изображения теперь должна быть заменена на "[parentElement]: target img".

body {
    text-align: center;
}
#images {
    width: 400px;
    height: 250px;
    overflow: hidden; /* this did break it in the past ;) */
    position: relative;
    background-color: red;

    margin: 20px auto;
}
#images img {
    width: 400px;
    height: 250px;
    display: block;

    position: absolute;
    top: 0px;
    left: 400px;
    z-index: 1;
    opacity: 0;

    transition: all linear 500ms;
    -o-transition: all linear 500ms;
    -moz-transition: all linear 500ms;
    -webkit-transition: all linear 500ms;
}
#images div:target img {
    top: 0px;
    left: 0px;
    z-index: 9;
    opacity: 1;
}
#slider a {
    text-decoration: none;
    background: #E3F1FA;
    border: 1px solid #C6E4F2;
    padding: 4px 6px;
    color: #222;
}
#slider a:hover {
    background: #C6E4F2;
}

И рабочий пример: http://codepen.io/anon/pen/lyzhi

Вывод:

Yay!! Действительно, не сосредотачиваясь на элементе, который вы хотите перевести, он не сломается. Итак, у вас есть исправление, но оно по-прежнему кажется браузером/машиной-ошибкой для меня. Поэтому я бы посоветовал вам создать bugreport где-нибудь (если у вас есть время).

BTW: Я тестировал это в Chrome и IE - как в последних версиях. Вы можете протестировать это в Firefox и, возможно, в некоторых других браузерах.