> 文档中心 > JavaScript(五)-- PC 端网页特效

JavaScript(五)-- PC 端网页特效


1. 元素偏移量 offset 系列

        1.1 offset 概述

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

                ● 获得元素距离带有定位父元素的位置

                ● 获得元素自身的大小( 宽度高度 )

                ● 注意:返回的数值都不带单位

                offset 系列常用属性:

                

    
// offset 系列 var father = document.querySelector('.father'); var son =document.querySelector('.son'); var w =document.querySelector('.w'); // 1. 可以得到元素的偏移 位置 返回的不带单位的数值 console.log(father.offsetTop); // 100 console.log(father.offsetLeft); // 100 // 它以带有定位的父亲为准﹑如果么有父亲或者父亲没有定位则以 body为准 console.log(son.offsetLeft); // 145 45 // 2. 可以得到元素的 大小 宽度 和 高度 是包含 padding + border + width console.log(w.offsetWidth); // 200 console.log(w.offsetHeight); // 200 // 3. 返回带有定位的父亲 否则返回的是body console.log(son.offsetParent); // 返回带有定位的父亲 否则返回的是body console.log(son.parentNode); // 返回父亲是最近一级的父亲 亲爸爸 不管父亲有没有定位

        1.2 offset 与 style 区别

                

                Document     .box {     width: 200px;     height: 200px;     background-color: pink;     padding: 20px; }        
// offset 与 style 区别 var box = document.querySelector('.box'); console.log(box.offsetWidth); console.log(box.style.width); // box.offsetWidth = '300px'; box.style.width = '300px';

        案例:获取鼠标盒子内的坐标

                案例分析

                        ① 我们在盒子内点击,想要得到鼠标距离盒子左右的距离。

                        ② 首先得到鼠标在页面中的坐标( e.pageX, e.pageY )

                        ③ 其次得到盒子在页面中的距离( box.offsetLeft, box.offsetTop)

                        ④ 用鼠标距离页面的坐标减去盒子在页面中的距离,得到鼠标在盒子内的坐标

                        ⑤ 如果想要移动一下鼠标,就要获取最新的坐标,使用鼠标移动事件 mousemove

                Document     .box {     width: 300px;     height: 300px;     background-color: pink;     margin: 200px; }        
// 我们在盒子内点击,想要得到鼠标距离盒子左右的距离。 // 首先得到鼠标在页面中的坐标( e.pagex,e.pageY) // 其次得到盒子在页面中的距离(box.offsetLeft, box.offsetTop) // 用鼠标距离页面的坐标减去盒子在页面中的距离,得到鼠标在盒子内的坐标 var box =document.querySelector('.box'); box.addEventListener('mousemove', function(e) { // console.log(e.pageX); // console.log(e.pageY); // console.log(box.offsetLeft); // console.log(box.offsetTop); var x = e.pageX - box.offsetLeft; // console.log(x); var y = e.pageY - box.offsetTop; // console.log(y); this.innerHTML = 'x坐标是:' + x + ' y坐标是:' + y; })

        案例:模态框拖拽

                弹出框,我们也称为模态框。

                1.点击弹出层,会弹出模态框,并且显示灰色半透明的遮挡层。

                2.点击关闭按钮,可以关闭模态框,并且同时关闭灰色半透明遮挡层。

                3.鼠标放到模态框最上面一行,可以按住鼠标拖拽模态框在页面中移动。

                4.鼠标松开,可以停止拖动模态框移动。

                

                 案例分析

                        ① 点击弹出层,模态框和遮挡层就会显示出来 display:block;

                        ② 点击关闭按钮,模态框和遮挡层就会隐藏起来 display:none;

                        ③ 在页面中拖拽的原理:鼠标按下并且移动,之后松开鼠标

                        ④ 触发事件是鼠标按下 mousedown,鼠标移动 mousemove,鼠标松开 mouseup

                        ⑤ 拖拽过程:鼠标移动过程中,获得最新的值赋值给模态框的 left 和 top 值,这样模态框可以跟着鼠标走了

                        ⑥ 鼠标按下触发的事件源是最上面一行,就是 id 为 title

                        ⑦ 鼠标的坐标减去鼠标在盒子内的坐标,才是模态框真正的位置。

                        ⑧ 鼠标按下,我们要得到鼠标在盒子的坐标。

                        ⑨ 鼠标移动,就让模态框的坐标设置为:鼠标坐标减去盒子坐标即可,注意移动事件写到按下事件里面。

                        ⑩ 鼠标松开,就停止拖拽,就是可以让鼠标移动事件解除

                Document     .login-header {     width: 100%;     text-align: center;     height: 30px;     font-size: 24px;     line-height: 30px; }  ul, li, ol, dl, dt, dd, div, p, span, h1, h2, h3, h4, h5, h6, a {     padding: 0px;     margin: 0px; }  .login {     display: none;     width: 512px;     height: 280px;     position: fixed;     border: #ebebeb solid 1px;     left: 50%;     top: 50%;     background: #ffffff;     box-shadow: 0px 0px 20px #ddd;     z-index: 9999;     transform: translate(-50%, -50%); }  .login-title {     width: 100%;     margin: 10px 0px 0px 0px;     text-align: center;     line-height: 40px;     height: 40px;     font-size: 18px;     position: relative;     cursor: move; }  .login-input-content {     margin-top: 20px; }  .login-button {     width: 50%;     margin: 30px auto 0px auto;     line-height: 40px;     font-size: 14px;     border: #ebebeb 1px solid;     text-align: center; }  .login-bg {     display: none;     width: 100%;     height: 100%;     position: fixed;     top: 0px;     left: 0px;     background: rgba(0, 0, 0, .3); }  a {     text-decoration: none;     color: #000000; }  .login-button a {     display: block; }  .login-input input.list-input {     float: left;     line-height: 35px;     height: 35px;     width: 350px;     border: #ebebeb 1px solid;     text-indent: 5px; }  .login-input {     overflow: hidden;     margin: 0px 0px 20px 0px; }  .login-input label {     float: left;     width: 90px;     padding-right: 10px;     text-align: right;     line-height: 35px;     height: 35px;     font-size: 14px; }  .login-title span {     position: absolute;     font-size: 12px;     right: -20px;     top: -30px;     background: #ffffff;     border: #ebebeb solid 1px;     width: 40px;     height: 40px;     border-radius: 20px; }                         // 1. 获取元素 var login = document.querySelector('.login'); var mask = document.querySelector('.login-bg'); var link = document.querySelector('#link'); var closeBtn = document.querySelector('#closeBtn'); var title = document.querySelector('#title'); // 2.点击弹出层这个链接link 让mask和login显示出来 link.addEventListener('click', function() {     login.style.display = 'block';     mask.style.display = 'block'; }); // 3.点击 closeBtn 就隐藏 mask 和 login closeBtn.addEventListener('click', function() {     login.style.display = 'none';     mask.style.display = 'none'; }); // 4. 开始拖拽 // (1) 当我们鼠标按下,就获得鼠标在盒子内的坐标 title.addEventListener('mousedown', function(e) {     var x = e.pageX - login.offsetLeft;     var y = e.pageY - login.offsetTop;     // (2) 鼠标移动的时候,把鼠标在页面中的坐标,减去鼠标在盒子内的坐标就是模态框的left和top值     document.addEventListener('mousemove', move);     function move(e) {  login.style.left = e.pageX - x + 'px';  login.style.top = e.pageY - y + 'px';     }     // (3) 鼠标弹起,就让鼠标移动事件移除     document.addEventListener('mouseup', function() {  document.removeEventListener('mousemove', move);     }); });    

        案例:仿京东放大镜

                

                 案例分析

                        ① 整个案例可以分为三个功能模块

                        ② 鼠标经过小图片盒子,黄色的遮挡层和大图片盒子显示,离开隐藏 2 个盒子功能

                        ③ 黄色的遮挡层跟随鼠标功能。

                        ④ 移动黄色遮挡层,大图片跟随移动功能。

                                ① 鼠标经过小图片盒子,黄色的遮挡层和大图片盒子显示,离开隐藏2个盒子功能

                                ② 就是显示与隐藏

                                ① 黄色的遮挡层跟随鼠标功能。

                                ② 把鼠标坐标给遮挡层不合适。因为遮挡层坐标以父盒子为准。

                                ③ 首先是获得鼠标在盒子的坐标

                                ④ 之后把数值给遮挡层做为 left 和 top 值。

                                ⑤ 此时用到鼠标移动事件,但是还是在小图片盒子内移动。

                                ⑥ 发现,遮挡层位置不对,需要再减去盒子自身高度和宽度的一半。

                                ⑦ 遮挡层不能超出小图片盒子范围。

                                ⑧ 如果小于零,就把坐标设置为 0

                                ⑨ 如果大于遮挡层最大的移动距离,就把坐标设置为最大的移动距离

                                ⑩ 遮挡层的最大移动距离:小图片盒子宽度减去遮挡层盒子宽度

                                ① 移动黄色遮挡层,大图片跟随移动功能。                                

                                 ② 求大图片的移动距离公式

                                

                                 

        手机详情页!                                                                                            
JavaScript(五)-- PC 端网页特效
JavaScript(五)-- PC 端网页特效
  • JavaScript(五)-- PC 端网页特效
  • JavaScript(五)-- PC 端网页特效
  • JavaScript(五)-- PC 端网页特效
  • JavaScript(五)-- PC 端网页特效
  • JavaScript(五)-- PC 端网页特效
Apple iPhone 6s(A1700)64G玫瑰金色 移动通信电信4G手机
推荐选择下方[移动优惠购],手机套餐齐搞定,不用换号,每月还有花费返
价格
¥5299.00 降价通知
累计评价612188
促销
加购价 满999.00另加20.00元,或满1999.00另加30.00元,或满2999.00另加40.00元,即可在购物车换 购热销商品 详情 》
支持
以旧换新,闲置手机回收 4G套餐超值抢 礼品购
选择颜色
玫瑰金金色白色土豪色
选择版本
公开版移动4G
购买方式
官方标配移动优惠购电信优惠购
  • 相关分类
  • 推荐品牌
  • 商品介绍
  • 规格与包装
  • 售后保障
  • 商品评价(50000)
  • 手机社区
  • 分辨率:1920*1080(FHD)
  • 后置摄像头:1200万像素
  • 前置摄像头:500万像素
  • 核 数:其他
  • 频 率:以官网信息为准
  • 品牌: Apple ♥关注
  • 商品名称:APPLEiPhone 6s Plus
  • 商品编号:1861098
  • 商品毛重:0.51kg
  • 商品产地:中国大陆
  • 热点:指纹识别,Apple Pay,金属机身,拍照神器
  • 系统:苹果(IOS)
  • 像素:1000-1600万
  • 机身内存:64GB

查看更多参数

JavaScript(五)-- PC 端网页特效 JavaScript(五)-- PC 端网页特效 JavaScript(五)-- PC 端网页特效
<!--
规格与包装
售后保障
-->
window.addEventListener('load', function() {    var preview_img = document.querySelector('.preview_img');    var mask = document.querySelector('.mask');    var big = document.querySelector('.big');    // 1. 当我们鼠标经过 preview_img 就显示和隐藏 mask 遮挡层 和 big 大盒子    preview_img.addEventListener('mouseover', function() { mask.style.display = 'block'; big.style.display = 'block';    })    preview_img.addEventListener('mouseout', function() {     mask.style.display = 'none';     big.style.display = 'none'; }) // 2. 鼠标移动的时候,让黄色的盒子跟着鼠标来走    preview_img.addEventListener('mousemove', function(e) { // (1). 先计算出鼠标在盒子内的坐标 var x = e.pageX - this.offsetLeft; var y = e.pageY - this.offsetTop; // console.log(x, y); // (2) 减去盒子高度 300的一半 是 150 就是我们mask 的最终 left 和top值了 // (3) 我们mask 移动的距离 var maskX = x - mask.offsetWidth / 2; var maskY = y - mask.offsetHeight / 2; // (4) 如果x 坐标小于了0 就让他停在0 的位置 // 遮挡层的最大移动距离 var maskMax = preview_img.offsetWidth - mask.offsetWidth; if (maskX = maskMax) {     maskX = maskMax; } if (maskY = maskMax) {     maskY = maskMax; } mask.style.left = maskX + 'px'; mask.style.top = maskY + 'px'; // 3. 大图片的移动距离 = 遮挡层移动距离 * 大图片最大移动距离 / 遮挡层的最大移动距离 // 大图 var bigIMg = document.querySelector('.bigImg'); // 大图片最大移动距离 var bigMax = bigIMg.offsetWidth - big.offsetWidth; // 大图片的移动距离 X Y var bigX = maskX * bigMax / maskMax; var bigY = maskY * bigMax / maskMax; bigIMg.style.left = -bigX + 'px'; bigIMg.style.top = -bigY + 'px';    })})

2. 元素可视区 client 系列

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

        

         

                Document     div {     width: 200px;     height: 200px;     background-color: pink;     border: 10px solid red;     padding: 10px; }        
// client 宽度 和我们 offsetwidth 最大的区别就是不包含边框 var div = document.querySelector('div'); console.log(div.clientWidth);

        案例:淘宝 flexible.js 源码分析

3. 元素滚动 scroll 系列

4. 动画函数封装

5. 常见网页特效案例