Javscript для динамической сборки HTML / SVG для мобильного представления - PullRequest
0 голосов
/ 31 марта 2020

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

// DRAW SVG MASK /////////////////////////////
var svg = document.querySelector("#svg__bg");
var tl = new gsap.timeline({ onUpdate: onUpdate });
var pt = svg.createSVGPoint();
var ratio = 0.5625;

tl.to("#masker", {duration: 2, attr: {r: 2400}, ease: "power2.in" });
tl.reversed(true);

function mouseHandler() {
    tl.reversed(!tl.reversed());
}

function getPoint(evt) {
    pt.x = evt.clientX;
    pt.y = evt.clientY;
    return pt.matrixTransform(svg.getScreenCTM().inverse());
}

function mouseMove(evt) {
    var newPoint = getPoint(evt);
    gsap.set("#dot", { cx: newPoint.x, cy: newPoint.y });
    gsap.to("#ring, #masker", {duration: 0.88, attr: { cx: newPoint.x,  cy: newPoint.y }, ease: "power2.out" });
}

function onUpdate() {
    var prog = (tl.progress() * 100);
}

function newSize() {
    var w = window.innerWidth;
    var h = window.innerHeight;
    if (w > h * (16 / 9)) {
        gsap.set("#svg__bg", { attr: { width: w, height: w * ratio } });
    } else {
        gsap.set("#svg__bg", {
            attr: {
                width: h / ratio,
                height: h
            }
        });
    }
    var data = svg.getBoundingClientRect();
    gsap.set("#svg__bg", {
        x: w / 2 - data.width / 2
    });
    gsap.set("#svg__bg", {
        y: h / 2 - data.height / 2
    });
}

window.addEventListener("mousedown", mouseHandler);
window.addEventListener("mouseup", mouseHandler);
window.addEventListener("mousemove", mouseMove);

newSize();
window.addEventListener("resize", newSize);
@import url('https://fonts.googleapis.com/css?family=Montserrat:700&display=swap');

body {
	min-height: 100vh;
  background-color: #1F242D;
	cursor: none;
  overflow: hidden;
  font-family: 'Montserrat', sans-serif;
}
.intro-svg {
	position: relative;
  padding: 0;
  margin: 0;
	width: 100%;
  min-height: 100vh;
	height: calc(var(--vh, 1vh) * 100);
  overflow: hidden;
  z-index: 1;
}
.svg__container {
	height: 100%;
  width: 100%;
  position: relative;
  overflow: hidden;
}
.svg__image {
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	bottom: 0;
	cursor: none;
}
.text-svg {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  cursor: none;
  z-index:2;
}
.impact-text {
  font-size: 7em;
  line-height: 1.2;
  text-transform: uppercase;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.2.6/gsap.min.js"></script>
<div class="intro-svg">
          <div class="svg__container">
            <svg id="svg__bg" class="svg__image" xmlns="http://www.w3.org/2000/svg" x="0" y="0" width="1600" height="900" viewBox="0 0 1600 900">
              <defs>
                <radialGradient id="mask-gradient">
                  <stop offset="80%" stop-color="#fff"/><stop offset="100%" stop-color="#000" />
                </radialGradient>
                  <mask id="the-mask">
                    <circle id="masker" r="250" fill="url(#mask-gradient)" cx="800" cy="450">
                    </circle>
                  </mask>
                  <mask id="mask-text" width="100" height="100" x="0" y="0">
                    <text id="masker" class="impact-text row-1" fill="none" stroke="#fff" stroke-width="3" x="10.1%" y="42%">A</text>
                    <text id="masker" class="impact-text row-2" fill="white" x="10%" y="55%">Digital</text>
                    <text id="masker" class="impact-text row-3" fill="white" x="10%" y="68%">Designer</text>
                  </mask>
              </defs>
                <image id="lines" xlink:href="https://i.imgur.com/1TQRj56.jpg" x="0" y="0" width="1600" height="900" />
                <g id="mask-reveal" mask="url(#the-mask)">
                  <image id="regular" xlink:href="https://i.imgur.com/7VtEKv3.jpg" x="0" y="0" width="1600" height="900" />
                </g>
                <g mask="url(#mask-text)">
                  <image id="text-before" xlink:href="https://i.imgur.com/7VtEKv3.jpg" x="0" y="0" width="1600" height="900" />
                </g>
                <circle id="ring" r="20" fill="none" stroke="#D74A53" stroke-width="2" cx="800" cy="450" />
                <circle id="dot" r="4" fill="#D74A53" cx="800" cy="450"/>
            </svg>

          </div>
        </div>

1 Ответ

0 голосов
/ 31 марта 2020

просто добавьте

#svg__bg {
  width: 100%;
  height:auto;
} 

и замените их медиазапросом

не забудьте изменить

 <svg id="svg__bg" class="svg__image" xmlns="http://www.w3.org/2000/svg" x="0" y="0" viewBox="0 0 1600 900"> 

без width="1600" height="900"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...