【发布时间】:2018-10-02 09:35:39
【问题描述】:
我正在尝试为我的页面上的响应式横幅添加一些字体,并找到并修改了一些我在网上找到的用于这些目的的代码。 这基本上有两个部分:
在尺寸合适的平板电脑、笔记本电脑和台式机(或外部)上 监视器,我将在顶部使用水平横幅 - 这很有效。
在较小的平板电脑和手机上,我想在 左侧 - 这不起作用。
========== HTML ==========
HTML 结构本质上是这样的(更改了一些字符串以保护无辜者;-)):
<body>
<section id="page">
<section id="header">
<div id="logo"><img src="./Images/site/logo.png" alt="record" height="195px" width="195px"/></div>
<div id="h_banner">
<img id="ban_img_left" src="./Images/site/lt.png"/>
<div id="banner_h">
<div class="banner_string flexFontH"><u>Mumble</u> <img src="./Images/site/And.png" height="200px"/> <u>Grumble</u></div>
</div>
<img id="ban_img_right" src="./Images/site/rb.png"/>
</div><!-- h_banner -->
<div id="v_banner">
<img id="ban_img_top" src="./Images/site/lt.png"/>
<div id="banner_v">
<div class="banner_string flexFontV">M<br/>u<br/>m<br/>b<br/>l<br/>e<br/>
<img src="./Images/site/And.png" height="80px"/>
<br/>G<br/>r<br/>u<br/>m<br/>b<br/>l<br/>e<br/></div>
</div>
<img id="ban_img_bottom" src="./Images/site/rb.png"/>
</div><!-- v_banner -->
</section><!-- header -->
...
<div id="TestFontSize" class="banner_string">WWWWWWWWWWWWWWWW</div>
========== CSS ==========
CSS 代码是基于网格的(省略了一些不相关的部分,例如 col:
#page {
display: grid;
grid-template-columns: 80px 120px auto 200px;
grid-template-rows: 200px auto 200px;
}
#header {
grid-column: 1/5; grid-row: 1/2;
display: grid;
grid-template-columns: 200px auto 200px;
grid-template-rows: 200px;
position: relative;
}
#logo {grid-column: 1/3; grid-row: 1/2; position: fixed;}
#banner_h {grid-column: 1/5; grid-row: 1/2;}
#h_banner {grid-column: 1/5;}
#ban_img_left {grid-column: 1/3; position: absolute; height: 200px; left: 10px;}
#ban_img_right{gird-column: 4/5; position: absolute; height: 200px; right: 10px;}
#banner_v {
grid-column: 1/2; grid-row: 1/4;
display: grid;
grid-template-columns: auto;
grid-template-rows: 80px auto 80px;
}
#v_banner {grid-row: 2/3; display: none;}
#ban_img_top {grid-row: 1/2; display: none; position: fixed; width: 80px; top: 10px;}
#ban_img_bottom {grid-row: 3/4; display: none; position: fixed; width: 80px; bottom: 10px;}
.banner_string {
position:absolute; height: 200px; width: 100%;
display: flex; justify-content: center; align-items: center;
/*font-family: HaarlemDecoDEMO; letter-spacing: 10px;*/
font-family: Jazz-let; letter-spacing: 5px;
color: #83AFE4;
}
@media only screen and (max-width: 1000px) { /* [small-ish] iPhones */
#page {grid-template-columns: 80px auto; grid-template-rows: auto;}
#header {grid-template-columns: auto; grid-template-rows: auto;}
#logo {display: none;}
#banner_h {display: none;}
#h_banner {display: none;}
#ban_img_left {display: none;}
#ban_img_right {display: none;}
#banner_v {display: grid; width: 80px; height: 100%; position: fixed;}
#v_banner {display: block;}
#ban_img_top {display: block;}
#ban_img_bottom {display: block;}
.banner_string {
display: inline; width: 80px; height: 100%; position: fixed; display: block;
transform: translate(25px, 0px);
}
}
========== JS ===========
Javascript 是在横幅中缩放字体的响应方面发挥作用的地方。我承认我使用的一些数字是通过反复试验得出的,以找到似乎有效的方法,因此请谨慎使用。
flexFont = function() {
var len = "Mumble & Grumble".length;
/* (1) horizontal banner */
var hBanner = $(".flexFontH");
var hBannerWidth = $(hBanner).width();
var hBannerHeight = $(hBanner).height();
if (hBannerHeight > 0) {
var fontSize = 2 * (hBannerWidth - (2 * hBannerHeight)) / len; /* Jazz-let */
if (fontSize > 154) { fontSize = 154; } /* max that fits within 200px height for Jazz-let */
$(hBanner).css("fontSize", fontSize+"px");
}
/* (2) vertical banner */
var vBanner = $(".flexFontV");
var vBannerWidth = $(vBanner).width();
var vBannerHeight = $(vBanner).height();
if (vBannerWidth > 0) {
var fontSize = 1.125 * (vBannerHeight - (2 * vBannerWidth)) / len;
var lineHeight = (fontSize - 5) + "px";
var test = document.getElementById("TestFontSize");
test.style.fontSize = fontSize+"px";
var stringWidth = (test.clientWidth + 1);
var paddingTop = ((vBannerHeight - stringWidth) / 2) + "px";
var h = (vBannerHeight - 160) + "px";
$(vBanner).css({"fontSize": fontSize+"px", "height": h, "padding-top": paddingTop, "line-height": lineHeight});
}
}
window.onload = function(event) {
flexFont();
}
window.onresize = function(event) {
flexFont();
}
========== 问题==========
当我在窗口足够宽以使用水平横幅时调整窗口大小时 - 一切都按我的意愿工作,横幅中的字体会随着窗口宽度的增加/减小而放大/缩小。
当我调整窗口大小时,它足够窄以使用垂直横幅 - 文本在第一次重绘时消失。如果我刷新它显示的页面,但是如果我调整窗口的大小(更窄,更高,更短)它会再次消失 - 显然问题是 $(vBanner).height() 变成'0',所以所有基于计算在那个值上也是'0'。
那是在我的笔记本电脑上尝试模拟屏幕尺寸的变化。在我的手机上,它仍然几乎是一样的:当我第一次渲染页面时,垂直横幅看起来不错,但是如果我将方向更改为横向/纵向 - 再次,文本消失了。
那么 - 任何人都可以弄清楚为什么会这样吗?而且 - 更重要的是,我可以做些什么来解决它?
【问题讨论】:
标签: javascript html css responsive-design