PC端网页特效(一)

PC端网页特效(一)

1.元素偏移量 offset 系列

(1)offset

offset 就是偏移量,可以动态的得到该元素的位置、大小等

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

● 获取元素自身的大小

● 返回的数值不带单位

(2)offset 系列常用属性

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

(3) offset和style的区别

offset

● offset 可以得到任意样式表中的样式值

● offset 系列获得的数值是没有单位的

● offsetWidth 包含padding+border+width

● offsetWidth 等属性是只读属性,只能获取不能赋值

● 我们要获取元素大小位置,用offset合适

style

● style 只能得到行内样式表中的属性值

● style.width 获得的是带有单位的字符串

● style.width 获得不包含padding和boder的值

● style.width 是可读写属性,可以获取也可以赋值

● 我们想要给元素更改值,需要用style改变

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

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, user-scalable=no,
		initial-sale=1.0, maximum-scale=1.0, minimum-scale=1.0"/>
		<title></title>
		<style>
			.box {
				width: 300px;
				height: 300px;
				background-color: pink;
				margin: 200px;
			}
		</style>
	</head>
	<body>
	    <div class="box"></div>
	    <script>
	        // 我们在盒子内点击, 想要得到鼠标距离盒子左右的距离。
	        // 首先得到鼠标在页面中的坐标( 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);
	            var x = e.pageX - this.offsetLeft;
	            var y = e.pageY - this.offsetTop;
	            this.innerHTML = 'x坐标是' + x + ' y坐标是' + y;
	        })
	    </script>
	</body>
</html>

在这里插入图片描述
案例:模态框拖拽

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, user-scalable=no,
		initial-sale=1.0, maximum-scale=1.0, minimum-scale=1.0"/>
		<title></title>
		<style>
			* {
				padding: 0px;
				margin: 0px;
			}
			.login-header {
				width: 100%;
				text-align: center;
				height: 30px;
				font-size: 24px;
				line-height: 30px;
			}
			.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;
			}
		</style>
	</head>
	<body>
	    <div class="login-header"><a id="link" href="javascript:;">点击,弹出登录框</a></div>
	    <div id="login" class="login">
	        <div id="title" class="login-title">登录会员
	            <span><a id="closeBtn" href="javascript:void(0);" class="close-login">关闭</a></span>
	        </div>
	        <div class="login-input-content">
	            <div class="login-input">
	                <label>用户名:</label>
	                <input type="text" placeholder="请输入用户名" name="info[username]" id="username" class="list-input">
	            </div>
	            <div class="login-input">
	                <label>登录密码:</label>
	                <input type="password" placeholder="请输入登录密码" name="info[password]" id="password" class="list-input">
	            </div>
	        </div>
	        <div id="loginBtn" class="login-button"><a href="javascript:void(0);" id="login-button-submit">登录会员</a></div>
	    </div>
	    <!-- 遮盖层 -->
	    <div id="bg" class="login-bg"></div>
	    <script>
	        // 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() {
	                mask.style.display = 'block';
	                login.style.display = 'block';
	            })
	            // 3. 点击 closeBtn 就隐藏 mask 和 login 
	        closeBtn.addEventListener('click', function() {
	                mask.style.display = 'none';
	                login.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);
	            })
	        })
	    </script>
	</body>
</html>

在这里插入图片描述

2. 元素可视区 client 系列

通过 client 系列的相关属性可以动态的得到该元素的边框大小、元素大小等

client系列属性作用
element.clientTop返回元素上边框的大小
element.clientLeft返回元素左边框的大小
element.clientWidth返回自身包括padding、内容区的宽度,不含边框,返回数值不带单位
element.clientHeight返回自身包括padding、内容区的高度,不含边框,返回数值不带单位

然后来个高大上的案例吧

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

flexible.js源码及解析

(function flexible (window, document) {
  // 获取html根元素
  var docEl = document.documentElement
  // dpr 物理像素比
  var dpr = window.devicePixelRatio || 1

  // adjust body font size 设置body字体大小
  function setBodyFontSize () {
  // 如果页面有body就设置字体大小
    if (document.body) {
      document.body.style.fontSize = (12 * dpr) + 'px'
    }
    else {
    // 如果页面中没有body这个元素,则我们页面主要的DOM元素加载完毕再去设置body的字体大小
      document.addEventListener('DOMContentLoaded', setBodyFontSize)
    }
  }
  setBodyFontSize();

  // set 1rem = viewWidth / 10    设置 html 元素的文字大小
  function setRemUnit () {
    var rem = docEl.clientWidth / 10
    docEl.style.fontSize = rem + 'px'
  }

  setRemUnit()

  // reset rem unit on page resize   当页面尺寸大小发生变化的时候,要重新设置rem的大小
  window.addEventListener('resize', setRemUnit)
  // pageshow 是重新加载页面触发的事件
  window.addEventListener('pageshow', function (e) {
  // e.persisted 返回的是true 就是说如果这个页面是从缓存取过来的页面,也需要从新计算一下rem 的大小
    if (e.persisted) {
      setRemUnit()
    }
  })

  // detect 0.5px supports   有些移动端的浏览器不支持0.5像素的写法
  if (dpr >= 2) {
    var fakeBody = document.createElement('body')
    var testElement = document.createElement('div')
    testElement.style.border = '.5px solid transparent'
    fakeBody.appendChild(testElement)
    docEl.appendChild(fakeBody)
    if (testElement.offsetHeight === 1) {
      docEl.classList.add('hairlines')
    }
    docEl.removeChild(fakeBody)
  }
}(window, document))
立即执行函数 (function(){})() 或者 (function(){}())

主要作用:创建一个独立的作用域

不需要调用,立即执行,里面所有的变量都是局部变量,不会有命名冲突的情况

3.元素滚动 scroll 系列

使用 scroll 系列的相关属性可以动态的得到该元素的大小、滚动距离等

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

(1)页面被卷去的头部

如果浏览器的高(或宽)度不足以显示整个页面,会自动出现滚动条,当滚动条向下滚动时,页面上面被隐藏掉的高度,称为页面被卷去的头部。滚动条在滚动时会触发onscroll事件

案例:仿淘宝固定右侧侧边栏

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, user-scalable=no,
		initial-sale=1.0, maximum-scale=1.0, minimum-scale=1.0"/>
		<title></title>
		<style>
			.slider-bar {
				position: absolute;
				left: 50%;
				top: 300px;
				margin-left: 600px;
				width: 45px;
				height: 130px;
				background-color: pink;
			}
			.w {
				width: 1200px;
				margin: 10px auto;
			}
			.header {
				height: 150px;
				background-color: purple;
			}
			.banner {
				height: 250px;
				background-color: skyblue;
			}
			.main {
				height: 1000px;
				background-color: yellowgreen;
			}
			span {
				display: none;
				position: absolute;
				bottom: 0;
			}
		</style>
	</head>
	<body>
	    <div class="slider-bar">
	        <span class="goBack">返回顶部</span>
	    </div>
	    <div class="header w">头部区域</div>
	    <div class="banner w">banner区域</div>
	    <div class="main w">主体部分</div>
	    <script>
	        //1. 获取元素
	        var sliderbar = document.querySelector('.slider-bar');
	        var banner = document.querySelector('.banner');
	        // banner.offestTop 就是被卷去头部的大小 一定要写到滚动的外面
	        var bannerTop = banner.offsetTop
	            // 当我们侧边栏固定定位之后应该变化的数值
	        var sliderbarTop = sliderbar.offsetTop - bannerTop;
	        // 获取main 主体元素
	        var main = document.querySelector('.main');
	        var goBack = document.querySelector('.goBack');
	        var mainTop = main.offsetTop;
	        // 2. 页面滚动事件 scroll
	        document.addEventListener('scroll', function() {
	            // console.log(11);
	            // window.pageYOffset 页面被卷去的头部
	            // console.log(window.pageYOffset);
	            // 3 .当我们页面被卷去的头部大于等于了 172 此时 侧边栏就要改为固定定位
	            if (window.pageYOffset >= bannerTop) {
	                sliderbar.style.position = 'fixed';
	                sliderbar.style.top = sliderbarTop + 'px';
	            } else {
	                sliderbar.style.position = 'absolute';
	                sliderbar.style.top = '300px';
	            }
	            // 4. 当我们页面滚动到main盒子,就显示 goback模块
	            if (window.pageYOffset >= mainTop) {
	                goBack.style.display = 'block';
	            } else {
	                goBack.style.display = 'none';
	            }
	        })
	    </script>
	</body>
</html>

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值