移動端和網頁端公告欄文字左右輪播滑動
效果:一進入頁面,文字從右向左滑動,第一段文字滑到左端消失後,第二段才開始出現,就這樣飄飄飄,最後一個在左端消失後,第一段接著來。
思路:
css樣式—外面有個固定的框框,需要輪播的文字寫在ul>li裡面,ul設定相對它的父級定位並且有固定寬高,li設定外邊距。
js部分—改變ul相對父級的left值,視覺上是文字在滑動,其實是ul的left值改變,定好速度值和最大left值,設定計時器,裡面的num值自增,達到最大left值後,num=0,目的是讓left值從0開始重複剛才改變。
下面是案例:
可以複製到自己的編輯器執行看效果
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>滾動幅</title>
<style type="text/css">
* {
margin: 0;
padding: 0;
text-decoration: none;
}
li{
list-style : none;
}
#container {
position: relative;
width: 600px;
height: 400px;
border: 1px solid #333;
overflow: hidden;
margin: 0 auto;
}
#list {
position: absolute;
left: 0;
width: 20000px;
height: 200px;
color: #000;
font-size: 30px;
font-weight: bold;
display:flex;
}
#list li{
margin-left: 600px;
}
</style>
</head>
<body>
<div id="container">
<ul id="list">
<li>瀏覽器相容問題及解決方法彙總</li>
<li>入門級---Vue腳手架(vue-cli)搭建過程---詳版</li>
<li>js基礎知識總結整理</li>
</ul>
</div>
</body>
</html>
先寫個沒有束縛的純純的原生js:
<script type="text/javascript">
window.onload = function() { //要加上這段、頁面載入自動執行
var list = document.getElementById('list');
var aLi = document.getElementsByTagName('li');
/*設定以下變數*/
var n = list.getElementsByTagName('li').length; //獲取ul下面li的個數(用來求所有margin)
var newLeft = 0; //改變ul的left的值
var speed = 1; //設定的速度引數
var s = 0; //讀取li的寬總和
var num = 0; //計時器中的num自增變數
for(var i=0;i<aLi.length;i++){
s += parseInt(aLi[i].offsetWidth); //offsetWidth讀取的是內容高度+內邊距+邊寬(不包含外間距margin)
}
var total = s + n*600; //獲取到的所有li的寬的總和再加上他們的margin
/*計時器修改left的值*/
var timer = setInterval(function () {
newLeft = -speed*num;
num++;
/*達到設定的total值之後,num=0,newLeft繼續從0開始*/
if(num >= total){
num = 0;
}
list.style.left = newLeft + 'px';
}, 1)
}
</script>
下面是用jquery:
引入jquery:<script src="js/jquery-3.1.0.min.js" type="text/javascript"></script>
變數和上面是一樣的,不用獲取li的個數n,比較起來程式碼量少了一點
<script type="text/javascript">
$(function(){
var num = 0;
var newLeft = 0;
var speed = 1;
var s=0;
$("#list li").each(function(){
s += $(this).outerWidth(true); //outerWidth(true)就直接獲取了元素寬、內填充、邊框、外邊距
});
var timer = setInterval(function(){
newLeft = -speed*num;
if( num >= s ) {
num = 0;
}
num++;
$('#list').css({'left':newLeft+'px'})
},10)
}
</script>
最近移動端用vue寫專案用到這個,於是就出現了一些小問題:
1.滾動的內容是寫在li
裡面的,這個是要在介面獲得的data
,再渲染到頁面。介面寫在created
裡面,js程式碼寫在mounted
但是讀取不到ul>li
的內容,因此寬度獲取失敗。
原因是鉤子函式的載入方式,只要改下js程式碼的位置寫在updated
裡面就可以解決這個問題。
2.由於移動端頁面寬度是自適應的,頁面寬度是7.5rem
,設定每個li
的margin-left
自然也是7.5rem
,那麼問題來了–newLeft的值是用rem
還是px
?
答案依然是px,
一開始我多慮寫成了這樣$('#list').css({'left':newLeft+'rem'})
,這裡的newLeft
是乘以0.01
的,其實這樣也有效果,就是覺得程式碼怪怪的,事實上沒必要直接px
就好,因為我們顯示屏解析度以px
畫素為單位,即使用了rem
螢幕也會轉為px
。
3.關於ul 設定的width: 20000px; 必須設定寬度,
li的內容不確定,我是設定了足夠大的寬,為了裝下滾動的內容,這個辦法有點low,你們有更好的嘗試也可以,總之不影響效果。。
flex
4.還有我用的是佈局,推薦用,也可以給
li設定
float` ,記得清浮動就好。