1. 程式人生 > >2017.1.08用bootstrap構造響應式輪播圖

2017.1.08用bootstrap構造響應式輪播圖

要求:利用bootstrap中的carousel外掛建立一個響應式輪播圖,輪播圖要求是:1、當螢幕為大螢幕時讓輪播圖中的圖片大小為2000px*410px大小,當螢幕寬度小於768px時,輪播圖中的圖片大小為640px*340px;2:當螢幕為小螢幕時,:螢幕進行縮放時,高度並不固定,高度能隨著水平縮放進行縮放;3:當瀏覽器是手機模式時,是輪播圖能夠跟隨使用者手指的觸控進行滑動

知識點:

1、手機觸控事件touch

觸控事件會在使用者將手指放在螢幕上、或者在螢幕上滑動、以及手指離開螢幕時開始

touchstart事件:當手指放在螢幕上觸發,當手指已經放在螢幕上時也會觸發。

touchmove事件:當手指在螢幕上滑動觸發,在這個事件發生期間,呼叫preventDefault()事件可以阻止滾動。

touchend事件:當手指離開螢幕時觸發

touches:表示當前跟蹤的觸控操作的touch物件的陣列。

targetTouches:特定於事件目標的Touch物件的陣列。

changeTouches:表示自上次觸控以來發生了什麼改變的Touch物件的陣列。

每個Touch物件包含的屬性如下。

clientX:觸控目標在視口中的x座標。

clientY:觸控目標在視口中的y座標。

identifier:標識觸控的唯一ID。

pageX:觸控目標在頁面中的x座標。

pageY:觸控目標在頁面中的y座標。

screenX:觸控目標在螢幕中的x座標。

screenY:觸控目標在螢幕中的y座標。

target:觸控的DOM節點目標。


2.輪播圖可以通過js來除錯

例如:$(".carousel").carousel();

$(".carousel").carousel("next")輪播迴圈播放到下一張圖片;

$(".carousel").carousel("prev")輪播迴圈播放到上一張圖片

HTML程式碼:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
    <title></title>
<meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
    <title></title>
    <link rel="stylesheet" href="lib/bootstrap/css/bootstrap.css">
</head>
<style>
.carousel .carousel-inner .item{
background-repeat: no-repeat;
background-position: center center;
background-size: cover;

}
.carousel .carousel-inner .item{
  width: 100%;
}
/*當螢幕為大螢幕時,將輪播的項高度設為410px,則螢幕為小螢幕時由圖片撐起輪播項高度*/
@media (min-width: 768px){
  .carousel .carousel-inner .item{
    height: 410px;
  }
}
</style>
<body>
  <section id="slider" class="carousel slide" data-ride="carousel">
<!-- Indicators -->
<ol class="carousel-indicators">
<li data-target="#slider" data-slide-to="0" class="active"></li>
<li data-target="#slider" data-slide-to="1"></li>
<li data-target="#slider" data-slide-to="2"></li>
<li data-target="#slider" data-slide-to="3"></li>
</ol>

<!-- Wrapper for slides -->
<div class="carousel-inner" role="listbox">
<!-- 根據螢幕的寬度設定輪播圖中圖片的大小,當圖片為大螢幕時設定輪播圖的圖片為img-lg的圖片,圖片為小螢幕時設定輪播圖的圖片為img-xs的圖片 -->
<div class="item active" data-img-lg="img/slide_01_2000x410.jpg" data-img-xs="img/slide_01_640x340.jpg">
</div> 
<div class="item" data-img-lg="img/slide_02_2000x410.jpg" data-img-xs="img/slide_02_640x340.jpg">
</div>
<div class="item" data-img-lg="img/slide_03_2000x410.jpg" data-img-xs="img/slide_03_640x340.jpg">
</div>
<div class="item" data-img-lg="img/slide_04_2000x410.jpg" data-img-xs="img/slide_04_640x340.jpg">
</div>
</div>

<!-- Controls -->
<a class="left carousel-control" href="#slider" role="button" data-slide="prev">
<span class="glyphicon glyphicon-chevron-left"></span>
<span class="sr-only">Previous</span>
</a>
<a class="right carousel-control" href="#slider" role="button" data-slide="next">
<span class="glyphicon glyphicon-chevron-right"></span>
<span class="sr-only">Next</span>
</a>
</section>
<script src="lib/jquery/jquery.js"></script>
<script src="lib/bootstrap/js/bootstrap.js"></script>
<script src="js/my.js"></script>
</body>
</html>


Js程式碼:

$(function() {
	function resize() {
		//獲取螢幕寬度
		var windowWidth = $(window).width();
		//判斷當前螢幕是大螢幕還是小螢幕
		var isSmallWidth = windowWidth < 768;
		//遍歷輪播圖中每一項		
		$(".carousel-inner>.item").each(function(i, item) {
                        //需要將DOM物件轉化為jqurey物件,才能呼叫jquery方法
			var $item = $(item);
			//根據螢幕寬度給輪播圖中的背景圖片設定為大圖片或是小圖片
			var imgUrl = isSmallWidth ? $item.data("img-xs") : $item.data("img-lg");
			$item.css('backgroundImage', 'url("' + imgUrl + '")');
			//當螢幕為小螢幕時,給輪播圖加上圖片項,使其能夠進行等比例縮放
			if (isSmallWidth) {
				$item.html("<img src='" + imgUrl + "'>");
			}
			//否則清除輪播圖中的圖片內容,以免出現圖片重疊
			else {
				$item.empty();
			}
		})
	}
	//觸發resize事件
	$(window).on("resize", resize)
		.trigger("resize");

	//當瀏覽器為手機螢幕時,加上手指滑動輪播圖的效果
	//首先,根據手指觸控的輪播圖的位置的到使用者手指的起始座標
	var $carousel=$(".carousel");
	var startClientX=0;
	var clientX=30;
	$carousel.on("touchstart",function(e){
	 startClientX=e.originalEvent.touches[0].clientX;
	})

	$carousel.on("touchmove",function(e){
		//然後的得到使用者移動後的座標
		var targetClientX=e.originalEvent.touches[0].clientX;
		//判斷使用者移動的距離是否超過了閾值
		var target=Math.abs(targetClientX-startClientX);
		if(target>clientX){
			//然後,根據使用者移動的方向判斷使用者是左滑動還是右滑動,根據左右方向觸發左右滑動
			$(".carousel").carousel(targetClientX-startClientX>0?"prev":"next");

		}

	})