Как масштабировать шрифт по ширине родительских контейнеров - PullRequest
0 голосов
/ 09 мая 2020

Я использую веб-сайт под названием streamlabs.com, который представляет собой универсальный инструмент для прямых трансляций на Twitch, YouTube и Mixer. Я сделал наложение Photoshop с тремя значками платформы для потоковой передачи в реальном времени, и они расположены на одинаковом расстоянии друг от друга при разрешении 2K (2560x1440 пикселей). Затем я использую это с программным обеспечением Open Broadcast Software, также известным как OBS, для потоковой передачи этих платформ. Streamlabs позволяет встраивать веб-страницу прямо в программное обеспечение и отображать ее. Я установил размер веб-страницы 2560 x 1440 пикселей, как указано выше; того же размера, что и моя установка OBS, и это позволит мне идеально выровнять все пиксель за пикселем.

По сути, я хочу разместить количество просмотров рядом с каждым из элементов.

Иерархия выглядит вот так в сжатой форме: -

Parent container
    Child container
        Icon
        View count text
platform_container
    twitch_container
        fab fa-twitch platform-icon
        twitch-count

Вот фактический код, взятый из моего Firefox Developer Tool

До сих пор я уже работал чтобы удалить значки с помощью

#platform_container #twitch_container .fab.fa-twitch.platform-icon {
  display: none !important;
}

Затем я использовал относительное положение, чтобы переместить каждый дочерний контейнер от родительского div platform_container, размер которого увеличился до 2560 x 1440, например

#platform_container #twitch_container {
  position: relative;
  left: 680px !important;
}

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

Вот как это выглядит на скриншоте ниже. Зазор между всеми красными стрелками должен быть равным, но, как вы можете видеть, чем больше символов добавляется в контейнер Twitch в этом примере, тем больше увеличивается. Я хочу, чтобы текст уменьшился в размерах до определенной степени, не влияя на ширину.

У меня есть кое-какие знания о CSS, и я установил, попытался установить max-width на twitch_container и контейнер подсчета подергиваний, а затем установил размер шрифта до 60vmin и 60%, а счетчик движений полностью игнорирует его родительский div, и размер просто исчезает с экрана, потому что он слишком большой.

Есть идеи?

ОБНОВЛЕНИЕ 1

<html>
    <head>
        <title>Viewer Count Widget</title>
                <link href="https://fonts.googleapis.com/css?family=Open+Sans" rel="stylesheet" type="text/css">
        <link href="//cdnjs.cloudflare.com/ajax/libs/animate.css/3.5.2/animate.min.css" rel="stylesheet">
        <script type="text/javascript" src="https://ff.kis.v2.scr.kaspersky-labs.com/FD126C42-EBFA-4E12-B309-BB3FDD723AC1/main.js?attr=QxoJqggwpIFoYwuEU6jAPg8vfi5xoaqgIlShnnH8Mh6ZzTBWezbNYVjEqi9iFbI6ZSl4Lrvm2QVmeWLI20SxNavAi9N9YykjkJe0utSTYRlUVQV_MQ1ZwrgwxGiANY4J" charset="UTF-8"></script><script src="https://cdn.polyfill.io/v2/polyfill.min.js?unknown=polyfill&features=es6|gated|always"></script>
        <script src="/mixed/assets/vendor/js/manifest.js?id=01c8731923a46c30aaed"></script>
        <script src="/mixed/assets/vendor/js/vendor.js?id=9e7e3700e75d5ed3493a"></script>
        <script src="/mixed/assets/external/js/external.js?id=6aae1514e74721024ba5"></script>
        <style id="theme"></style>

        <script>
            //function stubs for xsplit beta
            window.SetVolume           = function() {};
            window.OnSceneLoad         = function() {};
            window.setBackGroundColor  = function() {};
            window.GetPlayState        = function() {};
            window.UpdateLocalProperty = function() {};
            window.SetEvent            = function() {};
        </script>

    </head>

    <body style="margin:0px">

    <link href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css" rel="stylesheet">

    <iframe
        sandbox="allow-scripts"
        frameborder="0"
        style="width:100%;height:100%;"
        seamless="true"
        src="/widgets/frame/viewercount/custom"
        id="sl_frame"></iframe>

    <div id="custom_html">
    <!-- all platforms will be added to this container -->
    <div id="platform_container">
    </div>

    <!-- platform item -->
    <script type="text/template" id="platform_item">
      <span style="font: {font_weight} {font_size} '{font}'; margin:20px" id="{platform}_container">
        <i class="fab fa-{platform} platform-icon" style="color:{platform_color};"></i>
        <img class="platform-img" width="{font_size}" height="{font_size}">
        <span style="color:{font_color}" class="{platform}-count"></span>
      </span>
    </script>
  </div>

  <style id="custom_css">
  </style>

    <style>
        #sl_frame {
            position: absolute;
            width: 100%;
            height: 100%;
            top: 0;
        }
    </style>

    <input type="hidden" id="simulate" value="" />
    <script src="/mixed/assets/widgets/js/viewercount.js?id=baf2989d9a92071b21d6"></script>


        <input type="hidden" id="token" value="BDFF52B12D5C0F0452E5" />
                <input type="hidden" id="profile" value="" />

        <script src="https://ajax.googleapis.com/ajax/libs/webfont/1.5.3/webfont.js"></script>

        <!-- include Google analytics -->
        <script>
            (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
                    (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
                m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
            })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

            ga('create', 'UA-52139786-2', 'auto');
            ga('send', 'pageview');
        </script>

        <!-- sentry -->

    </body>
</html>

ОБНОВЛЕНИЕ 2

Я все еще не могу заставить его работать. Это строки кода на трех вкладках панели управления Streamlabs; HTML, CSS и JS. К сожалению, я не могу поделиться URL-адресом, поскольку он содержит конфиденциальную информацию.

HTML

<!-- all platforms will be added to this container -->
<div id="platform_container">
</div>

<!-- platform item -->
<script type="text/template" id="platform_item">
  <span style="font: {font_weight} {font_size} {font}" id="{platform}_container">
    <i class="fa fa-{platform} platform-icon" style="color:{platform_color};"></i>
    <img class="platform-img" width="{font_size}" height="{font_size}">
    <span style="color:{font_color}" class="{platform}-count"></span>
  </span>
</script>

CSS

#platform_container {
    display: flex;
    border: 2px solid orange;
}

 /* Twitch */
#platform_container #twitch_container {
    border: 3px dashed blue;
    max-width: 100px;
    text-align: center;
    margin-right: 20px;
}
#platform_container #twitch_container .twitch-count {
    margin: 0;
    line-height: 1;
    max-width: 100px;
    border: solid blue 2px;
    font-size: 50px;
}
#platform_container #twitch_container .platform-icon {
  display: none;
}
#platform_container #twitch_container .twitch-count::after {
    content: "123456";
}

JS

// Please use event listeners to run functions.
document.addEventListener('onLoad', function(obj) {
    // obj will be empty for viewer count widget
    // this will fire only once when the widget loads
});

document.addEventListener('onEventReceived', function(obj) {
    // obj will contain information about the event

});

const textElems = document.querySelectorAll("#platform_container > span[id$="_container"] > span[class$="-count"]");
const containerElem = document.querySelector("#twitch_container");
const fs = window.getComputedStyle(textElems[0]).fontSize;
const mw = window.getComputedStyle(containerElem).maxWidth;
const maxFontSize = parseFloat(fs);
const maxWidth = parseFloat(mw);

for (i = 0; i < textElems.length; i++) {
  const elem = textElems[i];
  if (elem.scrollWidth > maxWidth) {
    elem.style.fontSize = (maxFontSize / elem.scrollWidth) * maxWidth + "px";
  }
}

Снимок экрана, показывающий влияние текущего кода enter image description here

1 Ответ

0 голосов
/ 11 мая 2020

Насколько я понимаю, вы пытаетесь изменить размер шрифта в зависимости от ширины родительского контейнера и текстового содержимого.

В этом сообщении есть множество решений.

Вот пример изменения размера шрифта с использованием JavaScript и свойства максимальной ширины ваших контейнеров.

HTML

<div id="container">
  <div class="box">
    <h3 class="count">012345</h3>
  </div>
  <div class="box">
    <h3 class="count">0</h3>
  </div>
  <div class="box">
    <h3 class="count">0</h3>
  </div>
</div>

CSS

#container {
  display: flex;
}

.box {
  border: 1px dashed black;
  max-width: 250px;
  text-align: center;
  margin-right: 20px;
}

.count {
  margin: 0;
  font-size: 150px;
  line-height: 1;
}

Убедитесь, что вы установили свойство max-width для каждого из ваших дочерних элементов. Также установите начальное font-size для элементов количества просмотров.

JS

const textElems = document.querySelectorAll(".count");
const containerElem = document.querySelector(".box");
const fs = window.getComputedStyle(textElems[0]).fontSize;
const mw = window.getComputedStyle(containerElem).maxWidth;
const maxFontSize = parseFloat(fs);
const maxWidth = parseFloat(mw);

for (i = 0; i < textElems.length; i++) {
  const elem = textElems[i];
  if (elem.scrollWidth > maxWidth) {
    elem.style.fontSize = (maxFontSize / elem.scrollWidth) * maxWidth + "px";
  }
}

Глядя на снимок экрана с инструментами разработчика, ваш запрос textElems будет "#platform_container > span > span" или "#platform_container > span[id$="_container"] > span[class$="-count"]".

Все зависит от вашей HTML разметки.

ОБНОВЛЕНИЕ : Опечатка, нужно заменить двойные кавычки одинарными

"#platform_container > span[id$='_container'] > span[class$='-count']"

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