WebAPI[四]

PC端网页特效

元素偏移量offset系列

offset翻译过来就是偏移量,使用offset系列相关属性可以动态的得到该元素的位置(偏移)、大小等。

  • 获得元素距离带有定位父元素的位置
  • 获得元素自身的大小(宽度高度)
  • 注意:返回的数值都不带单位

offset系列属性

offset系列属性作用
element.offsetParent返回作为该元素带有定位的父级元素,如果父级都没有定位则返回body
element.offsetTop返回元素相对带有定位父元素上方的偏移
element.offsetLeft返回元素相对带有定位父元素左边框的偏移
element.offsetWidth返回自身包括padding 、边框、内容区的宽度,返回数值不带单位
element.offsetHeight返回自身包括padding、边框、内容区的高度,返回数值不带单位

offset与style的区别

offsetstyle
offset可以得到任意样式表中的样式值style只能得到行内样式表中的样式值
offset 系列获得的数值是没有单位的style.width获得的是带有单位的字符串
offsetWidth包含padding+border+widthstyle.width获得不包含padding和border的值
offsetWidth等属性是只读属性,只能获取不能赋值style.width是可读写属性,可以获取也可以赋值
想要获取元素大小位置,用offset更合适想要给元素更改值,则需要用style改变
<style>
    .box {
        width: 200px;
        height: 200px;
        background-color: pink;
    }
</style>
<body>
    <div class="box"></div>
    <script>
        var box = document.querySelector('.box');
        console.log(box.offsetWidth); // 200 offset可以得到任意样式表中的样式值,得到的是数字型的,没有单位
        console.log(box.style.width); // 空 style只能得到行内样式表中的样式值,得到的是字符串型的,有单位
    </script>
</body>

元素可视区client系列

client翻译过来就是客户端,使用client系列的相关属性来获取元素可视区的相关信息。通过client系列的相关属性可以动态的得到该元素的边框大小、元素大小等。

client系列属性

client系列属性作用
element.clientTop返回元素上边框的大小
element.clientLeft返回元素左边框的大小
element.clientWidth返回自身包括padding、内容区的宽度,不含边框,返回数值不带单位
element.clientHeight返回自身包括padding、内容区的高度,不含边框,返回数值不带单位
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div {
            width: 200px;
            height: 200px;
            background-color: pink;
            border: 1px solid red;
            padding: 10px;
        }
    </style>
</head>

<body>
    <div></div>
    <script>
        var div = document.querySelector('div');
        console.log(div.clientWidth); //220 不包含边框!!!
    </script>
</body>

淘宝flexible.js文件的分析

立即执行函数

淘宝flexible.js文件里面有这样一个函数

(function flexible(window, document) {}(window, document))
  • 这是一个立即执行函数,淘宝所有的js代码都写在这个立即执行函数中,一引入这个js文件就立即执行。
  • 立即执行函数最大的作用就是独立创建了一个作用域,立马所有的变量都是局部变量,如果还引入了其他的js文件,也不会和本js文件出现变量名冲突的问题。
<script>
    // 普通函数
    function fn() {
        console.log(1);
    }
    // 立即执行函数:不需要调用,立马能够自己执行的函数
    // 写法1   (function(形参){})(实参)
    // 写法2   (function(){}())   
    // 1.
    (function(a, b) {
        console.log(a + b); //3

    })(1, 2); // 多个立即函数之间需要用分号隔开
    // 2.
    (function(a, b) {
        console.log(a + b); //6

    }(2, 3));
    // 其中的匿名函数可以改为非匿名函数
    (function sum(a, b) {
        console.log(a + b); //6

    }(2, 3));
    // 3. 立即执行函数最大的作用就是独立创建了一个作用域,里面所有的变量都是局部变量,作用域之间不会有命名冲突的情况
</script>
window.devicePixelRatio像素比
  • 设备像素比返回了设备上的物理像素和当前设备CSS像素的一个比值, 这个数值告诉浏览器多少屏幕实际的像素点被用来画了一个CSS像素点。
  • window.devicePixelRatio = 物理像素 / css像素
<body>
    <script>
        console.log(window.devicePixelRatio); // 在ip6/7/8中打印2 在pc端打印1
    </script>
</body>
pageshow

下面三种情况都会刷新页面都会触发load事件。

  • a标签的超链接
  • F5或者刷新按钮(强制刷新)
  • 前进后退按钮

但是火狐中,有个特点,有个“往返缓存”,这个缓存中不仅保存着页面数据,还保存了DOM和JavaScript的状态;实际上是将整个页面都保存在了内存里。
所以此时后退按钮不能刷新页面。
此时可以使用pageshow事件来触发。这个事件在页面显示时触发,无论页面是否来自缓存。
在重新加载页面中,pageshow会在load事件触发后触发;根据事件对象中的persisted来判断是否是缓存中的页面触发的pageshow事件,注意这个事件给window添加

综上:在火狐浏览器中,前进和后退按钮,并不能重新加载页面

pageshow 是重新加载页面触发的事件

<body>
    <script>
        // 1
        // 非火狐浏览器:点击连接之后,按返回键回到当前页面触发load事件,当前页面会重新加载,弹出11。但是在火狐浏览器中有往返换成,点击前进后退之后不会触发load,页面不会重新加载,不会弹出11
        // window.addEventListener('load', function() {
        //     alert(11);
        // })
        // 2 解决方案pageshow
        window.addEventListener('pageshow', function(e) { // pageshow在页面显示时触发
            alert(11);
            console.log(e.persisted); // false   说明不是缓存中的页面触发了该事件
        })
    </script>
    <a href="http://www.baidu.com">连接</a>
</body>

元素滚动scroll

scroll翻译过来就是滚动的,我们使用scroll系列的相关属性可以动态的得到该元素的大小、滚动距离等。

scroll系列属性作用
element.scrollTop返回被卷去的上侧距离,返回数值不带单位
element.scrollLeft返回被卷去的左侧距离,返回数值不带单位
element.scrollWidth返回自身实际的宽度,不含边框,返回数值不带单位
element.scrollHeight返回自身实际的高度,不含边框,返回数值不带单位

scrollHeight和scrollWidth

在这里插入图片描述

<style>
    div {
        width: 200px;
        height: 200px;
        background-color: pink;
        border: 1px solid red;
        padding: 10px;
    }
</style>

情况1

<body>
    <div>
        我是内容
    </div>
    <script>
        var div = document.querySelector('div');
        console.log(div.scrollHeight); // 220  不含边框
        console.log(div.clientHeight);// 220 不含边框
    </script>
</body>

情况2

<body>
    <div>
        我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容
    </div>
    <script>
        var div = document.querySelector('div');
        console.log(div.scrollHeight); // 279  不含边框  scroll得到的是内容的高度
        console.log(div.clientHeight); // 220  不含边框
    </script>
</body>

在这里插入图片描述

scrollTop和scrollLeft

在这里插入图片描述

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div {
            width: 200px;
            height: 200px;
            background-color: pink;
            border: 1px solid red;
            padding: 10px;
            overflow: auto;
            /*根据内容的多少自动添加滚动条*/
        }
    </style>
</head>

<body>
    <div>
        我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容
    </div>
    <script>
        // scroll滚动事件,当拉动滚动条会触发的事件
        div.addEventListener('scroll', function() {
            console.log(div.scrollTop);// 拖动滚动条的时候,不断打印高度

        })
    </script>
</body>

页面被卷去的头部兼容性问题解决方案

需要注意的是,页面被卷去的头部,有兼容性问题,因此被卷去的头部通常有如下几种写法∶

  1. 声明了DTD,使用document.documentElement.scrollTop
  2. 未声明DTD,使用document.body.scrollTop
  3. 新方法window.pageroffset 和window.pagexoffset,IE9开始支持

DTD是指<!DOCTYPE html>
兼容性方案

function getscroll(){
return {
	left: window.pageXoffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0,
	top: window.pageYoffset || document.documentElement.scrollrop || document.body.scrollrop || 0
};
// 使用的时候getscroll().left

三大系列总结

三大系列大小对比作用
element.offsetWidth返回自身包括padding 、边框、内容区的宽度,返回数值不带单位
element.clientWidth返回自身包括padding、内容区的宽度,不含边框,返回数值不带单位
element.scrollWidth返回自身实际的宽度,不含边框,返回数值不带单位

在这里插入图片描述

他们主要用法︰

  • offset系列经常用于获得元素位置offsetLeft、offsetTop
  • client经常用于获取元素大小clientWidth、clientHeight
  • scroll经常用于获取滚动距离scrollTop、scrollLeft
  • 注意,页面滚动的距离通过window.pageXOffset获得

mouseenter和mouseover的区别

当鼠标移动到元素上时就会触发mouseenter事件类似 mouseover,它们两者之间的差别是:

  • mouseover鼠标经过自身盒子会触发,经过子盒子还会触发。
  • mouseenter只会经过自身盒子触发之所以这样,就是因为mouseenter不会冒泡
  • 跟mouseenter搭配鼠标离开mouseleave同样不会冒泡
<body>
    <div class="father">
        <div class="son"></div>
    </div>
    <script>
        var father = document.querySelector('.father');
        var son = document.querySelector('.son');
        father.addEventListener('mouseenter', function() { // 经过父盒子打印11,再经过父盒子中的子盒子,不再打印
            // 若是mouseover,经过父盒子打印11,再经过父盒子中的子盒子又打印一次11
            console.log(11);
        })
    </script>

动画函数封装

动画原理实现

核心原理:通过定时器setlnterval()不断移动盒子位置。
实现步骤∶

  1. 获得盒子当前位置
  2. 让盒子在当前位置加上1个移动距离
  3. 利用定时器不断重复这个操作
  4. 加一个结束定时器的条件
  5. 注意此元素需要添加定位,才能使用element.style.left

例子

<style>
    div {
        position: absolute;
        left: 0;
        width: 100px;
        height: 100px;
        background-color: pink;
    }
</style>
<body>
    <div></div>
    <script>
        var div = document.querySelector('div');
        var timer = setInterval(function() {
            if (div.offsetLeft >= 400) {
                // 停止动画,停止定时器
                clearInterval(timer);
            }
            div.style.left = div.offsetLeft + 1 + 'px'; // offsetLeft只可以读,不可以写
        }, 30)
    </script>
</body>

动画函数简单封装

注意传递两个参数:动画对象和移动到的距离。

<style>
    div {
        position: absolute;
        left: 0;
        width: 100px;
        height: 100px;
        background-color: pink;
    }
    
    span {
        position: absolute;
        left: 0;
        top: 200px;
        display: block;
        width: 150px;
        height: 150px;
        background-color: purple;
        color: #fff;
    }
</style>
<body>
    <div></div>
    <span>夏雨荷</span>
    <script>
        // 简单动画封装   obj目标对象;target目标位置
        function animate(obj, target) {
            var timer = setInterval(function() {
                if (obj.offsetLeft >= target) {
                    // 停止动画 
                    clearInterval(timer);
                }
                obj.style.left = obj.offsetLeft + 1 + 'px';// 达到目标位置清除定时器后,该行代码还是会执行最后一遍
            }, 30)
        }

        var div = document.querySelector('div');
        var span = document.querySelector('span');

        // 调用函数
        animate(div, 300);// 最终停在301处
        animate(span, 200);// 最终停在201处
    </script>
</body>

动画函数给不同的元素记录不同的定时器

  • 如果多个元素都使用这个动画函数,每次都要var声明定时器。可以给不同的元素使用不同的定时器(自己专门用自己的定时器)。
  • 核心原理:利用Js是一门动态语言,可以很方便的给当前对象添加属性。
  • 上述做法有一个弊端:每次调用动画的时候都要var一个timer,每次这就要在内存中开辟一个空间。调用动画越多,越占内存。下文的方法避免var timer;还可以为每个对象定制一个自己的定时器。

做法:利用对象添加属性的方法

// var obj = {};
// obj.name = 'andy';
var div = document.querySelector('div');
console.log(typeof div);// object
  • 结构
<body>
    <button>点击夏雨荷才走</button>
    <div></div>
    <span>夏雨荷</span>
    <script>
        // 简单动画封装 obj目标对象;target目标位置
        function animate(obj, target) {
            clearInterval(obj.timer); // 按钮debug解决方案:让每个元素只对应一个定时器,保证当前只有一个定时器
            // 给不同的元素指定不同的定时器
            obj.timer = setInterval(function() { // 为对象添加属性的方法 避免了var申明变量timer,不用在内存中开辟空间了
                if (obj.offsetLeft >= target) {
                    // 停止动画 
                    clearInterval(obj.timer); // 清除定时器也是这样
                }
                obj.style.left = obj.offsetLeft + 1 + 'px';
            }, 30)
        }
        var div = document.querySelector('div');
        var span = document.querySelector('span');
        var btn = document.querySelector('button');

        // 调用函数
        animate(div, 300);
        btn.addEventListener('click', function() {
            animate(span, 200); // debug:当不断地点击按钮,会产生越来越多的定时器,元素的速度会越来越快,解决方案:让每个元素只对应一个定时器
        })
    </script>
</body>
  • 样式
<style>
    div {
        position: absolute;
        left: 0;
        width: 100px;
        height: 100px;
        background-color: pink;
    }
    
    span {
        position: absolute;
        left: 0;
        top: 200px;
        display: block;
        width: 150px;
        height: 150px;
        background-color: purple;
        color: #fff;
    }
</style>

缓动动画

缓动动画就是让元素运动速度有所变化,最常见的是让速度慢慢停下来
思路:

  1. 让盒子每次移动的距离慢慢变小,速度就会慢慢落下来。
  2. 核心算法︰(目标值-现在的位置)/ 10做为每次移动的距离步长
  3. 停止的条件是:让当前盒子位置等于目标位置就停止定时器
  4. 注意步长值需要取整
  5. 匀速动画就是盒子当前的位置+固定的值
  6. 缓动动画就是盒子当前的位置+变化的值

原理

<body>
    <button>点击夏雨荷才走</button>
    <span>夏雨荷</span>
    <script>
        // 缓动动画函数封装obj目标对象 target 目标位置
        // 思路:
        // 1. 让盒子每次移动的距离慢慢变小, 速度就会慢慢落下来。
        // 2. 核心算法:(目标值 - 现在的位置) / 10 做为每次移动的距离 步长
        // 3. 停止的条件是: 让当前盒子位置等于目标位置就停止定时器
        function animate(obj, target) {
            // 先清除以前的定时器,只保留当前的一个定时器执行
            clearInterval(obj.timer);
            obj.timer = setInterval(function() {
                // 步长值写到定时器的里面
                var step = (target - obj.offsetLeft) / 10;
                if (obj.offsetLeft == target) {
                    // 停止动画 本质是停止定时器
                    clearInterval(obj.timer);
                }
                // 把每次加1 这个步长值改为一个慢慢变小的值  步长公式:(目标值 - 现在的位置) / 10
                obj.style.left = obj.offsetLeft + step + 'px';

            }, 15);
        }
        var span = document.querySelector('span');
        var btn = document.querySelector('button');

        btn.addEventListener('click', function() {
                // 调用函数
                animate(span, 500);
            })
    </script>
</body>
  • 在多个目标之间移动(让span这个盒子在500处和800处来回切换,可进可退)
<body>
    <button class="btn500">点击夏雨荷到500</button>
    <button class="btn800">点击夏雨荷到800</button>
    <span>夏雨荷</span>
    <script>
        // 简单动画封装   obj目标对象;target目标位置
        function animate(obj, target) {
            clearInterval(obj.timer);
            obj.timer = setInterval(function() {
                // 步长值写在定时器里面  步长公式:(目标值-现在的位置)/10
                var step = (target - obj.offsetLeft) / 10;
                // 为了避免步长出现小数导致最后无法停止规定的位置  所以前进时将步长值向上取整,后退时将步长向下取整
                // 前进时:取整之后算到最后几步步长是0.x的时候,步长取整是1,这样就可以确保停止指定位置
                // 后退时:取整之后算到最后几步步长是-0.x的时候,步长取整是-1,这样就可以确保停止指定位置
                step = step > 0 ? Math.ceil(step) : Math.floor(step);
                if (obj.offsetLeft == target) { //==号
                    clearInterval(obj.timer); //清除定时器也是这样
                }
                // 把每次加1这个步长改为慢慢变小    的值  
                obj.style.left = obj.offsetLeft + step + 'px';
            }, 15)
        }

        var span = document.querySelector('span');
        var btn500 = document.querySelector('.btn500');
        var btn800 = document.querySelector('.btn800');

        // 调用函数
        // 既能前进又能后退
        btn500.addEventListener('click', function() {
            animate(span, 500);
        })
        btn800.addEventListener('click', function() {
            animate(span, 800);
        })
    </script>
</body>

动画函数添加回调函数

回调函数原理∶函数可以作为一个参数。将这个函数作为参数传到另一个函数里面,当那个函数执行完之后,再执行传进去的这个函数,这个过程就叫做回调。
到800的位置上,span盒子变成红色。其中的回调函数是等前面动画执行完了才会执行,所以在定时器结束之后执行

<body>
    <button class="btn500">点击夏雨荷到500</button>
    <button class="btn800">点击夏雨荷到800</button>
    <span>夏雨荷</span>
    <script>
        // 简单动画封装   obj目标对象;target目标位置
        function animate(obj, target, callback) {
            // 将callback参数传进去之后,相当于执行了以下操作
            // callback = function(){}

            clearInterval(obj.timer);
            obj.timer = setInterval(function() {
                var step = (target - obj.offsetLeft) / 10;
                step = step > 0 ? Math.ceil(step) : Math.floor(step);
                if (obj.offsetLeft == target) {
                    clearInterval(obj.timer); // 清除定时器也是这样
                    // 回调函数写道定时器结束里面
                    if (callback) { // 如果有回调函数就运行这个回调函数
                        callback();
                    }
                }
                obj.style.left = obj.offsetLeft + step + 'px';
            }, 15)
        }
        var span = document.querySelector('span');
        var btn500 = document.querySelector('.btn500');
        var btn800 = document.querySelector('.btn800');


        btn500.addEventListener('click', function() {
            animate(span, 500);
        })
        btn800.addEventListener('click', function() {
            animate(span, 800, function() {
                span.style.backgroundColor = 'red';
            });
        })
    </script>
</body>

移动端网页特效

触屏事件

触屏事件概述

移动端的动画效果能用C3写就尽量用C3写,如果非要交互,那么就用CS搭配着C3来写;
touch对象代表一个触摸点。触摸点可能是一根手指,也可能是一根触摸笔。
触屏事件可响应用户手指(或触控笔)对屏幕或者触控板操作。
常见的触屏事件如下:

触屏touch事件说明
touchstart手指触摸到一个DOM元素时触发
touchmove手指在一个DOM元素上滑动时触发
touchend手指从一个DOM元素上移开时触发

触摸事件对象TouchEvent

TouchEvent是一类描述手指在触摸平面(触摸屏、触摸板等)的状态变化的事件。这类事件用于描述一个或多个触点,使开发者可以检测触点的移动,触点的增加和减少等
touchstart、touchmove、touchend三个事件都会各自有事件对象。

触摸列表说明
touches正在触摸屏幕的所有手指的一个列表
targetTouches正在触摸当前DOM元素上的手指的一个列表
changedTouches手指状态发生了改变的列表,从无到有,从有到无变化

移动端拖动元素

  1. touchstart、touchmove、touchend可以实现拖动元素;
  2. 但是拖动元素需要当前手指的坐标值我们可以使用targetTouches[0]里面的pageX和pageY;
  3. 移动端拖动的原理:手指移动中,计算出手指移动的距离。然后用盒子原来的位置+手指移动的距离;
  4. 手指移动的距离:手指滑动中的位置 减去 手指刚开始触摸的位置;

拖动元素三步曲:

  • 触摸元素touchstart:获取手指初始坐标,同时获得盒子原来的位置
  • 移动手指touchmove:计算手指的滑动距离,并且移动盒子
  • 离开手指touchend:
    注意∶手指移动也会触发滚动屏幕所以这里要阻止默认的屏幕滚动e.preventDefault();

案例

click延迟解决方案

移动端click事件会有300ms的延时,原因是移动端屏幕双击会缩放(double tap to zoom)页面。
解决方案︰

  1. 禁用缩放。浏览器禁用默认的双击缩放行为并且去掉300ms的点击延迟。
<meta name="viewport" content="user-scalable=no">
  1. 利用touch事件自己封装这个事件解决300ms延迟。

原理就是︰

  • 当我们手指触摸屏幕,记录当前触摸时间
  • 当我们手指离开屏幕,用离我的时间减去触摸的时间
  • 如果时间小于150ms,并且没有滑动过屏幕,那么我们就定义为点击
// 封装tap,解决click 300ms延时
function tap (obj, cal1back){
	var isMove = false;
	var startTime = 0; // 记录触摸时候的时间变量
	obj.addEventListener ('touchstart' , function (e){
		startTime = Date.now() ; // 记录触摸时间
	});
	
	obj.addEventListener ( 'touchmove', function (e){
		isMove = true;// 看看是否有滑动,有滑动算拖拽,不算点击
	});
	
	obj.addEventListener ( 'touchend ', function (e) {
		if (!isMove && (Date.now() - startTime)< 150){// 如果手指触摸和离开时间小于150ms算点击
			callback && callback() ; // 执行回调函数
		}
		isMove = false; // 取反重置
		startTime = 0;
	});
}
// 调用
tap (div, function() { // 执行代码 });

上述函数封装一次只能为一个元素解决click延时的问题,若是有100个元素就要调用100次;
第三个解决方案:就是使用fastclick插件

移动端常用开发插件

  • JS插件是js 文件,它遵循一定规范编写,方便程序展示效果,拥有特定功能且方便调用。如轮播图和瀑布流插件。
  • 特点:它一般是为了解决某个问题而专门存在,其功能单一,并且比较小。 我们以前写的animate.js也算一个最简单的插件。

fastclick插件解决300ms延迟。使用延时

fastclick.js插件

<!-- 1.引入 -->
<script src="fastclick.js"></script>
<body>
    <div></div>
    <script>
        // 2. 使用
        // 利用下面这段代码,页面中的元素就都解决了click延时问题了
        if ('addEventListener' in document) {
            document.addEventListener('DOMContentLoaded', function() {
                FastClick.attach(document.body);
            }, false);
        }
        // 以下代码中的click将不再延迟
        var div = document.querySelector('div');
        div.addEventListener('click', function() {
            alert(11);
        });
    </script>
</body>

Swiper插件

  • 进入官网:https://www.swiper.com.cn/
  • 登陆网站–>点击导航栏的"获取Swiper"–>点击“下载Swiper”–>下载swiper-4.5.3.zip
  • 解压下载的文件–>找到demos文件夹(里面全是滑动的样式案例.html)。本案例选用:030-pagination.html
  • disk文件夹下有上述案例对应的css和Js文件(ps:cs文件夹下的swiper.css和swiper.css是两个一样的文件,知识swiper.min.css是经过压缩的)。本案例选用swiper.min.css和swiper.min.js文件,将其分别放入css和js的文件夹下
  • 引入插件相关文件(同时新建自己的JS文件,并引入)
<!-- 引入新建的css初始化文件 -->
<link rel="stylesheet" href="css/normalize.css">
<!-- 引入我们首页的css -->
<link rel="stylesheet" href="css/index.css">
<!-- 引入swipercss文件 -->
<link rel="stylesheet" href="css/swiper.min.css">
<!-- 引入swiper js 文件 -->
<script src="js/swiper.min.js"></script>
<!-- 引入我们自己的js文件 -->
<script src="js/index.js"></script>
  • 按照规定语法使用
    (1)打开030-pagination.html文件
    (2)查看网页源代码
    (3)先复制结构
<!-- Swiper -->
  <div class="swiper-container">
    <div class="swiper-wrapper">
      <div class="swiper-slide">Slide 1</div>
      <div class="swiper-slide">Slide 2</div>
      <div class="swiper-slide">Slide 3</div>
      <div class="swiper-slide">Slide 4</div>
      <div class="swiper-slide">Slide 5</div>
      <div class="swiper-slide">Slide 6</div>
      <div class="swiper-slide">Slide 7</div>
      <div class="swiper-slide">Slide 8</div>
      <div class="swiper-slide">Slide 9</div>
      <div class="swiper-slide">Slide 10</div>
    </div>
    <!-- Add Pagination -->
    <div class="swiper-pagination"></div>
  </div>

(4)并将上述结构中的Slide 1,Slide 2,Slide 3…替换为相应的图片,最终的结构修改如下:

<!-- 滑动图 -->
<div class="slider">
    <!-- Swiper 注意不要更改里面的结构和类名 -->
    <div class="swiper-container">
        <div class="swiper-wrapper">
            <div class="swiper-slide">
                <img src="upload/banner.dpg" alt="">
            </div>
            <div class="swiper-slide">
                <img src="upload/banner1.dpg" alt="">
            </div>
            <div class="swiper-slide">
                <img src="upload/banner2.dpg" alt="">
            </div>
            <div class="swiper-slide">
                <img src="upload/banner3.dpg" alt="">
            </div>

        </div>
        <!-- Add Pagination -->
        <!-- 这里就是小圆点 -->
        <div class="swiper-pagination"></div>
    </div>
</div>

(5)复制相关样式,粘贴到index.css中

.swiper-container {
      width: 100%;
      height: 100%;
    }
    .swiper-slide {
      text-align: center;
      font-size: 18px;
      background: #fff;

      /* Center slide text vertically */
      display: -webkit-box;
      display: -ms-flexbox;
      display: -webkit-flex;
      display: flex;
      -webkit-box-pack: center;
      -ms-flex-pack: center;
      -webkit-justify-content: center;
      justify-content: center;
      -webkit-box-align: center;
      -ms-flex-align: center;
      -webkit-align-items: center;
      align-items: center;
    }

(6)复制js相关内容并复制到自己的index.js文件中

window.addEventListener('load', function() {
    //复制的内容
    var swiper = new Swiper('.swiper-container', {
        pagination: {
            el: '.swiper-pagination',
        },
    });
})
  1. 有其他需要可以查看该网站导航栏上的中文教程以及API文档等内容
  2. 如果有JS内容需要修改,可以查看API文档里每个参数的含义
  3. 如何是CSS内容需要修改,可用在页面上检查元素,得到相关的类名,再去我们自己的CSS里为这个类名写一个新的样式覆盖掉原来的样式,注意添加!important用于提高层级

其他移动端常见插件

superslide:http://www.superslide2.com
iscroll:http://github.com/cubiq/iscroll

插件总结

  1. 确认插件实现的功能
  2. 去官网查看使用说明
  3. 下载插件
  4. 打开demo实例文件,查看需要引入的相关文件,并且引入
  5. 复制demo实例文件中的结构html,样式css以及js代码

移动端常用开发框架

  • 框架,顾名思义就是一套架构,它会基于自身的特点向用户提供一套较为完整的解决方案。
  • 框架的控制权在框架本身,使用者要按照框架所规定的某种规范进行开发。
  • 插件一般是为了解决某个问题而专门存在,其功能单一,并且比较小。
  • 前端常用的框架有Bootstrap、Vue、Angular、React等。既能开发PC端,也能开发移动端
  • 前端常用的移动端插件有swiper、superslide、iscroll等。
  • 框架∶大而全,一整套解决方案
  • 插件∶小而专一,某个功能的解决方案

用bootstrap做轮播图

  • (1)搭建文件夹,并下载bootstrap框架
  • (2)在新建的index.html文件中写入初始样式和结构
<style>
    .focus {
        width: 800px;
        height: 300px;
        background-color: pink;
        margin: 200px auto;
    }
</style>
<body>
    <div class="focus">
    </div>
</body>
  • 打开bootstrap官网—>点击导航栏上的中文文档–>JavaScript插件:https://v3.bootcss.com/javascript/
  • 所有插件都依赖 jQuery (也就是说,jQuery必须在所有插件之前引入页面),之后再引入js
<link rel="stylesheet" href="bootstrap/css/bootstrap.min.css">
<script src="bootstrap/js/jquery.min.js"></script>
<script src="bootstrap/js/bootstrap.min.js"></script>
  • 点击该网站右侧菜单的Carousel,出现轮播图,复制其结构部分;
<div id="carousel-example-generic" class="carousel slide" data-ride="carousel">
  <!-- Indicators -->
  <ol class="carousel-indicators">
    <li data-target="#carousel-example-generic" data-slide-to="0" class="active"></li>
    <li data-target="#carousel-example-generic" data-slide-to="1"></li>
    <li data-target="#carousel-example-generic" data-slide-to="2"></li>
  </ol>

  <!-- Wrapper for slides -->
  <div class="carousel-inner" role="listbox">
    <div class="item active">
      <img src="..." alt="...">
      <div class="carousel-caption">
        ...
      </div>
    </div>
    <div class="item">
      <img src="..." alt="...">
      <div class="carousel-caption">
        ...
      </div>
    </div>
    ...
  </div>

  <!-- Controls -->
  <a class="left carousel-control" href="#carousel-example-generic" role="button" data-slide="prev">
    <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
    <span class="sr-only">Previous</span>
  </a>
  <a class="right carousel-control" href="#carousel-example-generic" role="button" data-slide="next">
    <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
    <span class="sr-only">Next</span>
  </a>
</div>
  • 大致分析每个结构代表的是什么,在做内容做适当修改
<body>
    <div class="focus">
        <!-- 从bootstrap复制的结构部分 开始 -->
        <div id="carousel-example-generic" class="carousel slide" data-ride="carousel">
            <!-- Indicators  小圆点-->
            <ol class="carousel-indicators">
                <li data-target="#carousel-example-generic" data-slide-to="0" class="active"></li>
                <li data-target="#carousel-example-generic" data-slide-to="1"></li>
                <li data-target="#carousel-example-generic" data-slide-to="2"></li>
            </ol>

            <!-- Wrapper for slides  轮播图片-->
            <div class="carousel-inner" role="listbox">
                <div class="item active">
                    <img src="upload/banner(1).dpg" alt="...">
                    <div class="carousel-caption">
                        这是我的图片1
                    </div>
                </div>
                <div class="item">
                    <img src="upload/banner1.dpg" alt="...">
                    <div class="carousel-caption">
                        这是我的图片2
                    </div>
                </div>
                <div class="item">
                    <img src="upload/banner2.dpg" alt="...">
                    <div class="carousel-caption">
                        这是我的图片3
                    </div>
                </div>
            </div>

            <!-- Controls 左右箭头-->
            <a class="left carousel-control" href="#carousel-example-generic" role="button" data-slide="prev">
                <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
                <span class="sr-only">Previous</span>
            </a>
            <a class="right carousel-control" href="#carousel-example-generic" role="button" data-slide="next">
                <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
                <span class="sr-only">Next</span>
            </a>
        </div>
        <!-- 从bootstrap复制的结构部分 结束-->

    </div>
</body>
  • 出现问题:复制的这一段代码比我们自己写的父盒子.focus要高一点。所以还要将里面的内容修改的和父亲一样高。
  • 修改方式:检查元素–>选中复制过来的结构中最大的那个盒子,找到该盒子的类名(.carousel),我们对类名进行修改就可以了。
<style>
    .focus {
        width: 800px;
        height: 300px;
        background-color: pink;
        margin: 200px auto;
    }
    
    .carousel,
    .carousel img {
        /* 将复制来的大盒子以及大盒子里面的图片都改成和focus一样高 */
        height: 300px!important;
        width: 100%;
        /* 宽度可用继承 高度不能继承 */
    }
</style>
  • 修改播放时间(将页面往下滑倒Method)复制其中的修改时间代码
$('.carousel').carousel({
  interval: 2000
})
  • 复制到index.html里面的script中
<script>
    // 从bootstrap中复制的js部分 
    $('.carousel').carousel({
        interval: 2000 // 每隔两秒钟播放一次
    })
</script>
  • 最终结构如下:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="bootstrap/css/bootstrap.min.css">
    <script src="bootstrap/js/jquery.min.js"></script>
    <script src="bootstrap/js/bootstrap.min.js"></script>
    <style>
        .focus {
            width: 800px;
            height: 300px;
            background-color: pink;
            margin: 200px auto;
        }
        
        .carousel,
        .carousel img {
            /* 将复制来的大盒子以及大盒子里面的图片都改成和focus一样高 */
            height: 300px!important;
            width: 100%;
            /* 宽度可用继承 高度不能继承 */
        }
    </style>
</head>
<body>
    <div class="focus">
        <!-- 从bootstrap复制的结构部分 开始 -->
        <div id="carousel-example-generic" class="carousel slide" data-ride="carousel">
            <!-- Indicators  小圆点-->
            <ol class="carousel-indicators">
                <li data-target="#carousel-example-generic" data-slide-to="0" class="active"></li>
                <li data-target="#carousel-example-generic" data-slide-to="1"></li>
                <li data-target="#carousel-example-generic" data-slide-to="2"></li>
            </ol>

            <!-- Wrapper for slides  轮播图片-->
            <div class="carousel-inner" role="listbox">
                <div class="item active">
                    <img src="upload/banner(1).dpg" alt="...">
                    <div class="carousel-caption">
                        这是我的图片1
                    </div>
                </div>
                <div class="item">
                    <img src="upload/banner1.dpg" alt="...">
                    <div class="carousel-caption">
                        这是我的图片2
                    </div>
                </div>
                <div class="item">
                    <img src="upload/banner2.dpg" alt="...">
                    <div class="carousel-caption">
                        这是我的图片3
                    </div>
                </div>
            </div>
            <!-- Controls 左右箭头-->
            <a class="left carousel-control" href="#carousel-example-generic" role="button" data-slide="prev">
                <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
                <span class="sr-only">Previous</span>
            </a>
            <a class="right carousel-control" href="#carousel-example-generic" role="button" data-slide="next">
                <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
                <span class="sr-only">Next</span>
            </a>
        </div>
        <!-- 从bootstrap复制的结构部分 结束-->
        <script>
            // 从bootstrap中复制的js部分 
            $('.carousel').carousel({
                interval: 2000 //每隔两秒钟播放一次
            })
        </script>
    </div>
</body>
</html>

bootstrap插件的使用步骤

  • 引入相关js文件
  • 复制HTML结构
  • 修改对应样式
  • 修改相应JS参数

本地存储

本地存储

随着互联网的快速发展,基于网页的应用越来越普遍,同时也变的越来越复杂,为了满足各种各样的需求,会经常性在本地存储大量的数据,HTML5规范提出了相关解决方案。
本地存储特性
1、数据存储在用户浏览器中
2、设置、读取方便、甚至页面刷新不丢失数据
3、容量较大,sessionStorage约5M、localStorage约20M
4、只能存储字符串,可以将对象JSON.stringify()编码后存储

window.sessionStorage

  • sessionStorage属于window对象
    1、生命周期为关闭浏览器窗口
    2、在同一个窗口(页面)下数据可以共享
    3.以键值对的形式存储使用

存储数据∶

sessionStorage.setItem(key, value)

获取数据∶

sessionStorage.getItem(key)

删除数据∶

sessionStorage.removeItem(key)

删除所有数据∶

sessionStorage.clear()

window.localStorage

1、生命周期永久生效,除非手动删除否则关闭页面也会存在
2、可以多窗口(页面)共享(同一浏览器可以共享)
3、以键值对的形式存储使用

存储数据∶

localStorage.setItem(key, value)

获取数据∶

localStorage.getItem(key)

删除数据∶

localStorage.removeItem(key)

删除所有数据∶

localStorage.clear()

注意:

  • 关闭浏览器数据也存在,只有利用remove和clear才可用真正删除数据
  • 同一个浏览器下的不同页面也可用使用此数据(在之前写sessionStorage的页面中也可以打印)
console.log(localStorage.getItem('uname'));// Lucy
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值