手把手从零开始教你用htmlayout/sciter写漂亮ui界面(二)

书接上回: 手把手从零开始教你用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,实现了切换背景功能....

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值