原生Js的三個demo
-
輪播圖(左右輪播)
1.實現功能:
- 滑鼠不在圖片上方時進行自動輪播,並且箭頭不會顯示,當滑鼠放在圖片上方時停止輪播,並箭頭會顯示;
- 圖片切換之後圖片中下方的小圓點會同時進行切換,並且點選相應的小圓點可以切換到相應的圖片上
- 點選左右箭頭可以進行左右圖片的切換
2. 基本原理:
將多個圖片並排成一行,包含在兩個盒子中,第一層盒子寬和高與圖片的一致,並用overflow:hidden控制只顯示一張圖片;第二個盒子高度與圖片一致,而寬度須足夠容納下全部圖片;通過設定第二個盒子的偏移量進而改變顯示的圖片;另一方面對於無限輪播,顯示N張圖片實際上為N+2圖片,第一張圖片前面還有最後一張圖片而最後一張圖片後面還有第一張圖片。
3.程式碼實現:
html佈局:
<div class="container">
<div class="img-lists" style="left: -500px;">
![](img/webwxgetmsgimg.jpg)
![](img/demo1.jpg)
![](img/webwxgetmsgimg%20(1).jpg)
![](img/webwxgetmsgimg%20(2).jpg)
![](img/webwxgetmsgimg.jpg)
![](img/demo1.jpg)
</div>
<div class="btns">
<span index = '1' class="on"></span>
<span index = '2'></span>
<span index = '3'></span>
<span index = '4'></span>
</div>
<a href="javascript:;" class="arrow prev"><</a>
<a href="javascript:;" class="arrow next">></a>
</div>
css樣式表:
.container{
width: 500px;
height: 300px;
margin: 0 auto;
overflow: hidden;
position: relative;
}
.img-lists{
width: 4000px;
height: 300px;
position: absolute;
}
img{
width: 500px;
height: 300px;
float: left;
z-index: 1;
}
.btns{
z-index: 2;
position: absolute;
left:45%;
bottom: 20px;
}
.btns span{
width: 10px;
height: 10px;
border-radius: 50%;
background-color: #aaaaaa;
float: left;
margin-left: 4px;
}
.btns .on{
background-color: floralwhite;
}
.arrow{
width: 45px;
font-size: 45px;
color: white;
text-align: center;
display: none;
position: absolute;
top:40%;
background-color: rgba(128,128,128,0.7);
}
.container:hover .arrow{
display: block;
}
Js操作:
//自動播放
function autoPlay() {
timer = setInterval(function () {
getLeft(-500);
changeIndex(true);
}, 1000);
}
//計算偏移量
function getLeft(offset) {
var list = document.getElementsByClassName("img-lists")[0];
var newLeft = parseInt(list.style.left) + offset;
var time = 300;
var interval = 10;
var speed = offset/(time/interval);
animated = true;
//實現動畫效果
function go() {
if((speed<0&&parseInt(list.style.left)>newLeft)||(speed>0&&parseInt(list.style.left)<newLeft)){
list.style.left = parseInt(list.style.left) + speed + 'px';
setTimeout(go,interval);
}
else {
animated = false;
list.style.left = newLeft + 'px' ;
if (newLeft < -2000) {
list.style.left = -500 + "px";
}
if (newLeft > -500) {
list.style.left = -2000 + 'px';
}
}
}
go();
}
//更改小圓點的狀態
function changeIndex(action) {
if (action) {
index++;
}
else {
index--;
}
if (index === 4) {
index = 1;
}
if (index === 1) {
index = 4;
}
activeBtn();
}
function activeBtn() {
var btns = document.getElementsByTagName("span");
var len = btns.length;
for (var i = 0; i < len; i++) {
btns[i].className = "";
}
for (var i = 0; i < len; i++) {
if (index === parseInt(btns[i].getAttribute("index"))) {
btns[i].className = "on";
}
}
}
/**停止播放/
function stopPlay() {
clearInterval(timer);
}
function eventBind() {
var container = document.getElementsByClassName("container")[0];
var list = document.getElementsByClassName("img-lists")[0];
var btns = document.getElementsByTagName("span");
var prev = document.getElementsByClassName("prev")[0];
var next = document.getElementsByClassName("next")[0];
/*實現自動功能1*/
container.onmousemove = stopPlay;
container.onmouseout = autoPlay;
/*實現功能2*/
var len = btns.length;
for (var i = 0; i < len; i++) {
(function (i) {
btns[i].onclick = function () {
var ind = btns[i].getAttribute("index");
getLeft(-500 * (ind - index));
index = parseInt(ind);
activeBtn();
};
})(i);
}
/*實現功能3*/
next.onclick = function () {
changeIndex(true);
if (!animated){
getLeft(-500);
}
};
prev.onclick = function () {
changeIndex(false);
if (!animated){
getLeft(500);
}
};
}
-
回到頂部
1.實現功能:
點選按鈕之後可以由快到慢地回到頂部
2.基本原理:
通過scrollTop值以一定規律的設定進而實現回到頂部,接著對scrollTop的值與clientHeight進行比較判斷按鈕出現的時刻
1.程式碼實現:
整個背景我使用的是圖片
html:
<div class="container">
![](img/demo2.jpg)
</div>
<div class="btn" style="display: none;"></div>
css:
.container {
width: 1190px;
margin: 0 auto;
}
.btn{
width: 40px;
height: 40px;
position: fixed;
left:50%;
margin-left: 610px;
bottom: 30px;
background: url("img/demo2-btn.jpg") no-repeat left top;
}
.btn:hover{
background: url("img/demo2-btn.jpg") no-repeat left top -40px;
}
Js:
function goUp() {
var btn = document.getElementsByClassName("btn")[0];
var isTop = true;
var timer;
window.onscroll = function () {
btnStatue();
if (!isTop) {
clearInterval(timer);
}
isTop = false;
};
btn.onclick = function () {
var sTop = document.documentElement.scrollTop || document.body.scrollTop;
timer = setInterval(function () {
isTop = true;
sTop = document.documentElement.scrollTop || document.body.scrollTop;
if (sTop > 0) {
var speed = Math.floor(-sTop / 6);
document.documentElement.scrollTop = document.body.scrollTop = sTop + speed;
}
if (sTop === 0) {
clearInterval(timer);
}
}, 50);
};
}
function btnStatue() {
var btn = document.getElementsByClassName("btn")[0];
var scroll = document.documentElement.scrollTop || document.body.scrollTop;
var clientHeight = document.documentElement.clientHeight;
if (scroll >=clientHeight) {
console.log(222);
btn.style.display = "block";
}
else {
btn.style.display = "none";
}
}
-
瀑布流佈局
1.實現功能:
多個等寬的圖片進行穿插排序,並且在最後一張圖片之後再進行下拉時能夠在進行載入其他圖片
2.基本原理:
進行佈局時可以分為兩部分:
- 第一部分:圖片的排序;首先是在設定每個圖片之間的距離時應使用padding,這樣一來便可以通過offsetHeight/Width獲取到圖片到頁面頂部以及到頁面左邊的距離;接著接著計算出整個頁面中可放置的列數N,設定最大盒子的寬度,保證在縮小頁面的時候列數不會改變;最後將每一列的高度放置在陣列中,接下來的圖片應放置在高度總共最小的那一列,使用position進行位置的設定,並更新先前的陣列;
- 第二部分:載入新圖片;(在我的程式碼中我將即將載入的圖片存在一個變數中進行引入)主要為建立與原先結構相同的結點,通過appendChild()將每一個圖片引入原有的html中
3.程式碼實現:
html
<div class = "container">
<div class="box">
<div class="pic">
![](img/5.jpg)
</div>
</div>
......//多個BOX
</div>
css
*{
margin: 0;
padding: 0;
}
#container{
position: relative;
}
.box{
padding: 15px 0 0 15px;
float: left;
}
.pic{
padding: 10px;
border: 1px solid #333333;
border-radius: 5px;
box-shadow:0px 0px 5px #aaaaaa;
}
.pic img{
width: 235px;
height: auto;
}
js
//第一部分的實現
function waterFall(parent, box) {
var oParent = document.getElementById(parent);
var oBox = getByClass(oParent, box);//獲取parent下的所有樣式名為box的元素
var cols = Math.floor(document.documentElement.clientWidth / oBox[0].offsetWidth);
oParent.style.cssText = "width:" + cols * oBox[0].offsetWidth + "px;margin:0 auto";
var hArr = [];
for (var i = 0; i < oBox.length; i++) {
if (i < cols) {
hArr.push(oBox[i].offsetHeight);
}
else {
var hMin = Math.min.apply(null, hArr);
var index = getIndex(hArr, hMin);
oBox[i].style.position = "absolute";
oBox[i].style.top = hMin + 'px';
oBox[i].style.left = index * oBox[i].offsetWidth + "px";
hArr[index] += oBox[i].offsetHeight;
}
}
}
//第二部分
var dataInt = {"data": [{"src": "1.jpg"}, {"src": "2.jpg"}, {"src": "3.jpg"}]};
window.onscroll = function () {
if (checkScrollSlide) {
console.log(1111111);
var container = document.getElementById("container");
for (var i = 0; i < dataInt.data.length; i++) {
var box = document.createElement("div");
box.className = "box";
container.appendChild(box);
var pic = document.createElement("div");
pic.className = "pic";
box.appendChild(pic);
var img = document.createElement("img");
img.src = "img/" + dataInt.data[i].src;
pic.appendChild(img);
}
waterFall('container', 'box');
}
}
-
總結體會:
通過本次的學習讓我發現了對js的DOM操作的不熟悉,同時也學到了更多對於動畫效果實現的技巧(相對動畫的形式進行改變時可以對資料的變化進行一定的控制,使動畫在過渡時捕獲那麼生硬);在自己寫程式碼的時候也遇到了不少的問題積累了經驗(a標籤中herf設定為javascript:;可以阻止頁面的預設行為)
相關文章
- flutter demo (三):json處理FlutterJSON
- 實現一個requirejs原型demoUIJS原型
- 通過三個DEMO學會SignalR的三種實現方式SignalR
- WPF所有原生空間使用demo
- 初識 Three.js:第一個小 demoJS
- JSON的三個未知特性JSON
- JsonWebToken Demo(轉)JSONWeb
- 原生 js 實現一個前端路由 routerJS前端路由
- JS中的觀察者模式DEMOJS模式
- 使用原生JS開發一個搶紅包的小遊戲JS遊戲
- 原生js的三座大山之原型和原型鏈(1)JS原型
- js建立陣列的三個方式JS陣列
- 歸併排序 js demo排序JS
- JStorm Storm 上手demoJSORM
- D3.js 的基本用法外加一個略調皮的demoJS
- 原生 JS 實現一個瀑布流外掛JS
- 原生js三級導航選單實現詳解JS
- 一個clean框架的demo框架
- 仿PS的JS調色盤DemoJS
- Vue.js SSR Step by Step (2) – 一個簡單的同構DEMOVue.js
- Vue.js SSR Step by Step (2) - 一個簡單的同構DEMOVue.js
- 原生js實現一個DIV的碰撞反彈運動JS
- 原生js的常用方法整理JS
- android資料庫的簡單Demo(原生版+Google版)Android資料庫Go
- 初識react(二) 實現一個簡版的html+redux.js的demoReactHTMLReduxJS
- Node.js學習之(第三章:簡易小demo)Node.js
- 原生js 判斷變數是一個陣列JS變數陣列
- 用原生js封裝一個ajax請求方法JS封裝
- 原生APP優於H5網頁APP的三個方面APPH5網頁
- 分享幾個寫 demo 的思路
- 一個RPC的demo(good)RPCGo
- 關於Sqlite的一個demoSQLite
- EggJS 雲原生應用硬核實戰(Kubernetes+Traefik+Helm+Prometheus+Grafana),提供 DemoJSPrometheusGrafana
- 原生JS拖拽效果JS
- JS原生互動JS
- JS原生練習JS
- 原生JS 操作 DOMJS
- 原生JS DOM方法JS