JavaScript常见的网页特效(元素样式相关属性)

特效样式

1、模态框拖曳效果

在这里插入图片描述

2、放大镜效果

在这里插入图片描述

3、固定侧边栏效果

在这里插入图片描述

4、上下图片无间断滚动

在这里插入图片描述

5、左右图片无间断滚动

在这里插入图片描述

如何实现这些效果呢?

我想介绍一下元素偏移量offset系列、元素可视区client系列、元素滚动scroll系列相关的知识。

元素偏移量offset系列

offset含义:offset的含义是偏移量,使用offset的相关属性可以动态地获取该元素的位置大小等。

属性说明
offsetLeft返回元素相对其带有定位的父元素左边框的偏移
offsetTop返回元素相对其带有定位的元素上方的偏移
offsetWidth返回自身的宽度(包括padding、边框和内容区域的宽度)。注意返回数值不带单位
offsetHeight返回自身的高度(包括padding、边框和内容区域的高度)。注意返回数值不带单位
offsetParent返回作为该元素带有定位元素的父级元素(如果父级都没有定位则返回body)

offset与style的区别

Offsetstyle
offset可以得到任意样式表中的样式值style只能得到行内样式表中的样式值
offset系列获得的数值是没有单位的style.width获得的是带有单位的字符串
offsetWidth包含padding、border、width的值style.width获得的是不包含padding、border的值
offsetWidth等属性是只读属性,只能获取不能赋值style.width是可读写属性,可以获取也可以赋值

案例

获取鼠标位置:鼠标指针在盒子内的坐标位置示意图分析。
在这里插入图片描述
效果展示
在这里插入图片描述
JavaScript代码如下

<!DOCTYPE html>
<html lang="en">
<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>Document</title>
</head>
<style>
    #box{
        position: absolute;
        top: 50px;
        left: 20px;
        background-color: pink;;
        width: 200px;
        height: 200px;

    }
</style>
<body>
    <div id="box"></div>
    <script>
        var box = document.querySelector('#box');
        //输出盒子的宽带和高度
        console.log(box.offsetWidth);
        console.log(box.offsetHeight);
        box.addEventListener('mousemove',function(e){
            //获取box的偏移量
            var left = box.offsetLeft;
            var top = box.offsetTop;
            console.log('偏移量:'+'('+left+','+top+')');
            //计算鼠标在box中的坐标
            var x = e.pageX-left;
            var y = e.pageY-top;
            console.log('x轴的坐标:'+x+','+'y轴的坐标:'+y);
        })
    </script>
</body>
</html>

元素可视区client系列

client系列:client中文意思是客户端,通过使用client系列的相关属性可以获取元素可视区的相关信息。

属性说明
clientLeft返回元素左边框的大小
clientTop返回元素上边框的大小
clientWidth返回自身的宽度(包含padding),内容区域的宽度(不含边框)。注意返回数值不带单位
clientHeight返回自身的高度(包含padding),内容区域的高度(不含边框)。注意返回数值不带单位

案例

获取元素client。

效果展示
在这里插入图片描述

JavaScript代码如下

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
      div {
        width: 200px;
        height: 200px;
        background-color: pink;
        overflow: auto;
        border: 10px solid red;
        padding: 10px;
      }
    </style>
  <body>
    <div>
      我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容
      我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容
      我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容
      我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容
      我是内容我是内容我是内容我是内容
    </div>
    <script>
      var div = document.querySelector('div');
      console.log(div.clientHeight);
      console.log(div.clientTop);
      console.log(div.clientLeft);

    </script>
  </body>
</html>

元素滚动scroll系列

scroll含义:scroll的含义是滚动,使用scroll系列的相关属性可以动态地获取该元素的滚动距离、大小等。

属性说明
scrollLeft返回被卷去的左侧距离,返回数值不带单位
scrollTop返回被卷去的上方距离,返回数值不带单位
scrollWidth返回自身的宽度,不含边框。注意返回数值不带单位
scrollHeight返回自身的高度,不含边框。注意返回数值不带单位

案例
获取scrollHeight。

效果展示
在这里插入图片描述

JavaScript代码如下

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
      div {
        width: 200px;
        height: 200px;
        background-color: pink;
        overflow: auto;
        border: 10px solid red;
        padding: 10px;
      }
    </style>
  <body>
    <div>
      我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容
      我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容
      我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容
      我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容我是内容
      我是内容我是内容我是内容我是内容
    </div>
    <script>
      var div = document.querySelector('div');
      console.log(div.scrollHeight);
    </script>
  </body>
</html>

如何实现上面那些效果呢

模态框拖曳效果代码实现

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<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>Document</title>
</head>
<style>
    /* 单击弹出遮罩层的样式 */
    .login-header{
        width: 100%;
        text-align: center;
        font-size: 20pt;
        position: absolute;
        cursor: pointer;
    }
    .modal{
        width: 500px;
        height: 200px;
        position: absolute;
        left: 50%;
        top: 50%;
        transform: translate(-50%,-50%);
        display: none;
        box-shadow: 0px 0px 20px #ddd;
        z-index: 999;
        cursor: move;
    }
    /* 表单结构 */
    .modal form{
        display: flex;
        flex-direction: column;
        width: 100%;
        height: 100%;
    }
    /* 表单标题 */
    .modal form .item1{
        flex: 1;
        display: flex;
        justify-content: center;
        align-items: center;
        font-weight: bold;
    }
    /* 表单的输入样式 */
    .modal form .item2{
        margin: 0 auto;
        width: 70%;
        display: flex;
        flex: 1;
        flex-direction: column;
        justify-content: space-around;
        align-items: center;
    }

    .username{
        margin-left: 16px;
    }
    /* 登录会员样式 */
    .vip{
        border: 1px solid #ccc;
        border-radius: 20px;
        padding: 3px 40px;
        background-color: orange;
        color: #fff;
    }
    /* 关闭按钮样式 */
    .close{
        position: absolute;
        right: -10px;
        top: -10px;
        border: 1px solid #ccc;
        width: 20px;
        height: 20px;
        text-align:center;
        line-height: 17px;
        border-radius: 50%;
        background-color: wheat;
        cursor: pointer;
    }
    /* 遮罩层样式 */
    .login-bg{
        position: absolute;
        left: 0;
        top: 0;
        width: 100%;
        height: 100%;
        background-color: #ccc;
        display: none;
    }
</style>
<body>
    <div class="login-bg"></div>
    <!-- //模态对话框 -->
    <div class="modal">
        <form>
            <div class="item1">登录会员</div>
            <div class="item2">
                <div class="username">
                    <label>
                        用户名:
                        <input type="text" name="uesername">
                    </label>
                </div>
                <div class="password">
                    <label>
                        登录密码:
                        <input type="password" name="password">
                    </label>
                </div>
            </div>
            <!-- 按钮 -->
            <div class="item1">
                <div class="vip">登录会员</div>
            </div>
        </form>
        <!-- 关闭按钮 -->
        <div class="close">x</div>
    </div>
    <div class="login-header">单击登录会员...</div>
    <script>

        var modal = document.querySelector('.modal');
        var close = document.querySelector('.close');
        var login = document.querySelector('.login-header');
        var bg = document.querySelector('.login-bg');

        //给遮罩层注册click事件
        login.addEventListener('click',function(){
            modal.style.display = 'block';
            bg.style.display = 'block';
            modal.style.backgroundColor = 'white';
        })
        //给close注册click事件
        close.addEventListener('click',function(){
            modal.style.display = 'none';
            bg.style.display = 'none';
        })
        //给modal注册mousedown事件
        modal.addEventListener('mousedown',function(e){
            //获取鼠标在模态框中的坐标
            var x = e.pageX - modal.offsetLeft;
            var y = e.pageY - modal.offsetTop;
            //定义移动函数
            var move = function(e){
                modal.style.left = e.pageX - x + 'px';
                modal.style.top = e.pageY - y + 'px';
            }
            //给文档对象注册鼠标移动事件
            document.addEventListener('mousemove',move);
            //给文档注册鼠标弹起事件
            document.addEventListener('mouseup',function(){
                document.removeEventListener('mousemove',move);
            })
        })
    </script>
</body>
</html>

放大镜效果代码实现

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>放大镜</title>
  <style>
    #magnifying {
      display: block;
      width: 400px;
      height: 400px;
      margin: 50px;
      position: relative;
      border: 1px solid rgba(122, 74, 74, 0.05);
    }
    #origin {
      position: relative;
    }
    #float {
      display: none;
      width: 200px;
      height: 200px;
      background: #1d882c;
      border: 1px solid rgb(145, 58, 58);
      filter: alpha(opacity=30);
      opacity: 0.3;
      position: absolute;
      overflow: hidden;
    }
 
    #mark {
      position: absolute;
      display: block;
      width: 400px;
      height: 400px;
      z-index: 10;
      cursor: move;
    }
 
    #zoom {
      display: none;
      position: absolute;
      top: 0;
      left: 420px;
      width: 400px;
      height: 400px;
      overflow: hidden;
    }
    #zoom img {
      position: absolute;
      z-index: 5
    }
  </style>
 
</head>
<body>
<div id="magnifying">
  <div id="origin">
    <div id="mark"></div>
    <div id="float"></div>
    <img width="400px" src="../../2021-9-25/2021-11-28/document/phone.png"/>
  </div>
  <div id="zoom">
    <img src="../../2021-9-25/2021-11-28/document/bigphone.png"/>
  </div>
</div>
<script>

  window.onload = function () {
    var Magnifying = document.querySelector("#magnifying");
    var Origin = document.querySelector("#origin");
    var Mark = document.querySelector("#mark");
    var Float = document.querySelector("#float");
    var Zoom = document.querySelector("#zoom");
    var ZoomImage = Zoom.getElementsByTagName("img")[0];
 
    Mark.addEventListener('mouseover',function () {
      Float.style.display = "block";
      Zoom.style.display = "block";
    });
 
    Mark.addEventListener('mouseout',function () {
      Float.style.display = "none";
      Zoom.style.display = "none";
    });
 
    Mark.addEventListener('mousemove',function (e) {
 
      var _event = e || window.event;  //兼容多个浏览器的event参数模式
      //计算鼠标中心点的坐标
      var left = _event.clientX - Magnifying.offsetLeft - Origin.offsetLeft - Float.offsetWidth / 2;
      var top = _event.clientY - Magnifying.offsetTop - Origin.offsetTop - Float.offsetHeight / 2;
 
      //判断鼠标中心点是否在图片内部
      if (left < 0) {
        left = 0;
      } else if (left > (Mark.offsetWidth - Float.offsetWidth)) {
        left = Mark.offsetWidth - Float.offsetWidth;
      }
      if (top < 0) {
        top = 0;
      } else if (top > (Mark.offsetHeight - Float.offsetHeight)) {
        top = Mark.offsetHeight - Float.offsetHeight;
 
      }
 
      Float.style.left = left + "px";
      Float.style.top = top + "px";
      //求相对位置
      var percentX = left / (Mark.offsetWidth - Float.offsetWidth);
      var percentY = top / (Mark.offsetHeight - Float.offsetHeight);
      console.log(percentX);
      //方向相反,故而是负值
      ZoomImage.style.left = -percentX * (ZoomImage.offsetWidth - Zoom.offsetWidth) + "px";
      ZoomImage.style.top = -percentY * (ZoomImage.offsetHeight - Zoom.offsetHeight) + "px";
    });
  }
</script>
</body>
</html>

固定侧边栏效果代码实现

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<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>Document</title>
</head>
<style>
    .w{
        width: 70%;
        margin: 0 auto;
        margin-top: 10px;
    }
    .header{
        height: 100px;
        background-color: red;
    }
    .bananer{
        height: 200px;
        background-color: pink;
    }
    .main{
        height: 1267px;
        background-color: orange;
    }
    .slider-bar{
        width: 70px;
        height: 70px;
        background-color: yellow;
        position: absolute;
        left: 85%;
        top: 330px;
    }
    .goBack{
        display: none;
        position: absolute;
        bottom: 30px;
        cursor: pointer;
    }
</style>
<body>
    <div class="header w">头部区域</div>
    <div class="bananer w">bananer区域</div>
    <div class="main w">主体区域</div>
    <div class="slider-bar">
        <span class="goBack">返回顶部</span>
    </div>
    <script>
        var header = document.querySelector('.header');
        var bananer = document.querySelector('.bananer');
        var slider = document.querySelector('.slider-bar');
        var goBack = document.querySelector('.goBack');
        goBack.addEventListener('click',function(){
            window.scrollTo(0,0);
        })
        document.addEventListener('scroll',function(){
            //获取页面顶部和左侧卷去了多少
            slider.style.top = window.pageYOffset;
            if(window.pageYOffset>(header.scrollHeight+bananer.scrollHeight+30)){
                goBack.style.display = 'block';
                slider.style.position = 'fixed';
                slider.style.left = '85%';
                slider.style.top = '0px';
            }else{
                slider.style.position = 'absolute';
                slider.style.left = '85%'
                slider.style.top = (header.scrollHeight+bananer.scrollHeight+30)+'px'
                goBack.style.display = 'none';
            }
        })
    </script>
</body>
</html>

上下图片无间断滚动代码实现

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>上下无间断滚动</title>

<body>
<div id="demo" style=" margin-left: 300px; overflow:hidden;height:500px;width:220px; border:1px solid #dde5bc; overflow:hidden;float:left">
	<div id=demo1> 
	<img src="../../../11-27/1.gif" width="220" height="360">
	<img src="../../../11-27/2.gif" width="220" height="360"> 
	<img src="../../../11-27/3.gif" width="220" height="360">
	<img src="../../../11-27/4.gif" width="220" height="360">
	<img src="../../../11-27/5.gif" width="220" height="360">
	</div>
	<div id=demo2></div>
</div>
<script>
	var speed=10
	var demo=document.getElementById("demo");
	var demo2=document.getElementById("demo2");
	var demo1=document.getElementById("demo1");
	demo2.innerHTML=demo1.innerHTML
	function Marquee(){
		if(demo2.offsetTop-demo.scrollTop<=0)
		demo.scrollTop-=demo1.offsetHeight
		else{
		demo.scrollTop++
	}
	}
	var MyMar=setInterval(Marquee,speed)
	demo.onmouseover=function() {clearInterval(MyMar)}
	demo.onmouseout=function() {MyMar=setInterval(Marquee,speed)}
</script>
</body>
</html>

左右图片无间断滚动代码实现

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>左右图片滚动</title>
</head>
<style type="text/css">
    #demo {
    background: #FFF;
    overflow:hidden;
    border: 1px dashed #CCC;
    width: 1000px;
    }
    #demo img {
        width: 220px;
        height: 360px;
    border: 3px solid #F2F2F2;
    }
    #indemo {
    float: left;
    width: 800%;
    }
    #demo1 {
    float: left;
    }
    #demo2 {
    float: left;
    }
    </style>
<body>
<div id="demo">
<div id="indemo">
<div id="demo1">
<a href="#"><img src="../../../11-27/1.gif" border="0" /></a>
<a href="#"><img src="../../../11-27/2.gif" border="0" /></a>
<a href="#"><img src="../../../11-27/3.gif" border="0" /></a>
<a href="#"><img src="../../../11-27/4.gif" border="0" /></a>
<a href="#"><img src="../../../11-27/5.gif" border="0" /></a>
</div>
<div id="demo2"></div>
</div>
</div>
<script>
var speed=10;
var tab=document.getElementById("demo");
var tab1=document.getElementById("demo1");
var tab2=document.getElementById("demo2");
tab2.innerHTML=tab1.innerHTML;
function Marquee(){
if(tab2.offsetWidth-tab.scrollLeft<=0)
tab.scrollLeft-=tab1.offsetWidth
else{
tab.scrollLeft++;
}
}
var MyMar=setInterval(Marquee,speed);
tab.onmouseover=function() {clearInterval(MyMar)};
tab.onmouseout=function() {MyMar=setInterval(Marquee,speed)};

</script>
</body>
</html>
  • 8
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
第13章 HTML/CSS样式 503 13.1 页面效果 504 实例317 统一站内网页风格 504 实例318 设置超级链接文字的样式 508 实例319 网页换肤 509 实例320 滚动文字 512 实例321 制作渐变背景 513 13.2 表格样式 514 实例322 只有外边框的表格 515 实例323 彩色外边框的表格 516 实例324 控制表格指定外边框不显示 518 实例325 背景颜色渐变的表格 520 实例326 表格隔行变色 521 13.3 鼠标及滚动条样式 522 实例327 显示自定义鼠标形状 522 实例328 动画光标 524 实例329 制作彩色滚动条 525 13.4 文字及列表样式 527 实例330 应用删除线样式标记商品特价 527 实例331 在文字上方标注说明标记 528 实例332 指定图标的列表项 529 13.5 文字滤镜特效 530 实例333 文字的发光效果 531 实例334 文字的阴影效果 532 实例335 文字的渐变阴影效果 533 实例336 文字的图案填充效果 534 实例337 文字的探照灯效果 535 实例338 文字的闪烁效果 537 实例339 文字的空心效果 538 实例340 文字的浮雕效果 539 实例341 文字的阳文效果 540 实例342 文字的雪雕效果 541 实例343 火焰字 542 实例344 文字扭曲动画 544 13.6 图片滤镜特效 545 实例345 图片的半透明效果 545 实例346 图片的模糊效果 546 实例347 图片的水波纹特效 547 实例348 图片的灰度效果 548 实例349 图片的动态说明文字 549 第14章 JavaScript与XML 553 14.1 读取XML文件 554 实例350 使用XML DOM对象读取XML文件 554 实例351 使用XMLHttpRequest对象读取XML文件 557 14.2 显示XML文档 559 实例352 使用CSS显示XML文档 559 实例353 使用XSL显示XML文档 562 实例354 使用IE XML数据岛输出XML文档 564 14.3 操作XML 565 实例355 用JavaScript控制XML文档的分页显示 565 实例356 通过操作XML数据岛实现添加、删除留言信息 567 第15章 JavaScript与ASP结合 573 15.1 弹出窗口/对话框控制 574 实例357 关闭弹出窗口时刷新父窗口 574 实例358 打开新窗口显示详细信息 575 实例359 弹出网页模式对话框 577 实例360 日期选择器 580 实例361 弹出提示对话框并重定向网页 584 实例362 打开指定大小的新窗口并居中显示 586 15.2 弹出确认对话框 588 实例363 删除数据前弹出确认对话框 588 实例364 安全退出前弹出确认对话框 590 15.3 其他 591 实例365 远程获取其他网页情报 591 实例366 树状导航菜单 594 实例367 使用XML实现不刷新页面查询数据 596 第16章 JavaScript与JSP结合 601 16.1 窗口与对话框 602 实例368 弹出提示对话框并重定向网页 602 实例369 打开新窗口显示详细信息 604 实例370 打开指定大小的新窗口并居中显示 605 实例371 弹出网页模式对话框 607 实例372 关闭弹出窗口时刷新父窗口 609 16.2 无刷新技术 611 实例373 无刷新的用户名检测 611 实例374 无刷新的级联下拉列表 614 实例375 使用XML实现不刷新页面查询数据 616 16.3 调用与控制 619 实例376 将查询结果导出到Word 619 实例377 调用Excel 621 实例378 调用PowerPoint 622 16.4 其他 623 实例379 树状导航菜单 623 第17章 JavaScript与ASP.NET结合 627 17.1 窗口与对话框 628 实例380 使用JavaScript脚本弹出对话框 628 实例381 打开新窗口显示详细信息 629 实例382 关闭弹出窗口刷新父窗口 631 实例383 弹出网页模式对话框 633 实例384 弹出全屏显示网页 635 17.2 其他 637 实例385 自动隐藏式菜单 637 第18章 JavaScript与PHP结合 641 18.1 窗口与对话框 642 实例386 弹出提示对话框并重定向网页 642 实例387 关闭弹出窗口时自动刷新父窗口 643 实例388 在弹出的网页模式对话框中选择个性头像 645 实例389 时间选择器 647 实例390 弹出提示对话框并重定向网页 649 实例391 删除数据前弹出确认对话框 650 18.2 其他 651 实例392 树状导航菜单 651 第19章 综合应用 657 19.1 计算器 658 实例393 简单计算器 658 实例394 复杂计算器 662 19.2 日历 667 实例395 精美日历 668 实例396 带农历的日历 674 19.3 购物车 681 实例397 添加至购物车 682 实例398 查看购物车 684 实例399 修改商品购买数量 686 实例400 从购物车中移去指定商品 687 实例401 清空购物车 689
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力做一只合格的前端攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值