调整容器内的字体文本(在多个div内)以完全适合

时间:2016-11-15 10:54:32

标签: javascript jquery html css

所以我的页面中的容器中有一个div矩阵,每个div显示一个' 1'或者是' 0'。

如果我将容器设置为100%的宽度和高度以适合我的页面底部,我希望能够         缩放容器div中的所有1和0( 0和1的数量将是静态数字,为了这个问题,让我们一起使用100 )无论浏览器的大小调整到什么大小,总是能完全适合容器,所以它适合宽度和         容器的高度完全没有任何尾随的空白或元素离开页面或触发滚动条。

  

目标是确保字体调整大小以适应容器,无论屏幕大小如何(高度和宽度)。

我已经看到有关堆栈溢出的多个类似问题,例如:JavaScript Scale Text to Fit in Fixed Div,但它们似乎都缩放了某一行文本,而不是来自我的组合div的文本。 有没有办法在JavaScript中做到这一点?

  

如果您在This Question中看到了要求的内容,那就是   正是我想要的。 Q的不同之处在于他使用了一些   1 div内的文字,而不是多个,以适合他的容器。

这是我的HTML:

<div id="binaryMatrix" style="width: 100%; height: 100%;">
    <div>0</div>
    <div>1</div>
    <div>0</div>
    <div>1</div>
    <div>0</div>
    <div>1</div>
    <div>0</div>
    <div>1</div>
    ...up to 100
 </div>

这是我的CSS:

#binaryMatrix div {
    float: left;
}

请参阅小提琴Fiddle

此项目也在GitHub上: GitHub - danjonescidtrix/binary-matrix

感谢您提供任何帮助或建议,并提前感谢

3 个答案:

答案 0 :(得分:1)

我决定再做一次 - 尤其是因为这是一个引人入胜的问题。

我想我已经破解了它。

&#13;
&#13;
var binaryMatrix = document.getElementById('binaryMatrix');
var binaryMatrixDivs = binaryMatrix.getElementsByTagName('div');

var largestNumberOfRows = 12;

for (var i = largestNumberOfRows; i > 0; i--) {
    if (binaryMatrixDivs.length % i === 0) {
        var numberOfRows = i;
        break;
    }
}

function changeDivWidth() {
    for (var i = 0; i < binaryMatrixDivs.length; i++) {
    var divWidth = (100 / (binaryMatrixDivs.length / numberOfRows));
    var divHeight = (100 / numberOfRows);

    binaryMatrixDivs[i].style.width = divWidth + 'vw';
    binaryMatrixDivs[i].style.height = divHeight + 'vh';
    binaryMatrixDivs[i].style.lineHeight = divHeight + 'vh';
    }
}

window.addEventListener('load',changeDivWidth,false);
&#13;
body {
margin: 0;
padding: 0;
}

#binaryMatrix {
width: 100vw;
height: 100vh;
}

#binaryMatrix div {
display: inline-block;
float: left;
width: 0;
height: 0;
line-height: 20vh;
text-align: center;
}

#binaryMatrix div:nth-of-type(odd) {
background-color: rgb(191,191,191);
}

#binaryMatrix div:nth-of-type(even) {
background-color: rgb(127,127,127);
}
&#13;
<div id="binaryMatrix">
<div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div>
</div>
&#13;
&#13;
&#13;

备注:

1)您可以通过更改numberOfRows的值来确定行数。如果numberOfRows设置为5,则总是为5行 - 无论窗口有多短或高或宽或窄。

2)显然,您希望numberOfRows成为您拥有的div数量的一个因素。因此,如果您有100个div或90个div,则5行是好的,但如果您有96个div,则您希望numberOfRows为4或6或12或其他因子为96。

<强>改进:

上述两个注释是必要的,因为在脚本的第一个版本中,您手动声明行数。在脚本的第二个版本(上面)中,如果您愿意,您仍然可以手动声明行数,但是(稍微省力)您可以简单地手动声明您希望看到的最大行数(例如,不超过14行) )并且脚本将从14 开始倒计时,直到找到一个因子 - 它所涉及的第一个因素将是numberOfRows

这样您就可以更改div的数量(手动或动态),而无需每次都重置numberOfRows

答案 1 :(得分:1)

右。第三次尝试(我真的这次破解了。)

位数是静态的。我们称之为100位数。

数字比它们宽,所以我们需要一个高而窄的网格divs。 10x10并不好。让我们设置一个20x5网格。

现在我们需要做的就是解决问题:

  1. 数字font-size的大小仅仅取决于视口的宽度;和
  2. 数字font-size的大小仅为基于高度的 视口;
  3. 较小者可以是font-size应用于数字。

    &#13;
    &#13;
    var binaryMatrix = document.getElementById('binaryMatrix');
    var binaryMatrixDivs = binaryMatrix.getElementsByTagName('div');
    
    function applyNewFontSize() {
    
        var newVerticalFontSize = (window.innerHeight / 5.5);
        var newHorizontalFontSize = (window.innerWidth / 20.5);
        var newFontSize = (newVerticalFontSize > newHorizontalFontSize ? newHorizontalFontSize : newVerticalFontSize);
    
        for (var i = 0; i < binaryMatrixDivs.length; i++) {
        binaryMatrixDivs[i].style.fontSize = newFontSize + 'px';
        binaryMatrixDivs[i].style.lineHeight = newFontSize + 'px';
        }
    
    }
    
    window.addEventListener('resize',applyNewFontSize,false);
    window.addEventListener('load',applyNewFontSize,false);
    &#13;
    body {
    margin: 0;
    padding: 0;
    }
    
    #binaryMatrix {
    width: 100vw;
    height: 100vh;
    }
    
    #binaryMatrix div {
    display: inline-block;
    float: left;
    width: 5vw;
    height: 20vh;
    text-align: center;
    color: rgb(163,163,163);
    }
    &#13;
    <div id="binaryMatrix">
    <div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div><div>0</div><div>1</div>
    </div>
    &#13;
    &#13;
    &#13;  

答案 2 :(得分:0)

您可以缩放每个元素,然后根据新的比例定位其左侧值。

https://jsfiddle.net/f6Lfe8hv/2/

&#13;
&#13;
var total_width = 0;
var total_left = 0;
var $divs = $('#binaryMatrix>div');
var $binaryMatrix = $('#binaryMatrix');
var scale = 1;

$divs.each(function() {
  total_width += $(this).width();
});

function full_width() {

  scale = $binaryMatrix.width() / total_width;

  $divs.css('transform', 'scale(' + scale + ')');

  $divs.each(function() {

    $(this).css('left', total_left);

    total_left += $(this).width() * 1;

  });

  total_left = 0;
}

full_width();

$(window).resize(function() {

  full_width();

})
&#13;
#binaryMatrix div {
  position: absolute;
  transform-origin: left;
}

#binaryMatrix {
  top:0;
  left:0;
  background: pink;
  position: absolute;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<div id="binaryMatrix" style="width: 100%; height: 100%;">

  <div>some_test_value</div>
  <div>1</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>0</div>
  <div>1</div>
  <div>0</div>
  <div>1</div>
  <div>another_test_value</div>

</div>
&#13;
&#13;
&#13;