HTML+JavaScript+CSS DIY 分隔条splitter

news2025/1/22 21:57:16

一、需求分析

现在电脑的屏幕越来越大,为了利用好宽屏,我们在设计系统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。

<!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>

三、编写代码

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

	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()用于双击分隔条隐藏左边的内容,比如菜单或选项,尽可能显示右边的内容。

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

(三)双击分隔条代码

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

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

	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)

(四)拖放分隔条代码

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

    // 拖动分隔条操作
    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)  

四、改进显示

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

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

	<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 来实现:

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

效果如下:

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

(二)超出部分隐藏

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

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

效果如下:

<!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.coloradmin.cn/o/966167.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TuyaOS开发学习笔记(1)——NB-IoT开发搭建环境、编译烧写(MT2625)

一、搭建环境 1.1 官方资料 TuyaOS 1.2 安装VMware 官网下载&#xff1a;https://customerconnect.vmware.com/en/downloads/info/slug/desktop_end_user_computing/vmware_workstation_pro/16_0 百度网盘&#xff1a;https://pan.baidu.com/s/1oN7H81GV0g6cD9zsydg6vg 提取…

【Redis从头学-完结】Redis全景思维导图一览!耗时半个月专为Redis初学者打造!

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;CSDN实力新星&#xff0c;后端开发两年经验&#xff0c;曾担任甲方技术代表&#xff0c;业余独自创办智源恩创网络科技工作室。会点点Java相关技术栈、帆软报表、低代码平台快速开…

C语言入门 Day_12 一维数组0

目录 前言 1.创建一维数组 2.使用一维数组 3.易错点 4.思维导图 前言 存储一个数据的时候我们可以使用变量&#xff0c; 比如这里我们定义一个记录语文考试分数的变量chinese_score&#xff0c;并给它赋值一个浮点数&#xff08;float&#xff09;。 float chinese_scoe…

2023应届生java面试紧张失误之一:CAS口误说成开心锁-笑坏面试官

源于&#xff1a;XX网&#xff0c;如果冒犯&#xff0c;表示歉意 面试官&#xff1a;什么是CAS 我&#xff1a;这个简单&#xff0c;开心锁 面试官&#xff1a;WTF&#xff1f; 我&#xff1a;一脸自信&#xff0c;对&#xff0c;就是这个 面试官&#xff1a;哈哈大笑&#xff…

YOLOv7框架解析

YOLOv7概念 YOLOv7是基于YOLO系列的目标检测算法&#xff0c;由Ultra-Light-Fast-Detection&#xff08;ULFD&#xff09;和Scaled-YOLOv4两种算法结合而来。它是一种高效、准确的目标检测算法&#xff0c;具有以下特点&#xff1a; 1. 高效&#xff1a;YOLOv7在保持准确率的…

一个 MySQL 数据库死锁的案例和解决方案

本文介绍了一个 MySQL 数据库死锁的案例和解决方案。 场景 生产环境出了一个偶现的数据库死锁问题&#xff0c;导致少部分业务处理失败。 分析特征之后&#xff0c;发现是多个线程并发执行同一个方法&#xff0c;更新关联的数据时可能会出现&#xff0c;把场景简化概括一下&…

MySQL基础篇:数据库概述和部署

SQL 概述 SQL&#xff0c;一般发音为sequel&#xff0c;SQL的全称Structured Query Language)&#xff0c;SQL用来和数据库打交道&#xff0c;完成和数据库的通信&#xff0c;SQL是一套标准。但是每一个数据库都有自己的特性别的数据库没有,当使用这个数据库特性相关的功能,这…

CDH6.3.2集成Kerberos

CDH6.3.2集成Kerberos 一.参考doc CDH enable kerberos: Kerberos Security Artifacts Overview | 6.3.x | Cloudera Documentation CDH disable kerberos:https://www.sameerahmad.net/blog/disable-kerberos-on-CDH; https://community.cloudera.com/t5/Support-Questions…

ModaHub魔搭社区:自动化机器学习神器Auto-Sklearn

Auto-Sklearn Auto-Sklearn是一个开源库,用于在 Python 中执行 AutoML。它利用流行的 Scikit-Learn 机器学习库进行数据转换和机器学习算法。 它是由Matthias Feurer等人开发的。并在他们 2015 年题为“efficient and robust automated machine learning 高效且稳健的自动…

LeetCode刷题---Two Sum(一)

文章目录 &#x1f340;题目&#x1f340;解法一&#x1f340;解法二&#x1f340;哈希表 &#x1f340;题目 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每…

javaee spring aop 注解实现

切面类 package com.test.advice;import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*;//切面类 Aspect public class MyAdvice {//定义切点表达式Pointcut("execution(* com.test.service.impl.*.add(..))")public void pc(){}//B…

Spring-Kafka生产者源码分析

文章目录 概要初始化消息发送小结 概要 本文主要概括Spring Kafka生产者发送消息的主流程 代码准备&#xff1a; SpringBoot项目中maven填加以下依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent&…

大胆尝试这些新的CSS属性,释放CSS的力量吧(一)

本文章系《Unleashing the Power of CSS》&#xff08;释放CSS的力量&#xff0c;暂且这么翻译吧&#xff09;一书的学习笔记&#xff0c;希望通本书的学习&#xff0c;系统的梳理下CSS相关的高级新特性。本篇文章是其第一部分&#xff0c;由于全书英文版&#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让输入两…

MySQL开机自启动设置(Windows)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

黑马 软件测试从0到1 常用分类 模型 流程 用例

课程内容&#xff1a; 1、软件测试基础 2、测试设计 3、缺陷管理 4、Web常用标签 5、项目实战 以终为始&#xff0c;由交付实战目标为终&#xff0c;推出所学知识&#xff1b;从认识软件及软件测试&#xff0c;到如何设计测试、缺陷标准及缺陷管理&#xff0c;最终以项目实战贯…

pytorch异常——loss异常,不断增大,并且loss出现inf

文章目录 异常报错异常截图异常代码原因解释修正代码执行结果 异常报错 epoch1:loss3667.782471 epoch2:loss65358620.000000 epoch3:loss14979486720.000000 epoch4:loss1739650891776.000000 epoch5:loss12361745880317952.000000 epoch6:loss2740315398365287284736.000000…

PMD代码检查:为了提升性能,正确使用记录日志的语句(GuardLogStatement)

https://docs.pmd-code.org/pmd-doc-6.55.0/pmd_rules_java_bestpractices.html#guardlogstatement 对应记录日志的语句&#xff0c;要首先检查对应的日志级别有没有实际打开&#xff1b;如果没有实际打开&#xff0c;那么就要跳过字符串的生成环节&#xff0c;以提升性能。 另…

C#,数值计算——Midsql的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class Midsql : Midpnt { private double aorig { get; set; } 0.0; public new double func(double x) { return 2.0 * x * funk.funk(aorig x * x); } p…

MySQL中表的设计

在MySQL中表的设计&#xff0c;需要一定的经验才能理解&#xff0c;由于笔者目前在读中&#xff0c;理解不是很深刻&#xff0c;仅根据自己的想法外界的一些参考资料做出下述文字描述&#xff0c;一些错误&#xff0c;请大佬及时指正~~ 在本篇文章中&#xff0c;介绍一点简单粗…