所以我的页面中的容器中有一个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
感谢您提供任何帮助或建议,并提前感谢
答案 0 :(得分:1)
我决定再做一次 - 尤其是因为这是一个引人入胜的问题。
我想我已经破解了它。
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;
备注:强>
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网格。
现在我们需要做的就是解决问题:
font-size
的大小仅仅取决于视口的宽度;和font-size
的大小仅为基于高度的
视口; 较小者可以是font-size
应用于数字。
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;
答案 2 :(得分:0)
您可以缩放每个元素,然后根据新的比例定位其左侧值。
https://jsfiddle.net/f6Lfe8hv/2/
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;