• Welcome to Journal web site.

我是 PHP 程序员

- 开发无止境 -

Next
Prev

第18章 0411-JS实战2与JSON

Data: 2015-08-15 02:58:57Form: JournalClick: 0

demo1:js幻灯片
<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>轮播图</title>
    <style>
        /* ! 3. 轮播图 */
       
        .slider {
            max-width: 750px;
            min-width: 320px;
            margin: auto;
            padding: 0 10px;
        }
       
        .slider .imgs {
            /* 图片容器必须要有高度,否则下面图片不能正常显示 */
            height: 150px;
        }
       
        .slider .imgs img {
            /* 图片完全充满父级空间显示 */
            height: 100%;
            width: 100%;
            /* 图片带有圆角 */
            border-radius: 10px;
            /* 默认图片全部隐藏,只有有active的图片才显示 */
            display: none;
        }
       
        .slider .imgs img:hover {
            cursor: pointer;
        }
        /* 默认显示第一张 */
       
        .slider .imgs img.active {
            display: block;
        }
        /* 轮播图按钮组 */
       
        .slider .btns {
            /* 按钮水平一排显示,用flex,且水平居中 */
            display: flex;
            place-content: center;
        }
       
        .slider .btns span {
            /* 按钮宽高相同,确定显示成一个正圆 */
            width: 8px;
            height: 8px;
            /* 加上红色背景和数字是为了布局时可以看到,一会更去掉 */
            background-color: rgba(255, 255, 255, 0.4);
            /* 50%可确保显示为正圆 */
            border-radius: 50%;
            /* 按钮上外边距负值,可将它上移,可移动到图片中下方 */
            margin: -12px 3px 5px;
        }
       
        .slider .btns span.active {
            background-color: #fff;
        }
    </style>
</head>

<body>
    <div class="slider">
        <!--
            图片容器
            1. 图片组
            2. 按钮组
            注: 按钮数组与图片数量是一样的
         -->
        <div class="imgs">
            <!-- 轮播图默认从第一张开始显示 -->
            <img src="./images/banner1.jpg" alt="" data-index="1" class="active" />
            <img src="./images/banner2.jpg" alt="" data-index="2" />
            <img src="./images/banner3.png" alt="" data-index="3" />
        </div>
        <!-- 切换按钮数量与图片数量必须一致 -->
        <div class="btns">
            <span data-index="1" class="active" onclick="setActive()"></span>
            <span data-index="2" onclick="setActive()"></span>
            <span data-index="3" onclick="setActive()"></span>
        </div>
    </div>

    <script>
        // 1. 获取全部图片和按钮
        const imgs = document.querySelectorAll('.slider .imgs img')
        const btns = document.querySelectorAll('.slider .btns span')
        // 2. 设置激活状态
        function setActive() {
            // 1. 清空图片和所有按钮的激活状态
            imgs.forEach(img => img.classList.remove('active'));
            //等效
            //forEach() 方法对数组的每个元素执行一次提供的函数。
            // imgs.forEach(
            //     function(img){//img为传值参数
            //         console.log(img)//输出元素<img src="./images/banner2.jpg" alt="" data-index="2">
            //         img.classList.remove('active')
            //     }
            // );


            btns.forEach(btn => btn.classList.remove('active'));

            // 2. 根据按钮的索引data-index来确定应该将哪一张图片显示出来class=active
            event.target.classList.add('active')
            imgs.forEach(img => {
                if (img.dataset.index === event.target.dataset.index) {
                    img.classList.add('active')
                }
            })

        }

        // 3. 自动播放
        // [1,2,3]
        // [2,3,1]
        // [3,1,2]
        // [1,2,3]
        // 首尾相连,实现循环播放
        // 自动点击: 事件派发器

        // 间歇式触发,每隔一段固定时间会自动触发一次事件
        // setInterval: 除了回调和时间外,还可传入第三个参数,做为回调的参数
        setInterval((arr) => {
            // 1. 头部删除
            let i = arr.shift()
                // 2. 尾部追加
            arr.push(i);
            // 3. 事件派发: 模拟用户点击
            btns[i].dispatchEvent(new Event('click'))

        }, 2000, Object.keys(btns));
        //Object.keys(btns) 是将对象转换为键值,赋予arr参数给函数里 头删尾追 时使用。
        //console.log(Object.keys(btns));
        // console.log(Object.keys(imgs));

        // 作业1: 实现鼠标悬停时自动停止播放, 离开时又自动播放
        // 作业2[可选]: 给这个轮播图加上翻页按按钮,实现向前和向后翻页播放
    </script>
</body>

</html>
demo2:图片懒加载/延迟加载
<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>懒加载/延迟加载</title>
</head>

<body>
    <h2>女性养生保健</h2>
    <h4>饮食不要太清淡</h4>

    <p>
        很多女性都认为不吃肉就可以让自己变瘦,于是只吃素食不吃荤这是不可取的,如果想保持完美的体型,要补充足够的蛋白质和脂肪,这些物质如果摄入过少会降低人体抵抗力,特别是对于那些身体虚弱的人更要注意多补充各种营养素了。
    </p>
    <h4>学会护理自己的私处健康</h4>
    <p>
        由于特殊的生理结构,所以女性更容易引起各种妇科疾病。特别是容易引起生殖方面的健康困扰,建议过了30岁的女性最好养成每年进行妇科体检的习惯,在日常生活中要特别注意私处的卫生,在经期要学会拒绝性生活,避免过度劳累,同时也要减少凉性的食物的摄入,以更好的保证人体健康。建议有裸睡的习惯的女性朋友要注意床上用品的干净卫生。
    </p>
    <!-- <img src="images/1.jpg" alt="" width="100%" /> -->
    <img data-src="images/1.jpg" alt="" width="100%" />
    <h4>穿衣要讲究节气</h4>
    <p>
        一些女性为了秀出苗条的身材,往往是各种露背装、穿短裙、丁字裤。这类衣服在夏季穿穿倒也还是可以的。但是如果在春季、秋季、冬季等天气较凉的情况下可能就会引起颈椎病、腰部疼痛、甚至各种妇科疾病的。在这里还要提醒一下夏季如果度期处在空调房的话,最好给自己加件披肩,注意不要使肩部、腰部直接对着冷风吹。
    </p>

    <h4>吃水果也要适当</h4>
    <p>
        多数女性都喜欢吃水果,而水果也有寒性、温性、热性之分的,并不是所有的水果都适合所有的女性的。所以女性日常在吃水果的时候最好区分自己的体质,然后在针对性的选择水果。特别注意的是在经期,或者体质较为虚寒的人尽量不要食用香蕉、雪梨、西瓜、柿子、橘子等凉性的水果。如果火气过大,上火的话,则建议不要食用龙眼、荔枝、葡萄、石榴、菠萝之类的水果 。当然了女性日常可适当吃些柠檬、苹果、山竹等具有护肤功效的水果,但切记把水果当成正餐。
    </p>
    <img data-src="images/2.jpg" alt="" width="100%" />
    <p></p>
    <img data-src="images/3.jpg" alt="" width="100%" />
    <p></p>
    <img data-src="images/4.jpg" alt="" width="100%" />

    <h4>适当泡澡</h4>
    <p>
        在泡澡的时候人会特别的放松,心情也跟着好起来,泡澡可以缓解人的压力,释放不良情绪,同时对于平衡身体的酸碱度也有一定的帮助。
    </p>
    <h4>坐起床上做伸展运动</h4>
    <p>
        把枕头垫在背后,两手向后伸直并伸展身体做伸懒腰动作,然后自然双手上举、放平,并尽力向后扩展,接着反复深呼吸数次。双手上举、扩展,可以使肋骨上拉、胸腔扩大,使膈肌活动加强,引发身体大部分肌肉收缩,从而达到加速血液循环、使血液迅速回流到全身,供给心脑系统足够的氧气和血液,以保持头脑清醒。深呼吸则可以激活肺细胞,促进肺泡工作。
    </p>

    <img data-src="images/5.jpg" alt="" width="100%" />
    <h4>适当运动</h4>
    <p>
        女性在平时可以每天抽出一个小时或者半个小时时间专门用来做运动,运动不但能让抵抗力增强不容易得病还可以保持良好的身材。当然了这里的体育运动指的可不是家务劳动哦,女人该宠爱自己的时候还是应该好好的宠爱一下自己的。
    </p>
    </div>

    <script>
        console.log(document.images);
        window.onscroll = () => {
            //[...xxx]将对象转换为数组
            [...document.images].forEach(img => {
                if (img.getBoundingClientRect().top < window.innerHeight) {
                    img.src = img.dataset.src;
                }
            })
        }
    </script>
</body>

</html>
demo3:JSON
<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>json</title>
</head>

<body>
    <script>
        // 1. json是通用的,轻量化的 "数据交互格式",用于 "前后端数据通信"
        // 2. json独立于编程语言,本质是一个格式化字符串
        // 3. json借用了js对象字面量的语法,简洁高效,已替代了传统的xml格式
        // 4. json不是js对象, 但它可以与js对象之间相互转换, 还可以和php对象/数组进行交换

        // 数据类型:
        // 1. 简单类型: number, string, boolean, null
        // 2. 数组: [...]
        // 3. 对象: {...}, 这是关注的重点

        // 不支持 undefined ,没意义的

        // json: 本质就是js对象的序列化, 字符串表示

        // 1. 前端: js对象 -> json字符串
        const user = {
            id: 1,
            name: '猪老师',
            email: '498668472@qq.com',
            isMarried: true,
            gender: 'male',
            salary: 123456
        }
        console.log(user);
        // 序列化js对象
        let strJSON = JSON.stringify(user)
        console.log(strJSON);
        console.log(typeof strJSON);
        // 传入一个回调,进行预处理
        strJSON = JSON.stringify(user, (key, value) => {
            switch (key) {
                case 'gender':
                    return value === 'male' ? '男' : '女'
                case 'salary':
                    return undefined;
                default:
                    return value;
            }
        })
        console.log(strJSON);
        // 数组参数可以控制返回的字段
        strJSON = JSON.stringify(user, ['name', 'email'])
        console.log(strJSON);
        // 第三个参数,2表示缩进二个空格显示
        strJSON = JSON.stringify(user, null, '**')
        console.log(strJSON);

        // 2. 后端: json->js对象
        const siteInfo = `
            {
            "name":"PHP中文网",
            "domain":"https://www.php.cn",
            "isRecord":true,
            "email":"498668472@qq.com",
            "address":"合肥市政务新区蔚蓝商务港",
            "category":["视频","文章","资源"],
            "lesson": {
                "name": "第19期Web全栈线上培训班",
                "price": 4800,
                "content": ["JavaScript", "PHP", "ThinkPHP"]
                }
            }
        `

        // json -> jsobj
        let site = JSON.parse(siteInfo)
        console.log(site);
        let template = `
            <li>网站名称: ${site.name}</li>
            <li>网站域名: ${site.domain.slice(8)}</li>
            <li>是否备案: ${site.isRecord ? '已备案' : '没备案'}</li>
            <li>服务内容:
                <ul>
                    ${site.category.map(cate=>`<li>${cate}</li>`).join('')}
                    ${site.category.reduce((acc,cur)=>`${acc}</li><li>${cur}`,'')}
                </ul>
            </li>
              <li>课程信息:
                <ul>
                   ${Object.keys(site.lesson).map(key=>`<li>${site.lesson[key]}</li>`).join('')}
                   ${Object.values(site.lesson).map(lesson=>`<li>${lesson}</li>`).join('')}
                </ul>
            </li>
       
        `
        const ul = document.createElement('ul');
        ul.innerHTML = template;
        document.body.append(ul)
    </script>
</body>

</html>

demo4:Ajax-XHR
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta
Name:
<提交>