css
----------------
* {margin:0; padding:0;}
#ul1 {width:400px; height:400px; border:1px solid black; margin:10px auto; overflow:hidden;}
#ul1 li {border-bottom:2px #999 dashed; padding:4px; list-style:none; overflow:hidden; filter:alpha(opacity:0);
opacity:0;}

html
----------------
    <textarea id="txt1" rows="4" cols="40"></textarea>
    <input id="btn1" type="button" value="Send" />
    <ul id="ul1">
    </ul>

js
----------------
            var oBtn = document.getElementById('btn1');
        var oUl = document.getElementById('ul1');
        var oTxt = document.getElementById('txt1');

        oBtn.onclick = function ()  // 1 //
        {
            var oLi = document.createElement('li');

            oLi.innerHTML = oTxt.value;
            oTxt.value = '';

            if (oUl.children.length > 0)  
            //  whether there is already element in the list
            {
                oUl.insertBefore(oLi, oUl.children[0]); //insertBefore so the elements always insert before the last element
            }
            else 
            {
                oUl.appendChild(oLi); //to add one element into an empty list
            }
            // 2  // 首先展开,然后透明度变化
            // 2.1 // 首先是高度
            
            var iHeight = oLi.offsetHeight;
            //console.log(iHeight);
            oLi.style.height = '0';  // 这里是设定到0,注意这时候上面的ul和li的overflow
            
            //2.2 透明度	上面设定里面设好 opacity
            startMove(oLi, { height: iHeight }, function ()//添加效果,每条信息添加上去的时候,都有一个加入的效果
            {
                startMove(oLi, { opacity: 100 }); //添加透明度变化的效果,加不加效果都不错
            });
        };

    // move function--perfect
    function getStyle(obj, name) {
            if (obj.currentStyle) {
                return obj.currentStyle[name];
            }
            else {
                return getComputedStyle(obj, false)[name];
            }
        }

        //startMove(oDiv, {width: 400, height: 400})
        function startMove(obj, json, fnEnd) {
            clearInterval(obj.timer);
            obj.timer = setInterval(function () {
                var bStop = true;		//假设:所有值都已经到了

                for (var attr in json) {
                    var cur = 0;

                    if (attr == 'opacity') {
                        cur = Math.round(parseFloat(getStyle(obj, attr)) * 100);
                    }
                    else {
                        cur = parseInt(getStyle(obj, attr));
                    }

                    var speed = (json[attr] - cur) / 6;
                    speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);

                    if (cur != json[attr])
                        bStop = false;

                    if (attr == 'opacity') {
                        obj.style.filter = 'alpha(opacity:' + (cur + speed) + ')';
                        obj.style.opacity = (cur + speed) / 100;
                    }
                    else {
                        obj.style[attr] = cur + speed + 'px';
                    }
                }

                if (bStop) {
                    clearInterval(obj.timer);

                    if (fnEnd) fnEnd();
                }
            }, 30);
        }