Разрыв, созданный полосой прокрутки в сайтах прокрутки параллакса CSS

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

Виновником, насколько я могу судить, является полоса прокрутки. Эта полоса прокрутки должна быть там (внутри родительского div параллакса), но она создает разницу между размером родительского контейнера (в котором отображается трехмерное пространство) и размером дочерних элементов параллакса контейнеров, что оставляет место для этот разрыв. Я вижу это в последних версиях Chrome, Firefox и Safari (хотя я мог поклясться, что не видел его там даже год назад).

Это может быть исправлено путем применения width: 100vw Правило для каждой группы или слоя параллакса. Но в то время как это очищает разрыв, это помещает элементы вне выравнивания с центром представления по умолчанию (и так с любыми элементами, которые также не имеют 100vw Правило применяется к ним). Я также хотел бы, чтобы решение, которое в максимально возможной степени придерживалось принципа "чистого CSS".

HTML взят из примера Кейта Кларка:

<div class="parallax">
  <div class="parallax__group">
    <div class="parallax__layer parallax__layer--base">
      <div>Base Layer</div>
    </div>
    <div class="parallax__layer parallax__layer--back">
      <div>Background Layer</div>
    </div>
  </div>
</div>

CSS:

.parallax { // parent, page-level container
    height: 500px;
    height: 100vh;
    overflow-x: hidden;
    overflow-y: auto;
    -webkit-perspective: 300px;
    perspective: 300px;
    -webkit-perspective-origin-x: 100%;
    perspective-origin-x: 100%;
}

.parallax__group {
    position: relative;
    height: 500px;
    height: 100vh;
    -webkit-transform-style: preserve-3d;
    transform-style: preserve-3d;
}

.parallax__layer {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    -webkit-transform-origin-x: 100%;
    transform-origin-x: 100%;
}

.parallax__layer--base {
    -webkit-transform: translateZ(0);
    transform: translateZ(0);
    z-index: 4;
}

.parallax__layer--back {
    -webkit-transform: translateZ(-300px) scale(2);
    transform: translateZ(-300px) scale(2);
    z-index: 3;
}

1 ответ

Я пришел с некоторыми решениями и поместил их на пример веб-сайта здесь: https://dawaltconley.github.io/parallax-gap-fix/.

Кажется, что проблема возникает только с определенными системными полосами прокрутки Mac, которые появляются, когда пользователь подключает USB-мышь (как я их нашел) или меняет Show scroll bars в Always в их настройках. Эта полоса прокрутки, в отличие от прозрачного трекпада, изменяет внутреннюю ширину элемента страницы параллакса, но не общий размер, в котором отображается трехмерное пространство для элементов параллакса.

Изменение perspective-origin а также transform-origin свойства к left перераспределяет элементы параллакса без изменения размера. Это было бы идеальным решением, за исключением того, что Safari, похоже, рассчитывает трехмерное пространство не так, как большинство современных браузеров, и ему нужно, чтобы эти свойства были установлены на center выровнять все правильно.

Лучшее решение, которое я нашел для всех браузеров, - это добавить следующие правила в .parallax__group элемент:

.parallax__group {
    margin-left: calc(100% - 100vw);
    margin-right: calc(100% - 100vw);
    padding-left: calc(100vw - 100%);
    padding-right: calc(100vw - 100%);
}

Разница между 100vw а также 100%от любого ближайшего ребенка .parallax элемент, ширина полосы прокрутки. Установка отрицательного правого поля для этой ширины расширяет элементы параллакса до той же ширины, что и страница, удаляя зазор по краю экрана. Установка этого значения в левое поле растягивает элементы немного больше, чем необходимо, но это необходимо для выравнивания центра трехмерного пространства с центром остальной части страницы.

Должна быть возможность компенсировать этот раздув, применяя аналогичные правила к .parallax__layout класс, но несоответствия Safari затрудняют это, так как не раздутый элемент должен быть идеально выровнен, чтобы избежать пробелов в макете.

Кстати, это решение имеет то преимущество, что ничего не делает, когда проблемные полосы прокрутки отсутствуют. В этом случае нет никакой разницы между 100vw а также 100%Таким образом, компьютерный стиль идентичен стилю Киет Кларк.

Другие вопросы по тегам