sweetga 2014-10-26
最近要在手机端的HTML5里面实现一个类似新浪微博的“Pull & Refresh”的功能,时间紧迫,一时找不到比较好用的框架,发现Lungo还不错,于是试用了一下,发现还不错,轻量小巧。
Lungo很多函数与JQuery差不多,比如mix()、isOwnProperty()、toType(),另外因为我使用BootStrap,很多功能与Lungo重复,因此Lungo的很多组件我用不上,没有细致的研究。不过,最坑爹的是,我要用的Pull & Refresh它只支持从顶部下拉刷新,不支持从底部往上刷新!
       好吧!暂时找不到其它框架,那就自己动手修改一下吧
由于Lungo的css与Bootstrap的css冲突了,没有全部引用Lungo的css,并且自己加了不少样式,所以单独出来,只包含Pull & Refresh的部分,代码如下:
/* Pull & Refresh */
body>section.show {
    -webkit-box-ordinal-group: 2;
    -moz-box-ordinal-group: 2;
    -ms-box-ordinal-group: 2;
    -o-box-ordinal-group: 2;
    box-ordinal-group: 2;
    display: -webkit-box;
    display: -moz-box;
    display: -ms-box;
    display: -o-box;
    display: box;
    position: relative;
}
body>aside.show>article.active.pull,
body>section.show>article.active.pull,
body>aside.hide>article.active.pull,
body>section.hide>article.active.pull,
body>aside.hiding>article.active.pull,
body>section.hiding>article.active.pull
    {
    -webkit-transition-property: transform;
    -moz-transition-property: transform;
    -ms-transition-property: transform;
    -o-transition-property: transform;
    transition-property: transform;
    -webkit-transition-duration: 500ms;
    -moz-transition-duration: 500ms;
    -ms-transition-duration: 500ms;
    -o-transition-duration: 500ms;
    transition-duration: 500ms
}
section.show>[data-control="pull"]>.loading {
    position: relative;
    width: 25px;
    color: #ff8612;
    font-size: 12px;
    line-height: 1; /* 1倍行距,否则不能居边对齐 */
}
section.hide>[data-control="pull"] {
    display: none
}
section.show>[data-control="pull"] {
    position: absolute;
    z-index: -1;
    top: 0;
    line-height: 60px;
    width: 100%;
    height: 80px;
    padding: 10px 0;
    text-align: center;
}
section.show>[data-control="pull"]>.icon {
    display: inline-block;
    width: 25px;
    color: #ff8612;
    font-size: 12px;
    line-height: 1;
    -webkit-backface-visibility: hidden;
    -moz-backface-visibility: hidden;
    -ms-backface-visibility: hidden;
    -o-backface-visibility: hidden;
    backface-visibility: hidden;
    -webkit-transition: all .2s ease-in-out;
    -o-transition: all .2s ease-in-out;
    transition: all .2s ease-in-out;
}
section.show>[data-control="pull"]>.loading {
    display: none;
    left: 0%
}
section.show>[data-control="pull"]>.msg {
    position: relative;
    color: #ff8612;
    font-size: 12px;
    font-weight: normal;
    line-height: 1; /* 1倍行距,否则不能居边对齐 */
    display: inline-block;
}
section.show>[data-control="pull"].rotate>.icon {
    -webkit-transform: rotate(-180deg);
    -moz-transform: rotate(-180deg);
    -ms-transform: rotate(-180deg);
    -o-transform: rotate(-180deg);
    transform: rotate(-180deg);
    -webkit-transition: all .2s ease-in-out;
    -o-transition: all .2s ease-in-out;
    transition: all .2s ease-in-out;
}
section.show>[data-control="pull"].refresh>.icon {
    display: none
}
section.show>[data-control="pull"].refresh>.loading {
    display: inline-block
}
section.show>[data-control="pull"].pulling-down {
    top: 0;
    bottom: auto;
}
section.show>[data-control="pull"].pulling-up {
    top: auto;
    bottom: 0;
}
section.show>[data-control="pull"].pulling-down .pullup.icon {
    display: none;
}
section.show>[data-control="pull"].pulling-up .pulldown.icon {
    display: none;
}
section.show>[data-control="pull"].pulling-down>.icon,
 section.show>[data-control="pull"].pulling-down>.loading,
 section.show>[data-control="pull"].pulling-down>.msg {
    vertical-align: top;
}
section.show>[data-control="pull"].pulling-up>.icon,
 section.show>[data-control="pull"].pulling-up>.loading,
 section.show>[data-control="pull"].pulling-up>.msg {
    vertical-align: bottom;
}
/* Pull & Refresh end */然后,重新实现了Pull组件,要用的话可以将如下代码替换Lungo.js中与Pull相关的那部分,JavaScript代码如下:
/** * Creates a instance of Pull & Refresh Element。<br> * 增加功能:在原来的Pull Down & Refresh的基础上,支持Pull Up & Refresh。 * * @namespace Lungo.Element * @class Pull * @version 1.0 * * @author Ignacio Olalde <[email protected]> || @piniphone * @author Javier Jimenez Villar <[email protected]> || @soyjavi * @author fbchen <[email protected]> */ (function() { // 修改loading的样式 Lungo.Attributes['loading'] = { selector : "*", html : '<span class="loading {{value}}"></span>' }; Lungo.Attributes['pull'] = { selector : "*", html : '<div data-control="pull" data-icon="pulldown {{value}}" data-loading="fa fa-spinner fa-spin"><span class="msg"></span></div>' }; Lungo.Element.Pull = function(element_selector, config_data) { var ANIMATION_TIME, CONFIG_BASE, CONTAINER, CURRENT_DISTANCE, ELEMENT, MAX_HEIGHT, REFRESHING, REFRESHING_HEIGHT, PULLING_DOWN, hide, _blockGestures, _getTouchY, _handlePullEnd, _handlePulling, _moveElementTo, _refreshStart, _setContainerLoading, _setContainerOnPulling, _setContainerTitle, UP = void 0, DOWN = void 0, isOwnProp = Lungo.Core.isOwnProperty, pullUpIcon; REFRESHING_HEIGHT = 68; MAX_HEIGHT = 80; ANIMATION_TIME = 300; CURRENT_DISTANCE = 0; PULLING_DOWN = true; REFRESHING = false; ELEMENT = $$(element_selector); CONTAINER = ELEMENT.siblings("div[data-control=\"pull\"]"); CONFIG_BASE = { onPull : "Pull down to refresh", onRelease : "Release to...", onRefresh : "Loading...", callback : void 0 }; // 分出pull down、pull up的配置,为了向后兼容,默认都是pull down UP = Lungo.Core.mix(CONFIG_BASE, config_data['up']); DOWN = Lungo.Core.mix(CONFIG_BASE, config_data['down']); if (!isOwnProp(config_data, 'up') && !isOwnProp(config_data, 'down')) { DOWN = Lungo.Core.mix(CONFIG_BASE, config_data); } // 注入data-pullup图标 pullUpIcon = UP.icon || ELEMENT.parent().data('pullup'); if (pullUpIcon) { CONTAINER.prepend('<span class="pullup icon ' + pullUpIcon + '"></span>'); } hide = function() { _moveElementTo(0, true); setTimeout((function() { REFRESHING = false; CONTAINER.attr("class", ""); return ELEMENT[0].removeEventListener("touchmove", _blockGestures, true); }), ANIMATION_TIME); return CURRENT_DISTANCE = 0; }; _moveElementTo = function(posY, animate) { var newPos; newPos = Math.abs(posY) > MAX_HEIGHT ? (posY < 0 ? -1 * MAX_HEIGHT : MAX_HEIGHT) : posY; if (animate) { ELEMENT.addClass("pull"); } else { ELEMENT.removeClass("pull"); } ELEMENT.style("-webkit-transform", "translate(0, " + newPos + "px)"); if (animate) { return setTimeout((function() { return ELEMENT.removeClass("pull"); }), ANIMATION_TIME); } }; _refreshStart = function(event) { REFRESHING = true; ELEMENT[0].addEventListener("touchmove", _blockGestures, true); _setContainerTitle(_getConf().onRefresh); _setContainerLoading(true); _moveElementTo(PULLING_DOWN ? REFRESHING_HEIGHT : -1 * REFRESHING_HEIGHT, true); if (_getConf().callback) { return _getConf().callback.apply(this); } }; _setContainerTitle = function(title) { return CONTAINER.find(".msg").html(title); }; _setContainerLoading = function(op) { _setContainerPosition(); if (op) { return CONTAINER.addClass("refresh"); } else { return CONTAINER.removeClass("refresh"); } }; _setContainerOnPulling = function(op) { _setContainerPosition(); if (op) { return CONTAINER.addClass("rotate"); } else { return CONTAINER.removeClass("rotate"); } }; _setContainerPosition = function() { if (PULLING_DOWN) { CONTAINER.removeClass("pulling-up").addClass("pulling-down"); } else { CONTAINER.removeClass("pulling-down").addClass("pulling-up"); } } _getConf = function() { return PULLING_DOWN ? DOWN : UP; }; _blockGestures = function(touchEvent) { return touchEvent.preventDefault(); }; _handlePulling = function(event) { _moveElementTo(PULLING_DOWN ? CURRENT_DISTANCE : -1 * CURRENT_DISTANCE, false); _setContainerLoading(false); if (CURRENT_DISTANCE > REFRESHING_HEIGHT) { _setContainerTitle(_getConf().onRelease); return _setContainerOnPulling(true); } else { _setContainerTitle(_getConf().onPull); return _setContainerOnPulling(false); } }; _handlePullEnd = function(event) { if (CURRENT_DISTANCE > REFRESHING_HEIGHT) { _refreshStart(); } else { hide(); } return this; }; _getTouchY = function(event) { if ($$.isMobile()) { return event.touches[0].pageY; } else { return event.pageY; } }; (function() { var INI_Y, STARTED, dt; STARTED = false; INI_Y = 0; return ELEMENT.bind("touchstart", function(event) { if (ELEMENT[0].scrollTop <= 1) { STARTED = true; INI_Y = _getTouchY(event); } return true; }).bind("touchmove", function(event) { var current_y; if (!REFRESHING && STARTED) { current_y = _getTouchY(event); dt = current_y - INI_Y; PULLING_DOWN = dt > 0; CURRENT_DISTANCE = Math.abs(dt); _handlePulling(event); if (event.cancelable !== false) { event.preventDefault(); } } return true; }).bind("touchend", function() { if (STARTED) { _handlePullEnd(); } STARTED = false; return true; }); })(); return { hide : hide }; }; }).call(this);
最后是HTML测试页面,模拟手机端的“拖拽”功能,可以用Chrome打开,用浏览器自带的“开发者工具”,切换到Device模式调试。HTML页面如下:
<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Pull & Refresh</title>
    <!-- Bootstrap -->
    <link type="text/css" rel="stylesheet" href="./js/bootstrap3.2/css/bootstrap.min.css">
    <link type="text/css" rel="stylesheet" href="./css/font-awesome-4.2.0/css/font-awesome.min.css">
    <link type="text/css" rel="stylesheet" href="./css/zyb/app.css">
    <style type="text/css">
    .article {
        background-color: beige;
    }
    h1 {
        background-color: azure;
        margin-bottom: 0;
        margin-top: 100px;
    }
    </style>
</head>
<body>
<h1>测试下拉刷新功能</h1>
<!-- 内容列表 -->
<section id="articleList" data-transition="slide" data-pull="fa fa-long-arrow-down" data-pullup="fa fa-long-arrow-up">
    <article class="article">
        <div title="下拉文章内容刷新">
            文章内容<br>
            文章内容<br>
            文章内容<br>
            文章内容<br>
        </div>
    </article>
</section>
<script type="text/javascript" src="./js/jquery/jquery-1.11.1.min.js"></script>
<script type="text/javascript" src="./js/bootstrap3.2/js/bootstrap.min.js"></script>
<!-- 支持 Pull & Refresh -->
<script type="text/javascript" src="./js/quojs-2.3.6/quo.js"></script>
<script type="text/javascript" src="./js/lungo-2.2.1/lungo-1.js"></script>
<script>
$(function(){
    
    Lungo.init({});
    var pull_example = new Lungo.Element.Pull('#articleList article', {
        down: {
        	onPull: '下拉刷新',      // Text on pulling
            onRelease: '释放更新',   // Text on releasing
            onRefresh: '加载中...',  // Text on refreshing
            callback: function() { // Action on refresh
                //alert('Pull & Refresh completed!');
                setTimeout(function() {
                    pull_example.hide();
                }, 3000);
            }
        },
        up: {
            onPull: '上推刷新',      // Text on pulling
            onRelease: '释放更新',   // Text on releasing
            onRefresh: '加载中...',  // Text on refreshing
            callback: function() { // Action on refresh
                //alert('Pull & Refresh completed!');
                setTimeout(function() {
                    pull_example.hide();
                }, 3000);
            }
        }
    });
    
});
</script>
</body>
</html>效果如下:
    
 
 
 
表格的现在还是较为常用的一种标签,但不是用来布局,常见处理、显示表格式数据。在HTML网页中,要想创建表格,就需要使用表格相关的标签。<table> <tr> <td>单元格内的文字</td> ...
一个客户要求给网站添加一个背景音乐,我用的是html5添加网页背景音乐的代码,在此记录一下以后有用。html5方法二:<videocontrols=""autoplay=""name="media&q