CSS Положение абсолютного сбоя при использовании единиц VH и VW - PullRequest
1 голос
/ 02 апреля 2020

Я использую следующий код, чтобы замаскировать фоновое видео в тексте SVG с другим текстом вокруг. Моя проблема в том, что белые тексты не сохраняют свою позицию при изменении размера, хотя я работаю с vh и vw единицами. И белый заголовок, и белое описание не имеют одинакового расстояния до МАСКИ.

body {
  font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
.font-serif	font-family: Georgia, Cambria, "Times New Roman", Times, serif;
.font-mono	font-family: Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
  margin: 0;
  padding: 0;
}

.container {
  position: relative;
  height: 100vh;
  width: 100%;
  background: #000;
}

.headline-wrapper {
  position: absolute;
  top: 2vh;
  left: 1.4%;
}

.headline {
  margin: 0;
  font-size: 8vw;
  font-weight: 600;
  color: #fff;
  text-transform: uppercase;
}

.description-wrapper {
  position: absolute;
  top: 70vh;
  left: 1.4%;
}

.description {
  margin: 0;
  font-size: 4vw;
  font-weight: 400;
  color: #fff;
}

.video-wrapper {
  position: relative;
  overflow: hidden;
  clip-path: url(#mask);
}

.video {
  width: 100%;
  height: 100vh;
  object-fit: cover; 
}

.mask-text {
  text-anchor: start;
  font-size: 16vw;
  font-weight: bold;
}
<section>
  <div class="container">
    <div class="headline-wrapper">
      <h3 class="headline">Headline</h3>
    </div>
    <div class="description-wrapper">
      <p class="description">Description</p>
    </div>
    <div class="video-wrapper">
      <video class="video" src="http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4" type="video/mp4" muted loop autoplay="true"></video>
      <svg><clipPath id="mask"><text class="mask-text" x="2%" y="55vh">MASK</text></clipPath></svg>
    </div>
  </div>
</section>

Моя цель - держать белые тексты на своих местах, всегда на одинаковом расстоянии от текста МАСКИ, чтобы он был отзывчивым. Как этого достичь? Есть ли единственное css решение для этого?

1 Ответ

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

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

Возможно, вам придется настроить viewBox SVG при изменении font-family

body {
  font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
  margin: 0;
  padding: 0;
}

.container {
  position: relative;
  height: 100vh;
  background: #000;
  color: #fff;
}

.headline-wrapper {
  position: absolute;
  top: 50%;
  transform:translateY(-180%);
  left: 1.4%;
}

.headline {
  margin: 0;
  font-size: 8vw;
  font-weight: 600;
  text-transform: uppercase;
}

.description-wrapper {
  position: absolute;
  top: 50%;
  transform:translateY(120%);
  left: 1.4%;
}

.description {
  margin: 0;
  font-size: 4vw;
  font-weight: 400;
}

.video-wrapper {
  height: 100%;
   -webkit-mask:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 -10 70 12"><text font-family="monospace">MASK</text></svg>') center/contain no-repeat;
           mask:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 -10 70 12"><text font-family="monospace">MASK</text></svg>') center/contain no-repeat;

}

.video {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display:block;
}

.mask-text {
  text-anchor: start;
  font-size: 16vw;
  font-weight: bold;
}
<section>
  <div class="container">
    <div class="headline-wrapper">
      <h3 class="headline">Headline</h3>
    </div>
    <div class="description-wrapper">
      <p class="description">Description</p>
    </div>
    <div class="video-wrapper">
      <video class="video" src="http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4" type="video/mp4" muted loop autoplay="true"></video>
    </div>
  </div>
</section>
...