코드를 작성하기 전에 먼저 렌더링 구조를 분석합니다.
1. 왼쪽 및 오른쪽 방향 버튼을 사용하여 이전 사진과 다음 사진 간에 전환할 수 있습니다.
2. 아래에는 스크롤한 사진을 표시하는 페이징 표시가 있습니다. 물론 해당 버튼을 클릭하여 해당 사진으로 이동할 수도 있습니다.
3. 중앙의 메인 디스플레이 영역은 회전이 필요한 사진을 표시하는 데 사용됩니다.
위 설명에 따르면 먼저 HTML 코드를 작성할 수 있습니다.
1. HTML 코드
<body> <p id="youku"> <p class="anniu"> <span class="zuo"></span> <span class="you"></span> </p> <ul class="tuul"> <li class="no0"><a href="#"><img src="images/0.jpg" /></a></li> <li class="no1"><a href="#"><img src="images/1.jpg" /></a></li> <li class="no2"><a href="#"><img src="images/2.jpg" /></a></li> <li class="no3"><a href="#"><img src="images/3.jpg" /></a></li> <li class="no4"><a href="#"><img src="images/4.jpg" /></a></li> <li class="waiting"><a href="#"><img src="images/5.jpg" /></a></li> <li class="waiting"><a href="#"><img src="images/6.jpg" /></a></li> <li class="waiting"><a href="#"><img src="images/7.jpg" /></a></li> <li class="waiting"><a href="#"><img src="images/8.jpg" /></a></li> </ul> <p class="xiaoyuandian"> <ul> <li></li> <li></li> <li class="cur"></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> </ul> </p> </p> </body>
코드의 내용은 위에서 설명한 내용과 일치하며 여기서 설명해야 할 두 가지 사항이 있습니다.
1. 내부에서 회전해야 하는 li에는 두 가지 주요 클래스가 있습니다. "no" 및 "waiting" 형식으로 패키지됩니다. 여기서 "no" 시리즈는 현재 "active" 상태에 있을 수 있는 그림과 "waiting" 상태를 나타냅니다. "는 해당 사진이 현재 숨겨져 있음을 의미합니다. 다음에는 CSS 코드에 반영됩니다.
2. 페이징 표시기는 기본적으로 세 번째 li의 클래스를 cur로 설정합니다. Tuul에 처음 설정된 "활성" 사진 수는 5개이므로 기본적으로 세 번째 장이 중앙에 표시됩니다. 하지만 초기 상태에서 인터페이스에 표시되는 사진의 수는 3개이므로 두 번째 사진을 중앙에 있는 사진으로 선택하는 것은 어떨까요? 왜냐하면 왼쪽에 있는 버튼을 클릭했을 때 중앙에 두 번째 사진을 표시하도록 선택하면 첫 번째 사진은 볼 수 있지만 첫 번째 사진 앞에는 사진이 없기 때문입니다. 왼쪽 버튼을 클릭하면 "노출"됩니다. 따라서 전반적인 디자인 아이디어는 인터페이스에 세 개의 그림이 표시되고 인터페이스 너머 부분의 왼쪽과 오른쪽에 한 개의 그림이 있지만 볼 수는 없다는 것입니다. 다음 설명에서는 이 구현 과정을 자세히 설명하겠습니다.
2. CSS 코드
<style type="text/css"> *{ padding: 0; margin: 0; } #youku{ width: 1189px; height: 360px; margin: 100px auto; position: relative; overflow: hidden; } #youku ul{ list-style: none; } #youku .tuul li{ position: absolute; background-color: black; } #youku li.waiting{ display: none; } #youku li img{ width: 100%; height: 100%; } #youku .anniu .zuo{ position: absolute; width: 45px; height: 45px; background:url(images/zuo.png) no-repeat; top:100px; left:10px; z-index: 1000; cursor: pointer; } #youku .anniu .you{ position: absolute; width: 45px; height: 45px; background:url(images/you.png) no-repeat; top:100px; right:10px; z-index: 1000; cursor: pointer; } #youku li.no0{width: 174px;height:122px;left:-116px;top:100px;z-index: 777;} #youku li.no1{width: 356px;height:223px;left:0px;top:26px;z-index: 888;} #youku li.no2{width: 642px;height:273px;left:274px;top:0px;z-index: 999;} #youku li.no3{width: 356px;height:223px;left:834px;top:26px;z-index: 888;} #youku li.no4{width: 174px;height:122px;left:1097px;top:100px;z-index: 777;} #youku li.no1 img , #youku li.no3 img{ opacity: 0.3; } #youku .xiaoyuandian{ width: 600px; height: 20px; position: absolute; top: 312px; left: 454px; } #youku .xiaoyuandian ul li{ float: left; width: 16px; height: 16px; background-color: blue; margin-right: 10px; border-radius: 100px; cursor: pointer; } #youku .xiaoyuandian ul li.cur{ background-color:green; } </style>
여기서는 CSS를 하나씩 설명하지 않겠습니다. 더 구체적으로 알고 싶으시면 제가 전에 작성한 JS & JQuery 시리즈를 참고하세요. 두 가지 점:
1. "활성" 이미지의 CSS 설정, 즉 #youku li.no0~no4의 설정에서 no0의 왼쪽 값은 음수이고 no1의 왼쪽 값은 0에서 제가 위에서 표현한 점을 확인하면, 시각 범위의 정적 상태는 3개의 그림을 표시하고 나머지 2개의 그림은 각각 시각 범위의 왼쪽과 오른쪽에 있습니다. 각 그림의 Z-색인 값을 설정하여 3차원적인 계층 구조를 가지도록 주의하세요. 값이 클수록 표시에 더 가까워집니다.
2. 가시 범위 양쪽의 이미지에 대해 불투명도를 설정하여 더 어둡게 만듭니다.
위 CSS 코드를 설정한 후 분석 다이어그램은 다음과 같습니다.
3.JQuery 코드
<script type="text/javascript"> $(document).ready( function() { //定义一个初始速度 var sudu = 600; var shangdi = false; //定义json var json0 = {"width":"174px","height":"122px","left":"-116px", "top":"100px"}; var json1 = {"width":"356px","height":"223px","left":"0px", "top":"26px"}; var json2 = {"width":"642px","height":"273px","left":"274px", "top":"0"}; var json3 = {"width":"356px","height":"223px","left":"834px", "top":"26px"}; var json4 = {"width":"174px","height":"122px","left":"1097px", "top":"100px"}; var nowimg = 2; var timer = setInterval(youanniuyewu,2000); $("#youku").mouseenter( function() { clearInterval(timer); } ); $("#youku").mouseleave( function() { clearInterval(timer); timer = setInterval(youanniuyewu,2000); } ); $(".you").click(youanniuyewu); function youanniuyewu(){ if(!$(".tuul li").is(":animated") || shangdi == true){ if(nowimg < 8){ nowimg ++; }else{ nowimg = 0; } $(".xiaoyuandian li").eq(nowimg).addClass("cur").siblings().removeClass("cur"); //先交换位置 $(".no1").animate(json0,sudu); $(".no2").animate(json1,sudu); $(".no3").animate(json2,sudu); $(".no4").animate(json3,sudu); $(".no0").css(json4); //再交换身份 $(".no0").attr("class","waiting"); $(".no1").attr("class","no0"); $(".no2").attr("class","no1"); $(".no3").attr("class","no2"); $(".no4").attr("class","no3"); //上面的交换身份,把no0搞没了!所以,我们让no1前面那个人改名为no0 if($(".no3").next().length != 0){ //如果no3后面有人,那么改变这个人的姓名为no4 $(".no3").next().attr("class","no4"); }else{ //no3前面没人,那么改变此时队列最开头的那个人的名字为no0 $(".tuul li:first").attr("class","no4"); } //发现写完上面的程序之后,no6的行内样式还是json0的位置,所以强制: $(".no4").css(json4); } } $(".zuo").click( function(){ if(!$(".tuul li").is(":animated") || shangdi == true){ if(nowimg > 0){ nowimg --; }else{ nowimg = 8; } $(".xiaoyuandian li").eq(nowimg).addClass("cur").siblings().removeClass("cur"); //先交换位置: $(".no0").animate(json1,sudu); $(".no1").animate(json2,sudu); $(".no2").animate(json3,sudu); $(".no3").animate(json4,sudu); $(".no4").css(json0); //再交换身份 $(".no4").attr("class","waiting"); $(".no3").attr("class","no4"); $(".no2").attr("class","no3"); $(".no1").attr("class","no2"); $(".no0").attr("class","no1"); //上面的交换身份,把no0搞没了!所以,我们让no1前面那个人改名为no0 if($(".no1").prev().length != 0){ //如果no1前面有人,那么改变这个人的姓名为no0 $(".no1").prev().attr("class","no0"); }else{ //no1前面没人,那么改变此时队列最后的那个人的名字为no0 $(".tuul li:last").attr("class","no0"); } $(".no0").css(json0); } } ); $("#youku .xiaoyuandian li").click( function(){ sudu = 100; //临时把这个速度变化一下 shangdi = true; //flag var yonghuandexuhao = $(this).index(); if(yonghuandexuhao > nowimg ){ var cishu = yonghuandexuhao - nowimg; console.log("主人,我已经通知上帝帮你按右按钮" + cishu + "次"); for(var i = 1 ; i<= cishu ; i++){ $(".you").trigger("click"); //让上帝帮你按一次又按钮 } }else{ var cishu = nowimg - yonghuandexuhao; console.log("主人,我已经通知上帝帮你按左按钮" + cishu + "次"); for(var i = 1 ; i<= cishu ; i++){ $(".zuo").trigger("click"); //让上帝帮你按一次又按钮 } } nowimg = yonghuandexuhao; sudu = 600; //再把速度恢复 shangdi = false; } ); } ); </script>
여기에서는 JQuery 코드에서 타이머 제어 및 페이징 버튼 클릭을 소개하지 않습니다. 느낌에 관심이 있으시면 JS & JQuery의 내용을 참조하세요.
여기에서는 주로 두 가지 사항을 설명합니다.
1. json0, json1, json2, json3, json4 데이터의 정의는 CSS의 위 정의와 일치하며 그 목적은 각 이미지의 절대 위치를 편리하게 전환하는 것입니다. .아래에서 자세히 소개하겠습니다.
2. Youanniuyewu 방식인 오른쪽 버튼 클릭 이벤트를 중심으로 설명합니다.
2-1) nowImg 인덱스의 간단한 처리:
if(nowimg < 8){ nowimg ++; }else{ nowimg = 0; }
마지막 인덱스가 아닌 경우 "오른쪽 버튼"을 클릭하면 nowImg 값이 1만큼 증가합니다. 마지막 인덱스인 경우 nowImg는 다음부터 시작됩니다. 0.
2-2) 페이징 표시기 처리와 관련하여 "오른쪽 버튼"을 클릭합니다.
$(".xiaoyuandian li").eq(nowimg).addClass("cur").siblings().removeClass("cur");
현재 표시된 그림에 해당하는 표시기 버튼을 강조 표시하면 형제 노드가 정상적으로 표시됩니다.
2-3) 사진 위치 바꾸기:
//先交换位置 $(".no1").animate(json0,sudu); $(".no2").animate(json1,sudu); $(".no3").animate(json2,sudu); $(".no4").animate(json3,sudu); $(".no0").css(json4);
처음 네 문장은 사진을 움직이는 효과에 애니메이션을 적용합니다. 정적 상태에서는 세 개의 그림이 우리 눈앞에 표시되고, 움직일 때는 위의 네 문장의 코드를 실행하는 동안 최대 네 개의 그림이 우리 눈앞에 표시되는 것을 상상할 수 있습니다.
즉, 애니메이션이 실행되는 동안 "no1" 그림이 점차 화면의 가시 범위를 벗어나는 동시에 "no4" 그림이 점차 화면의 가시 범위 내에 표시됩니다. 화면.
而在动画执行的过程中,"no0" 的这张图片早就定位到 "no4" 的位置(此时在可视范围之外,因为这里的animate动画是异步执行的,不会延迟$(.no0).css(json4)这句代码的执行。当这一组代码执行完毕后,剖析图如下:
此时,我们再将那些 处于 "waiting" 状态的图片考虑进来,则此时的剖析图如下:
2-4)以上流程执行完毕后,是完成了一次轮播效果,但是此时各个图片的牌号顺序已经被打乱,为了使得轮播继续下去,我们应该将牌号再 "恢复" 过来。所以我们可以添加以下代码:
//再交换身份 $(".no0").attr("class","waiting"); $(".no1").attr("class","no0"); $(".no2").attr("class","no1"); $(".no3").attr("class","no2"); $(".no4").attr("class","no3");
上面的代码执行后,意味着将 上图中 "no0" 这张图片拉入到 "waiting" 区域,而其他四个的编号则依次往前推算。执行完毕后,剖析图如下:
正如上图所示,"活跃"状态的5张图片,最后一张现在也变成了 "waiting" 状态,所以需要有人替补上去,才能继续动画的执行。很显然,应该拿 "waiting" 列表的第一张,也就是 "活跃" 状态的后面一张图片 "顶替" 上去;如果后面没有 "waiting" 状态的图片了, 说明这些 "waiting" 状态的图片全部 "跑到" class 为 tuul所有列表的前面去了,那就抓取这些列表的第一张作为 "顶替者"。代码如下:
if($(".no3").next().length != 0){ //如果no3后面有人,那么改变这个人的姓名为no4 $(".no3").next().attr("class","no4"); }else{ //no3前面没人,那么改变此时队列最开头的那个人的名字为no0 $(".tuul li:first").attr("class","no4"); } //发现写完上面的程序之后,no6的行内样式还是json0的位置,所以强制: $(".no4").css(json4);
这里需要注意的是:虽然已经经历了很多步奏的位置信息的改变及牌号的改变,但是刚刚被拉入等待区域的那张图片在li中的与兄弟节点的位置关系并没有发生改变,只是class属性变成了 "waiting". 即此时的tuul中li的代码结构如下:
<ul class="tuul"> <li class="waiting"><a href="#"><img src="images/0.jpg" /></a></li> <li class="no0"><a href="#"><img src="images/1.jpg" /></a></li> <li class="no1"><a href="#"><img src="images/2.jpg" /></a></li> <li class="no2"><a href="#"><img src="images/3.jpg" /></a></li> <li class="no3"><a href="#"><img src="images/4.jpg" /></a></li> <li class="no4"><a href="#"><img src="images/5.jpg" /></a></li> <li class="waiting"><a href="#"><img src="images/6.jpg" /></a></li> <li class="waiting"><a href="#"><img src="images/7.jpg" /></a></li> <li class="waiting"><a href="#"><img src="images/8.jpg" /></a></li> </ul>
执行完以上代码后,剖析图如下:
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
위 내용은 jquery는 이미지 광고 회전 특수 효과를 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!