HTML+JavaScript+CSS DIY 分隔条splitter

简介: HTML+JavaScript+CSS DIY 分隔条splitter

、需求分析

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

image.png 三、编写代码

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

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;">></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)

image.png

四、改进显示

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

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

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

问题就来了:  

image.png

两边的内容会重叠。

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

解决方法有两种:

(一)让内容自动换行

利用word-wrap 来实现:

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

 效果如下:

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

(二)超出部分隐藏

要隐藏超出部分,需要用到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;">></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>

五、完整代码

HTML+JavaScript+CSS DIY 分隔条splitter代码

相关文章
|
21天前
|
JavaScript 前端开发 Go
CSS 与 JS 对 DOM 解析和渲染的影响
【10月更文挑战第16天】CSS 和 JS 会在一定程度上影响 DOM 解析和渲染,了解它们之间的相互作用以及采取适当的优化措施是非常重要的。通过合理的布局和加载策略,可以提高网页的性能和用户体验,确保页面能够快速、流畅地呈现给用户。在实际开发中,要根据具体情况进行权衡和调整,以达到最佳的效果。
|
7天前
|
移动开发 前端开发 JavaScript
[HTML、CSS]细节与使用经验
本文总结了前端开发中的一些重要细节和技巧,包括CSS选择器、定位、层级、全局属性、滚轮控制、轮播等。作者以纯文字形式记录,便于读者使用<kbd>Ctrl + F</kbd>快速查找相关内容。文章还提供了示例代码,帮助读者更好地理解和应用这些知识点。
25 1
[HTML、CSS]细节与使用经验
|
8天前
|
移动开发 前端开发 JavaScript
[HTML、CSS]知识点
本文涵盖前端知识点扩展、HTML标签(如video、input、canvas)、datalist和details标签的使用方法,以及CSS布局技巧(如margin、overflow: hidden和动态height)。文章旨在分享作者的学习经验和实用技巧。
21 1
[HTML、CSS]知识点
|
3天前
|
移动开发 JavaScript 前端开发
html table+css实现可编辑表格的示例代码
html table+css实现可编辑表格的示例代码
|
9天前
|
前端开发 JavaScript
如何在 JavaScript 中访问和修改 CSS 变量?
【10月更文挑战第28天】通过以上方法,可以在JavaScript中灵活地访问和修改CSS变量,从而实现根据用户交互、页面状态等动态地改变页面样式,为网页添加更多的交互性和动态效果。在实际应用中,可以根据具体的需求和场景选择合适的方法来操作CSS变量。
|
4天前
|
前端开发 JavaScript 安全
HTML+CSS+JS密码灯登录表单
通过结合使用HTML、CSS和JavaScript,我们创建了一个带有密码强度指示器的登录表单。这不仅提高了用户体验,还帮助用户创建更安全的密码。希望本文的详细介绍和代码示例能帮助您在实际项目中实现类似功能,提升网站的安全性和用户友好性。
11 3
|
7天前
|
JavaScript
JS鼠标框选并删除HTML源码
这是一个js鼠标框选效果,可实现鼠标右击出现框选效果的功能。右击鼠标可拖拽框选元素,向下拖拽可实现删除效果,简单实用,欢迎下载
16 4
|
9天前
|
前端开发 JavaScript UED
如何使用 JavaScript 动态修改 CSS 变量的值?
【10月更文挑战第28天】使用JavaScript动态修改CSS变量的值可以为页面带来更丰富的交互效果和动态样式变化,根据不同的应用场景和需求,可以选择合适的方法来实现CSS变量的动态修改,从而提高页面的灵活性和用户体验。
|
15天前
|
JSON 移动开发 数据格式
html5+css3+js移动端带歌词音乐播放器代码
音乐播放器特效是一款html5+css3+js制作的手机移动端音乐播放器代码,带歌词显示。包括支持单曲循环,歌词显示,歌曲搜索,音量控制,列表循环等功能。利用json获取音乐歌单和歌词,基于html5 audio属性手机音乐播放器代码。
64 6