【手把手】JavaWeb 入门级项目实战 -- 文章发布系统 (第三节)

3.6.6 轮播图的基本实现

上一节中,轮播图已经做了一大半,我今天上午抽空把剩下的代码写完了。现在就大概说一下思路吧。
实现上一张和下一张的效果,基本上就是改变ul的margin-left值。为了保证无缝滚动,我们需要在5张图片的首部和尾部各加一张图片。像这样:

<ul>
    <li class='fl'>
        <a href="javascript:void(0)">
             <img src="5.jpg "/>
        </a>
    </li>
    <li class='fl'>
        <a href="javascript:void(0)">
             <img src="1.jpg "/>
        </a>
    </li>
    <li class='fl'>
        <a href="javascript:void(0)">
             <img src="2.jpg "/>
        </a>
    </li>
    <li class='fl'>
        <a href="javascript:void(0)">
             <img src="3.jpg "/>
        </a>
    </li>
    <li class='fl'>
        <a href="javascript:void(0)">
             <img src="4.jpg "/>
        </a>
    </li>
    <li class='fl'>
        <a href="javascript:void(0)">
             <img src="5.jpg "/>
        </a>
    </li>
    <li class='fl'>
        <a href="javascript:void(0)">
             <img src="1.jpg "/>
        </a>
    </li>
</ul>

接下来,编写移动图片的方法,为了控制下一张和上一张,我们定义一个索引变量index就可以啦。

var index = 0;

获取图片的宽度的数量

var imgwidth = $('.banner .content ul li').width(); //获取轮播图片的宽度
var len =  $('.banner .content ul li').length - 2//获取总共的图片数量

移动图片的方法

function movePicture(){
    $('.banner .content ul').animate({'margin-left':-imgwidth * (index+1)},1000,function(){
        if(index == len){
            $(this).css('masrgin-left',-imgwidth);
            index = 0;
        }
        if(index == -1){
            $(this).css('margin-left',-imgwidth * len);
            index = len - 1;
        }
    });
}

最后,给按钮绑定事件:

rightBtn.on('click',function(){
    index ++;
    movePicture();
});

leftBtn.on('click',function(){
    index --;
    movePicture();
});

3.6.7 按钮的节流控制

接下来要做一个简单的前台节流,意思就是说,如果有用户闲得无聊,在那拼命的点击下一张的按钮,那么每一次点击都会触发movePicture函数,这个时候,你就会看到图片在那乱跳。

所以,为了避免这种用户的操作,我们需要用js来做一个节流,额,好像是叫节流。我记不太清了。意思就是说,比如你在一秒钟内连续点击了8次,那么我就认为这8次中只有1次是有效的,其他的点击都是误操作。

这样的话,无论你怎么狂点鼠标,我都只调用一次movePicture函数。

首先,我们定义一个空的定时器。

var timer = null; 

思路为:
每当我触发按钮的点击事件,就把当前的定时器timer清零,然后又马上给他设置定时内容,比如500毫秒后才进行移动操作。也就是说,如果你狂点鼠标,那么定时器就会被马上清零,然后进入定时器的等待状态。必须要等你满了500毫秒,才进行下面的操作。

原理就是这么简单,这个方式也经常用于登陆按钮上。比如,当你网速很慢的时候,点击登陆,网页没有立即给你跳转页面。有些用户闲着无聊,就在那狂点鼠标,不知道你有没有这么做过呢?

如果没有做好节流,那么就会有大量的请求传递到服务器,会给服务器造成很大的压力。

差不多就是这个意思,上代码:

rightBtn.on('click',function(){
    clearTimeout(timer); //定时器清零
    timer = setTimeout(function(){
        index ++;
        movePicture();
    },500);
    
});

leftBtn.on('click',function(){
    clearTimeout(timer); //定时器清零
    timer = setTimeout(function(){
        index --;
        movePicture();
    },500);
});

不论我鼠标怎么狂点,它每次都只移动一张图片。

好了,轮播图差不多就聊到这里吧,你可以自己去慢慢完善,时间关系我就不扩展太多了。剩下的就交给你自己去玩耍了,比如,我能不能做一个定时轮播呢,每个5秒钟就自动切换到下一张。

我就不写了。

3.6.8 整合资源文件

现在,我们把这个已经做好的banner区域搬到项目里。

在WebContent目录下新增一个static文件夹,这里存放各种静态资源文件。

比如img,js,css等


因为刚才的页面中用到了百度资源库里的jQuery文件:

http://libs.baidu.com/jquery/2.0.0/jquery.min.js

现在我们直接将这个url用浏览器打开。

全部复制。

然后在js文件夹中新建一个jQuery.js文件。

现在,将刚才复制的内容原封不动地拷贝进去。

ctrl + s 保存。

OK,jQuery文件已经有了,接下来,我们将素材图片拷贝到img文件夹中。这样,资源文件就全部准备好了。

3.6.7 引用资源文件

在整合好资源文件后,如何将这些资源文件导入我们的index.jsp呢?这是一个问题。

我们将html代码和css样式拷贝到index.jsp中,看看效果。

图片都没有显示出来。

那么,如何改变img的src,使他能够成功引到/Article/WebContent/static/img 里面的图片呢?

我提供一种比较方便的办法,就是在jsp页面中写Java代码,让Java来获取项目的根路径,然后通过绝对路径的方式引入资源文件。

我们在jsp页面的开头加上以下代码:

<%
    String path = request.getContextPath();
    int port = request.getServerPort();
    String basePath  = null;
    if(port==80){
        basePath = request.getScheme()+"://"+request.getServerName()+path;
    }else{
        basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path;
    }
    request.setAttribute("basePath", basePath);
%>

request就是所谓的JSP九大隐式对象中的一员,其实JSP就是Servlet,你可能学过Servlet,那么应该很清楚request是什么意思。以后我会单独来讲解一下关于JSP的东西,现在先继续往下说吧。

request.setAttribute("basePath", basePath) 表示将得到的basePath(项目根路径)存放到request作用域中,你可以把request看做一个HashMap,或者一个JSON对象,都可以。

反正,这句话一写,就说明request作用域中已经有了basePath,我们在JSP页面的其他地方就可以获取到了。

<div class="banner">
    <div class='content'>
        <ul>
            <li class='fl'>
                <a href="javascript:void(0)">
                    <img src="${basePath}/static/img/5.jpg "/>
                </a>
            </li>
            <li class='fl'>
                <a href="javascript:void(0)">
                    <img src="${basePath}/static/img/1.jpg "/>
                </a>
            </li>
            <li class='fl'>
                <a href="javascript:void(0)">
                    <img src="${basePath}/static/img/2.jpg "/>
                </a>
            </li>
            <li class='fl'>
                <a href="javascript:void(0)">
                    <img src="${basePath}/static/img/3.jpg "/>
                </a>
            </li>
            <li class='fl'>
                <a href="javascript:void(0)">
                    <img src="${basePath}/static/img/4.jpg "/>
                </a>
            </li>
            <li class='fl'>
                <a href="javascript:void(0)">
                    <img src="${basePath}/static/img/5.jpg "/>
                </a>
            </li>
            <li class='fl'>
                <a href="javascript:void(0)">
                    <img src="${basePath}/static/img/1.jpg "/>
                </a>
            </li>
        </ul>
        
        <span class='banner_left'><i class='btn_left'></i></span>
        <span class='banner_right'><i class='btn_right'></i></span>
</div>

这样就能访问到了。

刚才还忘了一样东西,就是左右按钮的图片,也把它拷贝进来。

引入

.btn_left ,.btn_right{
    display: inline-block;
    width: 21px;
    height: 150px;
    background: url(${basePath}/static/img/banner_tb.png) no-repeat;
    position: absolute;
    left: -38px;
    top: 90px;
    opacity: 0;
    transition: all ease 0.6s;
    cursor: pointer;
}

顺便把banner图往上一点:

.banner {
    height: 400px;
    margin-top: 2px;
    overflow: hidden;
}

把js代码也全部拷贝过来吧。

var leftBtn = $('.btn_left').eq(0); //左按钮
var rightBtn = $('.btn_right').eq(0);//右按钮

var ul = $('.banner .content ul').eq(0); 

var index = 0;
var timer = null; 

var imgwidth = $('.banner .content ul li').width(); //获取轮播图片的宽度
var len =  $('.banner .content ul li').length - 2//获取总共的图片数量

rightBtn.on('click',function(){
    clearTimeout(timer); //定时器清零
    timer = setTimeout(function(){
        index ++;
        movePicture();
    },500);
    
});

leftBtn.on('click',function(){
    clearTimeout(timer); //定时器清零
    timer = setTimeout(function(){
        index --;
        movePicture();
    },500);
});
        

function movePicture(){
    
    $('.banner .content ul').animate({'margin-left':-imgwidth * (index+1)},1000,function(){
        if(index == len){
            $(this).css('masrgin-left',-imgwidth);
            index = 0;
        }
        if(index == -1){
            $(this).css('margin-left',-imgwidth * len);
            index = len - 1;
        }
    });
}

发现一个小BUG,当我一直点击下一张,移动到最后一张图片的时候(也就是第一张图片,因为我们在末尾加上了第一张图片),第二张图片(有的苹果那张)没有自动衔接上去。

这是咋回事呢?

有BUG不要怕,去找原因就行了。

经过检查,我发现了一个单词的拼写错误:

原来是margin-left写错了。

OK,更正后就正确了,我顺便把demo页面也改好了。

function movePicture(){
    
    $('.banner .content ul').animate({'margin-left':-imgwidth * (index+1)},1000,function(){
        if(index == len){
            $(this).css('margin-left',-imgwidth);
            index = 0;
        }
        if(index == -1){
            $(this).css('margin-left',-imgwidth * len);
            index = len - 1;
        }
    });
}

改正就行了,额,小细节不要在意。。。

banner图这样就差不多了,下一节开始做登陆功能。我先把页面画好,以后页面的绘制我就不介绍得这么详细了,重点还是以Java为主。

免责声明: 博客中所有的图片素材均来自百度搜索,仅供学习交流,如有问题请联系我,侵立删,谢谢。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,198评论 6 514
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,334评论 3 398
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,643评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,495评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,502评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,156评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,743评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,659评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,200评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,282评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,424评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,107评论 5 349
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,789评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,264评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,390评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,798评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,435评论 2 359

推荐阅读更多精彩内容