JS-发布消息的一个运动小效果

模仿一些网站发布消息时候,淡入,缓慢滑动的小效果,废话不多说,看下最终测试效果!有图有真相!

接下来一步步分析实现的过程,一下是为了演示过程中一些注意点,用的测试代码,不是最终效果代码,最终效果代码,我贴在文章最后!!

html代码

<textarea  id="content" cols="60" rows="10"></textarea><br>
<input id="btn1" type="button" value="发布">
<ul id="ulList">
    <li>1233</li>
</ul>

样式代码

<style>
        *{padding: 0;margin: 0;}
        #ulList{
            list-style: none;
            width: 300px;height: 300px;
            border: 1px solid #000;
            margin: 10px auto;
        }
        #ulList li{
            border-bottom: 1px dashed #c00;
            padding: 2px;
        }
</style>
<script>
    window.onload = function () {
        var oTxt = document.getElementById('content');
        var oBtn = document.getElementById('btn1');
        var oUl = document.getElementById('ulList');

        oBtn.onclick = function () {
            var oLi = document.createElement('li');// 创建一个li元素
            oLi.innerHTML = oTxt.value;
            oTxt.value = '';
            oUl.appendChild(oLi);
        }
    }
</script>

这里每次新创建的li都是放在尾部,如果想让它创建好放在顶部,需要判断一下,如果当前ul里没有li,那么直接appendChild,如果有已经有li元素,就用insertBefore

oBtn.onclick = function () {
            var oLi = document.createElement('li');
            var aLi = oUl.getElementsByTagName('li');// 获取的ul下的所有li

            oLi.innerHTML = oTxt.value;
            oTxt.value = '';
            if(aLi.length){ // 判断ul里有没有li元素
                oUl.insertBefore(oLi);
            }else{
                oUl.appendChild(oLi);
            }
}

到这里插入每一条内容,都会从头部插入了,但是插入的动作太生硬了,这里就用我们的运动框架,来使插入变得平滑;

首先保证先引入了运动框架:<script src="move.js"></script> 运动框架在《JS完美运动框架》中有代码

<script>
    window.onload = function () {
        var oTxt = document.getElementById('content');
        var oBtn = document.getElementById('btn1');
        var oUl = document.getElementById('ulList');

        oBtn.onclick = function () {
            var oLi = document.createElement('li');
            var aLi = oUl.getElementsByTagName('li');// 获取的ul下的所有li

            oLi.innerHTML = oTxt.value;
            oTxt.value = '';
            if(aLi.length){ // 判断ul里有没有li元素
                oUl.insertBefore(oLi,aLi[0]);// 在下标为0的li前插入oLi
            }else{
                oUl.appendChild(oLi);
            var iHeight = oLi.offsetHeight;
            oLi.style.height = 0;// 然后把li的高度置0
            startMove(oLi,{height:iHeight}, function () {
                startMove(oLi,{opacity:100});
            })

        }
    }
</script>

因为每个li的高度是不固定的,

var iHeight = oLi.offsetHeight;// 1.上来先把li的高度存一下

oLi.style.height = 0;// 2. 然后把li的高度置0

startMove(oLi,{height:iHeight})// 3. 通过运动框架重新把li的高度设回去

看一下运行效果发现,做运动的时候文字会超出li的边框(图中文字开始时超出了红框的),需要在li的样式设置中:使overflow:hidden,问题就解决了

#ulList li{
            border-bottom: 1px dashed #c00;
            padding: 2px;
            overflow: hidden;
}

到这里问题就解决了,但是在IE7 下会有先卡一下在出来的的现象,所以这里需要将原来的ul嵌套li的布局,改成div套div

<textarea  id="content" cols="30" rows="10"></textarea><br>
<input id="btn1" type="button" value="发布"><br>
<div id="ulList">
    <div>1233</div>
</div>
<script>
    window.onload = function () {
        var oTxt = document.getElementById('content');
        var oBtn = document.getElementById('btn1');
        var oUl = document.getElementById('ulList');

        oBtn.onclick = function () {
            var oLi = document.createElement('div');//这里将li改成div
            var aLi = oUl.getElementsByTagName('div');//这里将li改成div
            oLi.innerHTML = oTxt.value;
            oTxt.value = '';
            if(aLi.length){
                oUl.insertBefore(oLi,aLi[0]);
            }else{
                oUl.appendChild(oLi);
            var iHeight = oLi.offsetHeight;
            oLi.style.height = 0;
            startMove(oLi,{height:iHeight}, function () {
                startMove(oLi,{opacity:100});// 透明度改变

            })
        }
    }
</script>

到这里效果就实现了

为了美观,修改一下样式,最终效果的代码如下

<div class="container">
    <textarea  id="content" cols="60" rows="10"></textarea><br>
    <input id="btn1" type="button" value="发布"><br>
    <div id="msgList">
        <div></div>
    </div>
</div>
<style>
        *{padding: 0;margin: 0;}
        body{background: url("body_repeat.png");}
        .container{
            width: 500px;
            margin: 10px auto;
        }
        #content{
            padding: 8px;
            background: rgba(255,255,255,.6);
            border: none;
            box-shadow: 2px 2px 3px rgba(0,0,0,.6);
            border-radius: 5px;
        }
        #btn1{
            border: none;
            width: 60px;height: 40px;
            background: #ffc09f;
            font-family:"微软雅黑";font-size:16px;color: #fff;
            border-radius: 5px;
        }
        #msgList{
            list-style: none;
            width: 420px;_height: 400px;min-height: 400px;
            background: rgba(255,255,255,.8);
            border-radius: 5px;
            border: 1px solid #eee;
            margin: 10px ;
        }
        #msgList div{
            border-bottom: 1px dashed #aaa;
            padding: 2px;
            opacity: 0;
            filter:alpha(opacity:0);
            overflow: hidden;
        }
 </style>
<script src="move.js"></script>
<script>
    window.onload = function () {
        var oTxt = document.getElementById('content');
        var oBtn = document.getElementById('btn1');
        var oDiv = document.getElementById('msgList');

        oBtn.onclick = function () {
            var newDiv = document.createElement('div');//每发布一条消息需要创建一个新div
            var aDiv = oDiv.getElementsByTagName('div');// 获取msgList的下的所有div元素

            newDiv.innerHTML = oTxt.value;//新div的内容就等于textarea里发布内容
            oTxt.value = ''; // 然后把textarea清空
            if(aDiv.length){ // 判断msgList里有没有div元素
                oDiv.insertBefore(newDiv,aDiv[0]);// 在下标为0的div前插入一个div
            }else{
                oDiv.appendChild(newDiv);
            }
            // 接下来是添加运动部分,因为插入的每个div的高度不固定
            var iHeight = newDiv.offsetHeight;// 先把div的高度存一下
            newDiv.style.height = 0;// 然后把div的高度置0
            startMove(newDiv,{height:iHeight}, function () {
                startMove(newDiv,{opacity:100});
            })//通过运动框架重新把div的高度设回去

        }
    }
</script>

时间: 2024-11-13 06:48:23

JS-发布消息的一个运动小效果的相关文章

一个随机上翻的小效果

html <!DOCTYPE html> <html> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="Content-Type" content="text/html; charset=uft-8"> <meta name="keywords

使用原生JS实现一个风箱式的demo,并封装了一个运动框架

声明,该DEMO依托于某个培训机构中,非常感谢这个培训结构.话不多说,现在开始改demo的制作. 首先,在前端的学习过程中,轮播图是我们一定要学习的,所以为了更加高效的实现各种轮播图,封装了一个运动的框架. 1 function getStyle(obj,attr) { 2 if(obj.currentStyle){ 3 return obj.currentStyle[attr];//为了获取IE下的属性值 4 }else{ 5 return window.getComputedStyle(ob

js之图片变大变小效果

1.当鼠标移到图片上,图片变大:当鼠标移出图片,图片变小,效果如图: 2.原理不难,就是鼠标over时,设置一个定时器,让图片逐渐变大,鼠标out时同理,看下最初的简略代码你就会明白: <!DOCTYPE html> <html> <head> <style type="text/css"> div {     width: 200px;           /* 宽度 */     height: 100px;          /* 

一个小效果引出的兼容性探讨

最近在做个小效果,没想到引出了几个以前的没认真去自己探讨的兼容问题,最后虽然这个效果还是不是很满意,但在这里想分享一下过程 首先想做的效果是 每次点击页面时,出现一个小波纹,然后自动消失 可以先看一下demo 到最后实现后,发现这个效果实用性不是很高,但是过程引出了一些值得积累的问题 引出知识点: transition的兼容支持 事件兼容 transitionend的兼容 如果我out了,请点击关闭 首先看一下 transition 的兼容性 1 <span style="font-siz

一个JS弹出层用户登录效果

<html> <head> <meta http-equiv="Content-Type"content="text/html; charset=gb2312"/> <title>接触角测定仪 http://www.dgshengding.com</title> <style> body,#Mdown{margin: 0;padding: 0;text-align: center;font: n

Js写的一个倒计时效果实例

我们经常会看到某些网站在注册的时候喜欢搞个按钮倒计时的效果,就是多少秒之后注册这个按钮才可以点击,其目的就是强迫你去看他的注册注意事项,这是一个很实用的效果:另外当我们进行在线考试的时候也必定会碰到答题倒计时的效果,这种倒计时效果是如何实现的呢?下面我们就用Js来实现一个倒计时效果,具体代码: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf

js-------》(小效果)实现倒计时及时间对象

js实现倒计时及时间对象 JS实现倒计时效果代码如下: 1 <!doctype html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>无标题文档</title>h 6 <style> 7 #box { 8 width: 100%; 9 height: 400px; 10 background: black; 11 color: #fff; 1

CSS3实现几个常用的网页小效果

主题 由于最近比较忙,自己也没有很充裕的时间可以去做比较丰富的分享.今晚我挤出时间来制作这几个很常用的CSS3网页小效果.最近写JS的时间比例比较多,不过我还是比较钟情于CSS3.所以我还是坚持分享一些实用的CSS3小例子.这次由于时间有限,就做了几个相对比较简单的例子.看一下吧! 正文 第一种效果: 由于录制gif图片会掉帧,所以看起来不流畅,很卡,但其实实际效果还是不错的,有弹性一些. html代码: <span class="shake">弹</span>

页面滚动显示或隐藏元素Headroom.js插件帮助你实现滚动效果

Headroom.js 是什么? Headroom.js 是一个轻量级.高性能的JS小工具(不依赖任何工具库!),它能在页面滚动时做出响应.此页面顶部的导航条就是一个鲜活的案例,当页面向下滚动时,导航条消失,当页面向上滚动时,导航条就出现了. Headroom.js 有什么用? 固定页头(导航条)可以方便用户在各个页面之间切换.但是这也会带来些问题…本文原创博客地址:http://www.cnblogs.com/unofficial官网地址:www.pushself.com) 大屏幕一般都是宽度