HTML+JavaScript+CSS DIY 分隔条splitter

news/2024/6/29 12:02:29 标签: html, javascript, css, 系统UI, 分隔条, splitter, 网页设计
htmledit_views">

一、需求分析

现在电脑的屏幕越来越大,为了利用好宽屏,我们在设计系统UI时喜欢在左侧放个菜单或选项面板,在右边显示与菜单或选项对应的内容,两者之间用分隔条splitter来间隔,并可以通过拖动分隔条splitter来动态调研左右两边的宽度。

要在网页上实现这种UI界面,也有不少现成的组件,比如jQuery中提供的Splitter.js,不过自已用HTML+JavaScript+CSS来DIY一下,从而加深对HTML+JavaScript+CSS的了解,也是不错的选择。

二、构造界面

首先我们来打造界面。在id 为divMain 的<div>中,左边有一个id 为 divLeft的<div>,右边有一个左边有一个id 为 divRight的<div>,两者中间有一个id为divSplitter 的<div>作为分隔条splitter

html"><!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
	<meta name="Generator" content="EditPlus®">
	<meta name="Author" content="PurpleEndurer">
	<meta name="Keywords" content="HTML,JavaScript,CSS,DIY,分隔条,splitter,演示">
	<meta name="Description" content="HTML+JavaScript+CSS DIY 分隔条演示splitter">
    <title>HTML+JavaScript+CSS DIY 分隔条演示splitter</title>
    <style>
        #divMain {
            position: relative;
            width: 800px;
            height: 300px;
        }

        #divLeft {
            width: 200px;
            background: #ffff99;
            position: absolute;
            top: 0;
            bottom: 0;
        }

        #divRight {
            margin-left: 210px;
            background: #ccffcc;
            height: 100%;
        }

		#divSplitter {
            position: absolute;
            top: 0;
            bottom: 0;
            left: 200px;
            width: 10px;
            background: #e7e7e7;
            box-shadow: 0px 0px 8px #ccc;
            cursor: w-resize;
	    vertical-align:middle;
        }

		p.title {
			background: #ccccff; 
			color:yellow;
			border-top:1px solid purple;
			border-left:1px solid purple;
			text-align:center;
			width: 800px;
			margin: 0px;
    }
    </style>
</head>

<body>
  <p class="title">HTML+JavaScript+CSS分隔条演示splitter</p>
  
    <div id="divMain">
        <div id="divLeft">left:0123456789abcdefghijklmnopqrstuvwxyz</div>
        <div id="divRight">right:0123456789abcdefghijklmnopqrstuvwxyz</div>
        <!-- 分隔条 -->
        <div id="divSplitter" title="我是分隔条,可以双击我^_^"></div>
    </div>
</body>

</html>

三、编写代码

(一)定义全局变量和常量

javascript">	var	divMain	    = document.getElementById('divMain'),
		divLeft		= document.getElementById('divLeft'),
		divRight	= document.getElementById('divRight'),
		divSplitter	= document.getElementById('divSplitter');

	// 改变分隔条左右宽度所需常量
    const	divOrgLeftWidth	    = 200,  // 左边部分原始宽度
			rightDivLeftGap	    = 10,  // 右边部分与左边部分的距离
			divSplitterMinLeft	= 20, // 分隔条左边部分最小宽度
			divSplitterMaxLeft	= 780;// 分隔条左边部分最大宽度

 (二)挂接鼠标事件

在windows.onload中挂接divSplitter的onmousedown()和ondblclick(),其中onmousedown()用于拖放分隔条,ondblclick()用于双击分隔条隐藏左边的内容,比如菜单或选项,尽可能显示右边的内容。

javascript">    window.onload = function ()
	{
        divSplitter.onmousedown = splitDiv;
		divSplitter.ondblclick = hideOrShowLeft;
    };

(三)双击分隔条代码

当用户双击分隔条时,我们就隐藏左边的内容,比如菜单或选项,为右边的内容提供更大显示范围。

这里我们需要先判断左边否已经处于隐藏状态,如果左边否已经处于隐藏状态,那么就恢复到系统默认状态,否则就将左边的内容隐藏起来,尽可能显示右边的内容。

javascript">	function hideOrShowLeft(e)
	{
		if ('none'==divLeft.style.display)
		{
			divLeft.style.display = 'block';
			divLeft.style.width = divSplitter.style.left = divOrgLeftWidth + 'px';
			divSplitter.innerHTML = '';
			divRight.style.marginLeft = '210px';
		}
		else
		{
			divLeft.style.display = 'none';
            divSplitter.style.left = '0px';
			divSplitter.innerHTML ='<p style="padding-top:100px;"><span style="color:red; font-size:16pt;">&gt;</span></p>';
            divRight.style.marginLeft = '10px';
		}
		return false;
	}//	 hideOrShowLeft(e)

(四)拖放分隔条代码

在响应鼠标拖放事件时,我们首先要判断左边否已经处于隐藏状态,如果左边否已经处于隐藏状态,那么就恢复到系统默认状态,否则进行拖放操作:

javascript">    // 拖动分隔条操作
    function splitDiv(e)
	{
		if ('none'==divLeft.style.display)
		{
			hideOrShowLeft();
			return false;
		}
        // 记录下初始位置的值
        var disX = e.clientX;
        divSplitter.left = divSplitter.offsetLeft;

        document.onmousemove = function (e) 
		{
            var moveX = e.clientX - disX;   // 鼠标拖动的偏移距离
            var iT = divSplitter.left + moveX,    // 分隔条相对父级定位的 left 值
                maxT = divMain.clientWidth - divSplitter.offsetWidth;

            //iT < 0 && (iT = 0);
            //iT > maxT && (iT = maxT);
			if (iT < 0)
			{
				iT = 0;
			}
			else
			{
				if (iT > maxT)
				{
					iT = maxT;
				}
			}

            if (iT > divSplitterMinLeft && iT < divSplitterMaxLeft)
			{
				divLeft.style.width = divSplitter.style.left = iT + 'px';
				divRight.style.marginLeft = iT + rightDivLeftGap + 'px';
			}	//document.onmousemove()

            return false;
        };

        // 鼠标放开的时候取消操作
        document.onmouseup = function ()
		{
            document.onmousemove = null;
            document.onmouseup = null;
        };	  // document.onmouseup()
    }//splitDiv(e)  

四、改进显示

上面的演示代码中,左右两边显示的内容都比较短。实际应用中,两边显示的内容多。

当我们把代码界面定义改为:

html">	<p class="title">HTML+JavaScript+CSS分隔条演示splitter by PurpleEndurer</p>

	<div id="divMain">
        <div id="divLeft">left:0123456789abcdefghijklmnopqrstuvwxyz</div>
        <div id="divRight">right:0123456789abcdefghijklmnopqrstuvwxyz</div>
        <!-- 分隔条 -->
        <div id="divSplitter" title="我是分隔条,可以双击我^_^"></div>
	</div>

问题就来了:

两边的内容会重叠。

我们需要通过css来解决这个问题。

解决方法有两种:

(一)让内容自动换行

利用word-wrap 来实现:

html"><style>
		div	{
			word-wrap: break-word; /*自动换行*/
		}

效果如下:

当内容较多时,自动换行显示效果并不是很好。所以我们更喜欢用下面的另一种方法 。

(二)超出部分隐藏

要隐藏超出部分,需要用到display、overflow等几个属性:

html">		div	{
			display: -webkit-box;  /*  将对象作为弹性伸缩盒子模型显示  */
			-webkit-box-orient: vertical; /* 设置或检索伸缩盒对象的子元素的排列方式  */
			overflow: hidden;/* 超出部分隐藏  */
		}

效果如下:

html"><!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
	<meta name="Generator" content="EditPlus®">
	<meta name="Author" content="PurpleEndurer">
	<meta name="Keywords" content="HTML,JavaScript,CSS,DIY,分隔条,splitter,演示">
	<meta name="Description" content="HTML+JavaScript+CSS DIY 分隔条演示splitter">
    <title>HTML+JavaScript+CSS DIY 分隔条演示splitter</title>
    <style>
		div	{
			/*--word-wrap:break-word; 自动换行 */
			display: -webkit-box;  /*  将对象作为弹性伸缩盒子模型显示  */
			-webkit-box-orient: vertical; /* 设置或检索伸缩盒对象的子元素的排列方式  */
			overflow: hidden;/* 超出部分隐藏  */
		}
        #divMain {
            position: relative;
            width: 800px;
            height: 300px;
            /*margin: 20px auto;*/
        }

        #divLeft {
            width: 200px;
            background: #ffff99;
            position: absolute;
            top: 0;
            bottom: 0;
        }

        #divRight {
            margin-left: 210px;
            background: #ccffcc;
            height: 100%;
        }

        #divSplitter {
            position: absolute;
            top: 0;
            bottom: 0;
            left: 200px;
            width: 10px;
            background: #e7e7e7;
            box-shadow: 0px 0px 8px #ccc;
            cursor: w-resize;
	    vertical-align:middle;
        }

    p.title {
          background: #ccccff; 
          color:yellow;
          border-top:1px solid purple;
          border-left:1px solid purple;
          text-align:center;
	  width: 800px;
	  margin: 0px;
    }
    </style>
</head>

<body>
  <p class="title">HTML+JavaScript+CSS分隔条演示splitter</p>
  
    <div id="divMain">
        <div id="divLeft">left:0123456789abcdefghijklmnopqrstuvwxyz</div>
        <div id="divRight">right:0123456789abcdefghijklmnopqrstuvwxyz</div>
        <!-- 分隔条 -->
        <div id="divSplitter" title="我是分隔条,可以双击我^_^"></div>
    </div>
</body>
<script>
    // 改变分隔条左右宽度所需常量
    const divOrgLeftWidth = 200;  // 左边部分原始宽度
    const rightDivLeftGap = 10;//20;  // 右边部分与左边部分的距离
    //const divSplitterWidth = 10; // 分隔条宽度
    const divSplitterMinLeft = 20; // 分隔条左边部分最小宽度
    const divSplitterMaxLeft = 780;// 分隔条左边部分最大宽度

    var divMain = document.getElementById('divMain'),
        divLeft = document.getElementById('divLeft'),
        divRight = document.getElementById('divRight'),
        divSplitter = document.getElementById('divSplitter');


	function hideOrShowLeft(e)
	{
		if ('none'==divLeft.style.display)
		{
			divLeft.style.display = 'block';
			divLeft.style.width = divSplitter.style.left = divOrgLeftWidth + 'px';
			divSplitter.innerHTML = '';
			divRight.style.marginLeft = '210px';
		}
		else
		{
			divLeft.style.display = 'none';
            divSplitter.style.left = '0px';
			divSplitter.innerHTML ='<p style="padding-top:100px;"><span style="color:red; font-size:16pt;">&gt;</span></p>';
            divRight.style.marginLeft = '10px';
		}
		return false;
	}

    // 分隔条操作
    function splitDiv(e)
	{
		if ('none'==divLeft.style.display)
		{
			hideOrShowLeft();
			return false;
		}
        // 记录下初始位置的值
        var disX = e.clientX;
        divSplitter.left = divSplitter.offsetLeft;

        document.onmousemove = function (e) 
		{
            var moveX = e.clientX - disX;   // 鼠标拖动的偏移距离
            var iT = divSplitter.left + moveX,    // 分隔条相对父级定位的 left 值
                maxT = divMain.clientWidth - divSplitter.offsetWidth;

            //iT < 0 && (iT = 0);
            //iT > maxT && (iT = maxT);
			if (iT < 0)
			{
				iT = 0;
			}
			else
			{
				if (iT > maxT)
				{
					iT = maxT;
				}
			}

            if (iT > divSplitterMinLeft && iT < divSplitterMaxLeft)
			{
				divLeft.style.width = divSplitter.style.left = iT + 'px';
				divRight.style.marginLeft = iT + rightDivLeftGap + 'px';
			}

            return false;

        };

        // 鼠标放开的时候取消操作
        document.onmouseup = function ()
		{
            document.onmousemove = null;
            document.onmouseup = null;
        };
    }//

    window.onload = function ()
	{
        divSplitter.onmousedown = splitDiv;
		divSplitter.ondblclick = hideOrShowLeft;
    };
</script>
</html>

五、完整代码

完整的代码已上传资源区等待审核。


http://www.niftyadmin.cn/n/4995834.html

相关文章

Flink实时计算中台Kubernates功能改造点

背景 平台为数据开发人员提供基本的实时作业的管理功能,其中包括jar、sql等作业的在线开发;因此中台需要提供一个统一的SDK支持平台能够实现flink jar作业的发布;绝大多数情况下企业可能会考虑Flink On Yarn的这个发布模式,但是伴随云原生的呼声越来越大,一些企业不希望部…

day31 集合

一、Collection 创建对象 Collection c3 new HashSet(); //元素不可重复 无序 Collection c1 new ArrayList(); //元素可重复 有序collection方法 c.add() 添加引用类型数据 c.addAll() 添加collection对象 c.isEmpty() 判断是否为空 c.clear() 清空所有类容 c.…

相机成像原理【二】

文章目录 1、小孔成像的缺陷1.1 引入透镜 2、薄透镜成像原理2.1 薄透镜工作原理2.2 光线穿过透镜如何前进2.3 光线追踪 3、薄透镜成像公式3.1 高斯成像公式3.2 物距、像距、放大率之间特殊的关系 4、透镜成像特性4.1 对焦4.2 景深 1、小孔成像的缺陷 小孔尺寸过小&#xff0c;图…

yo!这里是c++中的继承

目录 前言 概念定义 基类与派生类对象转换 作用域 派生类的默认成员函数 与友元&&与静态成员 菱形继承及菱形虚拟继承 多继承 菱形继承 虚拟继承 1.介绍 2.原理 继承总结 后记 前言 封装、继承、多态作为c的三大特性&#xff0c;在学完封装的有关内容之后…

mac制作ssl证书|生成自签名证书,nodejs+express在mac上搭建https+wss(websocket)服务器

注意 mac 自带 openssl 所以没必要像 windows 一样先安装 openssl&#xff0c;直接生成即可 生成 ssl/自签名 证书 生成 key # 生成rsa私钥&#xff0c;des3算法&#xff0c;server_ssl.key是秘钥文件名 1024位强度 openssl genrsa -des3 -out server_ssl.key 1024让输入两…

Docker部署pyspider webui显示页面太小的解决方法

进入docker容器&#xff0c;输入以下指令来获取pyspider的位置 python -c "import pyspider;print(pyspider)"如图所示 然后进入到 /opt/pyspider/pyspider/webui/static 修改debug.min.css vi debug.min.css使用vi的查找命令&#xff0c;然后回车。即可找到该样…

Python所有方向的学习路线图!!

学习路线图上面写的是某个方向建议学习和掌握的知识点汇总&#xff0c;举个例子&#xff0c;如果你要学习爬虫&#xff0c;那么你就去学Python爬虫学习路线图上面的知识点&#xff0c;这样学下来之后&#xff0c;你的知识体系是比较全面的&#xff0c;比起在网上找到什么就学什…

Docker快速安装Mysql

1、搭建Linux环境 Vagrant VirtualBox CentOS7 WindTerm 5分钟搭建本地linux开发环境 2、安装Docker 清理Docker目录 $ sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \dock…