书接上回: 手把手从零开始教你用htmlayout/sciter写漂亮ui界面(一)
再次鸣谢下aardio软件对htmlayout的大力封装, 所以用起来就简单多了. 只需要考虑html和css的耦合部分
上次学到, 如何用htmlahyout来贴图, 还有一些csss!属性的使用
这次我们写一个完整的 UI界面皮肤管理界面.
参考主界面的html和css,稍作修改即可.如下:
<html>
<link href="skin.css" rel="stylesheet" type="text/css"/>
<body>
<div #header command="window-caption">
<div #space>更改外观</div>
<div #btn-close command="window-close"/>
</div>
</body>
</html>
body{
margin:0px;
background-image:url(img/001/skin.png);
background-repeat:expand stretch-left stretch-middle stretch-right;
background-position:280 2 2 680;
foreground-image:url(img/border.png);
foreground-repeat:expand stretch-left stretch-middle stretch-right;
foreground-position:5 5 5 5;
}
#header{
//background-color:red;
width:100%;
height:70px;
flow:horizontal;
behavior:windowCommand;
}
#space{
width:100%%;
height:20px;
font-weight:bold;
font-size:14px;
color:white;
padding:5 0 0 8;
}
#btn-close{
background-image:url(img/btn_close_normal.png);
width:39px;
height:19px;
}
#btn-close:hover{
background-image:url(img/btn_close_highlight.png);
}
#btn-close:active{
background-image:url(img/btn_close_down.png);
}
增加一个蒙版main:
<html>
<link href="skin.css" rel="stylesheet" type="text/css"/>
<body>
<div #header command="window-caption">
<div #space>更改外观</div>
<div #btn-close command="window-close"/>
</div>
<div #main>
</div>
</body>
</html>
修改这个蒙版的css属性
#main{
background-color:rgba(255,255,255,0.6);
margin:0 -5 -5 -5;
padding:0 5 5 5;
width:100%%;
height:100%%;
}
在main节点中增加两个区域, 一个用来显示皮肤框,, 一个用来作为底部按键
先来设置下皮肤显示区
我们增加mainarea节点和main-bottom节点
<html>
<link href="skin.css" rel="stylesheet" type="text/css"/>
<body>
<div #header command="window-caption">
<div #space>更改外观</div>
<div #btn-close command="window-close"/>
</div>
<div #main>
<div #mainarea>
</div>
<div #main-bottom>
</div>
</div>
</body>
</html>
定义一下css样式
#mainarea{
background-color:rgba(0,66,33,0.3);//随便写的,便于观察
margin:0 1 1 1;
width:100%%;
height:100%%;
}
#main-bottom{
background-color:rgba(88,88,88,0.3);//随便写的,便于观察
margin:0 5 0 5;
width:100%%;
height:35;
}
预设底部是35高的一个底部框, 上面剩下的都是显示区域, 效果如下:
下面在mainarea那块区域内添加皮肤列表.
<div #mainarea>
<div #skin-area>
</div>
</div>
并设置css为
#skin-area{
background-color:white;
margin:7;
padding:1 1 1 1;
width:100%%;
height:100%%;
}
下面就是往皮肤区放入内容了
在html的skin-area区域添加内容
<div #skin-area>
<img src="img\001\preview.png"/>
</div>
再接再厉, 继续添加看看
<div #skin-area>
<img src="img\001\preview.png"/>
<img src="img\002\preview.png"/>
<img src="img\003\preview.png"/>
<img src="img\004\preview.png"/>
<img src="img\005\preview.png"/>
<img src="img\006\preview.png"/>
<img src="img\007\preview.png"/>
<img src="img\008\preview.png"/>
<img src="img\009\preview.png"/>
<img src="img\010\preview.png"/>
</div>
变成了这副样子,滚动条也好丑, 为了让滚动条显示只显示在skin-area区域, 而不是整个窗口,那么需要在skin-area的父节点mainarea设置内容超出边界则隐藏滚动条
#mainarea{
background-color:rgba(0,66,33,0.3);
margin:0 1 1 1;
width:100%%;
height:100%%;
overflow:hidden;
}
滚动条消失了, 可是,图片列表显示也很奇怪, 我们需要它横向显示, 并且在超出边界的时候换行并能显示滚动条,htmlayout的flow属性里面刚好有这个模式,
#skin-area{
background-color:white;
margin:7;
padding:1 1 1 1;
width:100%%;
height:100%%;
flow:h-flow;
overflow-y:auto;
}
测试了overflow的其他几个属性, 发现hidden-scroll和scroll-indicator都没效果,
(经测试换成sciter是支持的,估计htmlayout还不支持)
目前先用auto吧, 就是丑了点
为了让滚动条好看一点,细一点, 那么我们可以自定义垂直滚动条, 参考htmlayout的手册示例,
我们在css中添加如下代码:
@set small-v-scrollbar
{
.slider
{
background-color: rgba(114,150,60,0.7);
}
.base { width: 3px; } /* explicit declaration of scrollbar width */
}
* { vertical-scrollbar: small-v-scrollbar; } /* all scrollable elements will have our small scrollbar now */
上面就是自定义的简短的代码, 更详细的介绍还是参考官方的文档,
为了让图片间距可控, 需要用div再次嵌套下. 我们把每个img都放入到div中去, 然后去操作div
<div #skin-area>
<div .listimg>
<img src="img\001\preview.png"/>
</div>
<div .listimg>
<img src="img\002\preview.png"/>
</div>
<div .listimg>
<img src="img\003\preview.png"/>
</div>
<div .listimg>
<img src="img\004\preview.png"/>
</div>
<div .listimg>
<img src="img\005\preview.png"/>
</div>
<div .listimg>
<img src="img\006\preview.png"/>
</div>
<div .listimg>
<img src="img\007\preview.png"/>
</div>
<div .listimg>
<img src="img\008\preview.png"/>
</div>
<div .listimg>
<img src="img\009\preview.png"/>
</div>
<div .listimg>
<img src="img\010\preview.png"/>
</div>
</div>
看到上面的 .listimg 了吗? 这里要用圆点 . , 圆点的意思是这个属性可以被重复使用, 就是名字可以重复, 相同名字的节点属性一致, 而我们上面一直用的是# , #表示的是此名字是唯一的, 不能重复使用.
ok , 去css里面设置下属性
#skin-area{
background-color:white;
margin:7;
padding:1 1 1 0;
width:100%%;
height:100%%;
flow:h-flow;
overflow-y:auto;
}
.listimg{
width:120px;
height:120px;
padding:0 0 1 1;
}
img
{
max-width:120px;
max-height:120px;
}
以上, 设置内边距的 底部和左边为1 ,其他是0, 因为我们的div是靠左靠上对齐的. 所以间距就刚刚好都是1了, 看起来整齐多了.
点击图片实现切换背景
为了能够动态切换背景图片, 需要把每个图片的div设置一个自定义的属性用来区分点击的是哪个图片.
html中修改, 增加了自定义的属性Lname,区分不同的节点
<div #skin-area>
<div .listimg Lname="001">
<img src="img\001\preview.png"/>
</div>
<div .listimg Lname="002">
<img src="img\002\preview.png"/>
</div>
<div .listimg Lname="003">
<img src="img\003\preview.png"/>
</div>
<div .listimg Lname="004">
<img src="img\004\preview.png"/>
</div>
<div .listimg Lname="005">
<img src="img\005\preview.png"/>
</div>
<div .listimg Lname="006">
<img src="img\006\preview.png"/>
</div>
<div .listimg Lname="007">
<img src="img\007\preview.png"/>
</div>
<div .listimg Lname="008">
<img src="img\008\preview.png"/>
</div>
<div .listimg Lname="009">
<img src="img\009\preview.png"/>
</div>
<div .listimg Lname="010">
<img src="img\010\preview.png"/>
</div>
</div>
为了产生交互, 需要在aardio工程中定义一个behavior, 在aardio里对html进行修改
skin.aardio代码如下: 添加个名字为myselect的自定义行为
import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=541;bottom=392;border="none")
winform.add()
/*}}*/
import web.layout;
import web.layout.behavior.windowCommand;
var wb = web.layout(winform,0xFFFF/*_HL_HANDLE_ALL*/);
namespace web.layout.behavior.myselect {
onMouseClick = function (ltTarget,ltOwner,x,y,ltMouseParams) {
var cmd = ltTarget.Lname or ltOwner.Lname;
var wbLayout = ltOwner.getLayout();
var ltEleBody = wbLayout.querySelector("body");
ltEleBody.style["background-image"]="url(img\"++cmd++"\skin.png)";
}
}
wb.go("\html\skin.html")
winform.show();
win.loopMessage();
return winform;
并且在css中引用这个行为
.listimg{
width:120px;
height:120px;
padding:0 0 1 1;
behavior:myselect;
active-on!: $1(div.listimg:checked):checked = false ,
self:checked = true;
}
ok,实现了切换背景功能....