js实现文字滚动的效果

本文实例为大家分享了js实现文字滚动的效果的具体代码,供大家参考,具体内容如下

在之前小编已经和大家介绍了一些常用的js动画效果,在此,和大家介绍一种可能不太常用的动画效果。该动画效果与文字相关,且,虽然不常用,但几乎每个人都见过它。相信大家都使用酷狗音乐或是网易云音乐进行音乐的搜索,听鉴,那么久一定会看到歌词页面中,歌词滚动的效果。此动画效果与其相同,但相对于这些音乐歌词效果而言又有些不同,增加了文字竖直排列并且滚动的效果。

在介绍之前,先和大家一起了解一些文字垂直排列的方式:writing-mode属性

1、取值:

(1)writing-mode:horizontal-tb | vertical-rl | vertical-lr | lr-tb | tb-rl
(2)兼容写法:-webkit-writing-mode:horizontal-tb | vertical-rl | vertical-lr | lr-tb | tb-rl
(注: lr-tb 和tb-rl在IE中不兼容)

默认值:normal
适用于:除 table-row-group, table-column-group, table-row, table-column 之外的所有元素
继承性:有
动画性:否
计算值:特定值

2、writing-mode的取值介绍

(1)horizontal-tb:水平方向自上而下的书写方式。即 left-right-top-bottom(类似IE私有值lr-tb)
(2)vertical-rl:垂直方向自右而左的书写方式。即 top-bottom-right-left(类似IE私有值tb-rl)
(3)vertical-lr:垂直方向自左而右的书写方式。即 top-bottom-left-right
(4)lr-tb:左-右,上-下。对象中的内容在水平方向上从左向右流入,后一行在前一行的下面。 所有的字形都是竖直向上的。这种布局是罗马语系使用的(IE)
(5)tb-rl:上-下,右-左。对象中的内容在垂直方向上从上向下流入,自右向左。后一竖行在前一竖行的左面。全角字符是(6)竖直向上的,半角字符如拉丁字母或片假名顺时针旋转90度。这种布局是东亚语系通常使用的(IE)

html:

<body style="font-size: 12px;" >
    <section class="topBox">
        <div class="topBoxTxt">
           <ul class="txtBox" id="txtBox">

           </ul>
        </div>
    </section>

    <script type="text/javascript" src="index.js" ></script>
    <script>
        (function(win){
            //文字水平排列滚动
        //          hor();
        //          horizontal(0);

            //文字垂直排列滚动
            $(".txtBox").addClass("txtBox_4");
            ver();
            vertical(0);

            //移动端适配
            var doc = win.document;
            var docEl = doc.documentElement;
            var tid;
            function refreshRem() {
                var width = docEl.getBoundingClientRect().width
                if (width > 768) { 
                    width = 768;
                }
                var rem = width / 7.5;
                docEl.style.fontSize = rem + 'px';
                docEl.style.fontSize = rem + 'px';
                docEl.style.fontSize = rem + 'px';
            }
            win.addEventListener('resize', function() {
                clearTimeout(tid);
                tid = setTimeout(refreshRem, 300);
            }, false);
            win.addEventListener('pageshow', function(e) {
                if (e.persisted) {
                    clearTimeout(tid);
                    tid = setTimeout(refreshRem, 300);
                }
            }, false);
            refreshRem();
        })(window);
    </script>
</body>

css:

body,html{
   width:100%;
    height:100%;
    position: relative;
    background: #232226;
    overflow-y: auto;
    overflow-x: hidden;
}
.topBox,.topBoxTxt{
    width:100%;
    height:auto;
    position: relative;
}
.topBoxTxt{
    text-align: center;
    height:auto;;
    color:#fff;
    font-size: 0.36rem;
    padding-top:55px;
}
.txtBox{
    width: 5.6rem;
    height: 5.2rem;
    margin:0 auto;
    overflow-y: scroll;
}
   .txtBox>li{
            opacity: 0.5;
            height:0.74rem;
}
   .txtBox>li:first-child{
      padding-top:60px;
   }
.txtBox>li.hotColor{
    opacity: 1;
}
.txtBox_4{
    width:4.6rem;
    height: 7.5rem;
    overflow-x: auto;
    white-space: nowrap;
    display: block;
}
.txtBox_4>li{
    writing-mode:tb-rl;
    writing-mode:vertical-rl;
    -webkit-writing-mode: vertical-rl;
    height: 0;
    line-height: 0.75rem;
    word-wrap:break-word;
}
.txtBox_4>li{
    width:0.4rem;
    text-align: center;
    margin:0 0.1rem;
    display: inline-table;
    position: relative;
}

index.js:

var freq=10;//滚动频率
var fraction=9/10;// 水平文字高亮显示行在歌词显示区域中的固定位置百分比
var frac=3/10;// 垂直文字高亮显示行在歌词显示区域中的固定位置百分比   
var timer=true;//定时器
var num=-1;//当前行下标
var time;//滚动距离
var eul = document.getElementById("txtBox");
var lis=[
    {"offset":3000, "text":"我总是轻描淡写告诉你我的愿望"},
    {"offset":6000, "text":"也给你千言万语都说不尽的目光"},
    {"offset":9000, "text":"这世界总有人在忙忙碌碌寻宝藏"},
    {"offset":12000, "text":"却误了浮世骄阳也错过人间万象"},
    {"offset":15000, "text":"古城里长桥上"},
    {"offset":18000, "text":"人如海车成行"},
    {"offset":21000, "text":"你笑得像光芒"},
    {"offset":24000, "text":"蓦然把我照亮"},
    {"offset":27000, "text":"风轻扬夏未央"},
    {"offset":30000, "text":"林荫路单车响"},
    {"offset":33000, "text":"原来所谓爱情"},
    {"offset":36000, "text":"是这模样"},
    {"offset":39000, "text":""}
]
var count=lis.length%7+5;

//文字水平排列滚动
function  hor(){
    for (var i = 0; i <lis.length; i++) {
        var eli = document.createElement("li");
        eli.innerText = lis[i].text;
        eul.appendChild(eli);
    }
     for(var j=0;j<count;j++){
        var eli = document.createElement("li");
        eli.innerText ="";
        eul.appendChild(eli);
    }
}

function horizontal(lineno){
    common(lineno,horizontal);

    var scrollTop;
    var ep = eul.children[lineno];
    if(30<ep.offsetTop<eul.clientHeight*fraction){
        scrollTop=ep.offsetTop;
    }else if(ep.offsetTop>(eul.scrollHeight-eul.clientHeight*(1-fraction))){
        scrollTop=eul.scrollHeight-eul.clientHeight;
    }else{
        scrollTop=ep.offsetTop=eul.clientHeight*fraction;
    }

    // 如用户拖动滚动条导致当前显示行超出显示区域范围,下一行直接定位到当前显示行
    if (eul.scrollTop > (scrollTop + eul.clientHeight*fraction)|| (eul.scrollTop + eul.clientHeight*fraction) < scrollTop){
        eul.scrollTop = scrollTop;
    }else { 
        var step = Math.ceil(Math.abs(eul.scrollTop - scrollTop)/(time/freq));
        scrollT(eul.scrollTop, scrollTop, step);
    }
}

function scrollT(crt, dst, step){
    if(Math.abs(crt - dst) < step){
        return;
    }
     if(crt < dst){
        eul.scrollTop += step;
        crt += step;
    }
    else {
        eul.scrollTop -= step;
        crt -= step;
    }
    setTimeout(scrollT.bind(this, crt, dst, step), freq);
};

//文字垂直排列滚动
function ver(){
    console.log(eul)
    for (var i = 0; i <lis.length; i++) {
        var eli = document.createElement("li");
        eli.innerHTML = lis[i].text;
        eul.appendChild(eli);
        if(eli.innerText.length<15){
            eli.style.marginBottom=(15-eli.innerText.length)+"em";
        }
    }
    for(var j=0;j<count;j++){
        var eli = document.createElement("li");
        eli.innerText ="";
        eul.appendChild(eli);
    }
}

function vertical(lineno){
    common(lineno,vertical);

    var scrollLeft;
    var ep = eul.children[lineno];
    if (ep.offsetLeft < eul.clientWidth*frac){
        scrollLeft = 0;
    } else if (ep.offsetLeft > (eul.scrollWidth - eul.clientWidth*(1-frac))){
        scrollLeft = eul.scrollWidth - eul.clientWidth;
    } else {
        scrollLeft = ep.offsetLeft - eul.clientWidth*frac;
    }

    // 如用户拖动滚动条导致当前显示行超出显示区域范围,下一行直接定位到当前显示行
    if (eul.scrollLeft > (scrollLeft + eul.clientWidth*frac)|| (eul.scrollLeft + eul.clientWidth*frac) < scrollLeft){
        eul.scrollLeft = scrollLeft;
    } else { 
        var step = Math.ceil(Math.abs(eul.scrollLeft - scrollLeft)/(time/freq));
        scrollL(eul.scrollLeft, scrollLeft, step);
    }
}

function scrollL(crt, dst, step){
    if(Math.abs(crt - dst) < step){
        return;
    }
    if(crt < dst){
        eul.scrollLeft += step;
        crt += step;
    } else {
        eul.scrollLeft -= step;
        crt -= step;
    }
    setTimeout(scrollL.bind(this, crt, dst, step), freq);
}

function common(lineno,fn){
    if (lineno ==0) {
        time = lis[lineno].offset; 
    } else {
        time = lis[lineno].offset - lis[lineno-1].offset;
    }
    timer = setTimeout(fn.bind(this, lineno+1), time);
    num=lineno;

    //若滚动到最后一行,则从头开始,并把每一行文字均取消高亮
    if(lineno==lis.length-1){
        for(var i=0;i<(eul.children).length-1;i++){
            eul.children[i].setAttribute("class", "");
        }
        lineno=0;
        timer = setTimeout(fn.bind(this, lineno), time);
    }
    if (lineno > 0) {
        eul.children[lineno-1].setAttribute("class", "");
    }
    var ep = eul.children[lineno];
    ep.setAttribute("class", "hotColor");
}

其中滚动时有些小瑕疵,若想尝试的朋友,就请自行修改,小编就提供帮助到此,还请记得引入jq文件哦

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 浅析js 文字滚动效果

    这种效果在今后的web发展中是不是常用或者是否依然被设计师们所青睐,从技术层面看并不是最重要的,了解它的实现原理,对自身前端技术的提高,会有很大的帮助,世间万物,万变不离其宗,掌握了它的运行规律,你才不会被其花花外表所迷惑,甚至你可以在掌握其规律的前提下,运行相关技术,创造出新的效果来.下面看看它的实现过程: 1.html 复制代码 代码如下: <div class="box" id="marqueebox0"> <ul> <li st

  • js 上下文字滚动效果

    js实现的文字向上滚动效果,适合文字公告等. test #textHeight{line-height:25px; height:25px; overflow:hidden; width:150px; font-size:12px; border:solid 1px #666;} function ScrollText(content){ this.Delay=10; this.Amount=1; this.Direction="up"; this.Timeout=1000; this

  • js焦点文字滚动效果代码分享

    本文实例讲述了js焦点文字滚动效果.分享给大家供大家参考.具体如下: 效果描述: 今天推荐的这个又是一个原生的js焦点图效果 默认自动切换,也可以手动切换 javascript代码采用函数式对象编程,也就是javascript编程中的Module模式 基本用法很简单,主要特点有三: 1.模块化,可重用 2.封装了变量和function,和全局的命名空间不接触,不污染全局变量 3.只暴露可用public方法,其他私有方法全部隐藏,确保js相互之间不会冲突 运行效果图:---------------

  • js实现文字滚动效果

    首先先看一下大致效果图,因为是动态的,在页面无法显示出来. 具体的实现代码如下: 1.首先是css代码: <style type="text/css"> body,ul,li,a,p,div{padding:0px; margin:0px; font-size:14px;} ul,li{list-style:none;} a{ text-decoration:none; color:#333;} #demo{ overflow:hidden; /*溢出的部分不显示*/ wi

  • js 动态文字滚动的例子

    复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>这是一个动态Java

  • JS实现倒计时和文字滚动的效果实例

    本文实例讲述了JS实现倒计时和文字滚动效果的方法.分享给大家供大家参考.具体实现方法如下: 说明:一般我们在一些淘宝类店铺中会看到一些像搞竞拍之类的活动,从中我们时而会发现一些倒计时的效果,在一些年会等场合我们也会发现一些抽奖活动,从中我们也可以看到一些随即滚动的效果.这里给大家分享一种实现倒计时和文字滚动的方法,希望可以对大家有所帮助.这里主要是通过js实现的. 一.倒计时效果的实现 前台部分的完整代码如下: 复制代码 代码如下: <html xmlns="http://www.w3.o

  • js+div实现文字滚动和图片切换效果代码

    本文实例讲述了js+div实现文字滚动和图片切换效果代码.分享给大家供大家参考.具体如下: 这里演示js+div文字滚动和图片切换代码,为了演示方便,去掉了图片调用,用数字代替了,用时候再加上就可以了,本效果实现了两种效果,Div切换,TAB切换,和文字滚动,鼠标移上后文字停止滚动,两种功能可任意剥离出来,这不影响代码使用. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/js-div-txt-pic-scroll-cha-style-codes

  • js文字滚动停顿效果代码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

  • js实现文字滚动的效果

    本文实例为大家分享了js实现文字滚动的效果的具体代码,供大家参考,具体内容如下 在之前小编已经和大家介绍了一些常用的js动画效果,在此,和大家介绍一种可能不太常用的动画效果.该动画效果与文字相关,且,虽然不常用,但几乎每个人都见过它.相信大家都使用酷狗音乐或是网易云音乐进行音乐的搜索,听鉴,那么久一定会看到歌词页面中,歌词滚动的效果.此动画效果与其相同,但相对于这些音乐歌词效果而言又有些不同,增加了文字竖直排列并且滚动的效果. 在介绍之前,先和大家一起了解一些文字垂直排列的方式:writing-

  • Android实现文字滚动播放效果的代码

    在开发时,我们会遇到文字过长,TextView不能完全展示,但又不想文字换行展示,这样有时会影响美观.这时我们就需要文字滚动播放,让用户可以看到所有的文字. 话不多说,直接上代码: import android.content.Context; import android.util.AttributeSet; import android.widget.TextView; public class MarqueTextView extends TextView { public MarqueT

  • js实现盒子滚动动画效果

    本文实例为大家分享了js实现盒子滚动动画效果的具体代码,供大家参考,具体内容如下 1.效果图1: 2.效果图2: 3.源代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale

  • js实现文字跑马灯效果

    本示例将实现文字跑马灯效果:文字超过显示宽度每间隔1s自动向左滚动显示,话不多说,请看代码 <!doctype html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,in

  • CountUp.js实现数字滚动增值效果

    数据改动的时候,countUp.js进行数值滚动增加的动态效果,供大家参考,具体内容如下 这是js文件 // target = id of html element or var of previously selected html element where counting occurs // startVal = the value you want to begin at // endVal = the value you want to arrive at // decimals =

  • velocity.js实现页面滚动切换效果

    今天介绍一个Javascript的小型的动画插件velocity.js,可以方便高效的开发一个具有多页面滚动切换效果的网站. 浏览器支持 velocity.js支持IE8+.Chrome.Firefox等浏览器,并支持Andriod以及IOS. 我们开发一个工程,里面有一组相关联系的大型页面.不能做到在一张页面中把它们展现出来,同时又希望能够有效的阅读到这些相关内容,可以通过做一些有趣的效果来帮住我们实现,通过页面滚动切换效果,可以很有效的制作一个吸引人眼球的网页. 所有的特效应用都是通过vel

随机推荐