10 年前,我用 C++ 编写了一个 GUI 布局引擎,我很好奇它的功能如何在浏览器中得到最好的近似。
1.C++
在较旧的 GUI 库(如Microsoft Windows)中,小部件的位置和大小通常由四个数字给出:left、top、width和height。我的引擎不同之处在于这些数字中的每一个都加倍,因此您必须指定八个数字:相对左侧,绝对左侧;相对顶部,绝对顶部;相对宽度,绝对宽度;相对高度和绝对高度。相对值应以父窗口小部件的宽度或高度的百分比给出,绝对值应以像素为单位. 在顶级窗口的情况下,“父窗口小部件”是桌面。
例子:
a) 400 x 300 px 窗口,以屏幕为中心:
const int WINDOW_WIDTH = 400;
const int WINDOW_HEIGHT = 300;
CWindow mainWindow;
mainWindow.setPosition(0.5, -WINDOW_WIDTH / 2, 0.5, -WINDOW_HEIGHT / 2);
mainWindow.setSize(0.0, WINDOW_WIDTH, 0.0, WINDOW_HEIGHT);
b) 主窗口右侧边缘的 150 px 宽按钮容器面板:
const int PANEL_WIDTH = 150;
CPanel buttonPanel(mainWindow);
buttonPanel.setPosition(1.0, -PANEL_WIDTH, 0.0, 0);
buttonPanel.setSize(0.0, PANEL_WIDTH, 1.0, 0);
c) 容器面板顶部的三个按钮(新建、打开、保存)和底部的一个按钮(退出):
const int BUTTON_HEIGHT = 30;
CButton newButton(buttonPanel, "New");
newButton.setPosition(0.0, 0, 0.0, 0 * BUTTON_HEIGHT);
newButton.setSize(1.0, 0, 0.0, BUTTON_HEIGHT);
CButton openButton(buttonPanel, "Open");
openButton.setPosition(0.0, 0, 0.0, 1 * BUTTON_HEIGHT);
openButton.setSize(1.0, 0, 0.0, BUTTON_HEIGHT);
CButton saveButton(buttonPanel, "Save");
saveButton.setPosition(0.0, 0, 0.0, 2 * BUTTON_HEIGHT);
saveButton.setSize(1.0, 0, 0.0, BUTTON_HEIGHT);
CButton exitButton(buttonPanel, "Exit");
exitButton.setPosition(0.0, 0, 1.0, -1 * BUTTON_HEIGHT);
exitButton.setSize(1.0, 0, 0.0, BUTTON_HEIGHT);
当您不熟悉这种布局代码时,手动编写这样的布局代码可能会感觉很尴尬,但是一旦您掌握了它的窍门,就很容易了。
2. HTML、CSS、JavaScript
到目前为止,这是我能够一起破解的内容:
a) 主窗口、按钮面板和按钮的层次结构在 HTML 中给出:
<div id="mainWindow">
<div id="buttonPanel">
<div id="newButton" class="button"></div>
<div id="openButton" class="button"></div>
<div id="saveButton" class="button"></div>
<div id="exitButton" class="button"></div>
</div>
</div>
b) div 的位置在 CSS 中设置为绝对:
* {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
body { margin: 0; color: yellow; }
#mainWindow { position: absolute; background: red; }
#buttonPanel { position: absolute; background: green; }
.button { border: 1px solid cyan; }
#newButton { position: absolute; background: blue; }
#openButton { position: absolute; background: blue; }
#saveButton { position: absolute; background: blue; }
#exitButton { position: absolute; background: blue; }
c) 布局功能在 JavaScript 中使用 jQuery 实现:
function setPosition(widget, relLeft, absLeft, relTop, absTop) {
$(widget)
.css('left', relLeft * 100 + '%').css('left', '+=' + absLeft + 'px')
.css('top', relTop * 100 + '%').css('top', '+=' + absTop + 'px');
}
function setSize(widget, relWidth, absWidth, relHeight, absHeight) {
$(widget)
.css('width', relWidth * 100 + '%').css('width', '+=' + absWidth + 'px')
.css('height', relHeight * 100 + '%').css('height', '+=' + absHeight + 'px');
}
function setButtonText(button, text, height) {
$(button)
.text(text)
.css('text-align', 'center')
.css('vertical-align', 'middle')
.css('line-height', height + 'px');
}
window.onresize = function () {
var WINDOW_WIDTH = 400,
WINDOW_HEIGHT = 300,
PANEL_WIDTH = 150,
BUTTON_HEIGHT = 30;
setPosition('#mainWindow', 0.5, -WINDOW_WIDTH / 2, 0.5, -WINDOW_HEIGHT / 2);
setSize('#mainWindow', 0.0, WINDOW_WIDTH, 0.0, WINDOW_HEIGHT);
setPosition('#buttonPanel', 1.0, -PANEL_WIDTH, 0.0, 0);
setSize('#buttonPanel', 0.0, PANEL_WIDTH, 1.0, 0);
setButtonText('#newButton', "New", BUTTON_HEIGHT);
setPosition('#newButton', 0.0, 0, 0.0, 0 * BUTTON_HEIGHT);
setSize('#newButton', 1.0, 0, 0.0, BUTTON_HEIGHT);
setButtonText('#openButton', "Open", BUTTON_HEIGHT);
setPosition('#openButton', 0.0, 0, 0.0, 1 * BUTTON_HEIGHT);
setSize('#openButton', 1.0, 0, 0.0, BUTTON_HEIGHT);
setButtonText('#saveButton', "Save", BUTTON_HEIGHT);
setPosition('#saveButton', 0.0, 0, 0.0, 2 * BUTTON_HEIGHT);
setSize('#saveButton', 1.0, 0, 0.0, BUTTON_HEIGHT);
setButtonText('#exitButton', "Exit", BUTTON_HEIGHT);
setPosition('#exitButton', 0.0, 0, 1.0, -1 * BUTTON_HEIGHT);
setSize('#exitButton', 1.0, 0, 0.0, BUTTON_HEIGHT);
};
onresize();
请注意,JavaScript 代码与上面显示的 C++ 代码非常相似!
我的问题
这种基于 JavaScript 的布局是否可以用于构建“真正的”Web 应用程序,或者我应该使用 CSS 代替吗?由于我基本上是桌面应用程序开发人员,因此我需要专家网络开发人员的意见。谢谢!
=== 更新 ===
这是一个纯 HTML+CSS 的解决方案。我使用了@Christoph 建议的负边距技巧。我唯一的问题是相同的常量被复制到 CSS 中的很多地方。例如,九个地方使用了按钮高度(30px),这使得维护变得更加困难。