JavaScript模拟文件拖选框样式v1.0的实例


Posted in Javascript onAugust 04, 2017

文件拖选v1.0

图片不清楚时请右键点击"在新链接中打开图片"

实现效果

JavaScript模拟文件拖选框样式v1.0的实例

页面布局

JavaScript模拟文件拖选框样式v1.0的实例

实现思路

拖选框

css样式中设置拖选框样式,注意设置position: absolute;漂浮状态.

监听p#container的鼠标按下事件并获取起始坐标,鼠标按下时通过append()方法添加p#selectBox.

鼠标按下事件后鼠标移动事件,比较鼠标的当前位置event.pageX,event.pageY来为p#selectBox添加坐标top/left

和尺寸width/height.

鼠标离开p#container或鼠标松开事件后,remove()方法移除p#selectBox

单选

监听li点击事件;

通过li>子元素.lebal>子元素指向lebal使用toggleClass()方法修改背景样式(显示/取消勾选);

通过this指向li元素本身使用toggleClass()方法修改背景颜色;

复选

监听鼠标按下事件,按下时取消现有的leballi的勾选样式;

监听li,当鼠标移动到上面时,添加样式;

鼠标松开时移除mouseover事件,使它不会继续选中;

遗留问题

拖拽速度快时会有部分文件选不中,初步判断是代码执行效率低的问题

JavaScript模拟文件拖选框样式v1.0的实例

以某个文件为起点选择时,有时无法选中该文件

如果在该文件上短暂停留后可以选中,初步判断时代码执行效率低的问题

JavaScript模拟文件拖选框样式v1.0的实例

想要点击复选按钮时可以完成复选,但单选绑定的click事件与复选的mousedown事件冲突

点击复选按钮时会触发复选的mousedown,移除选择样式,代码逻辑问题

已解决 : 复选框的mousedown事件阻止冒泡 $(".lebal").bind('mousedown', function(event) {event.stopPropagation();})

JavaScript模拟文件拖选框样式v1.0的实例

JavaScript模拟文件拖选框样式v1.0的实例

360云盘复选框拖拽选中后再移开鼠标,则会取消判定该文件的选中,不清楚应该往哪里加逻辑

JavaScript模拟文件拖选框样式v1.0的实例

源代码

<<index.html>>

<!DOCTYPE html>
<html>

<head>
  <title></title>
  <script type="text/javascript" src="js/jquery-3.2.1.js"></script>
  <script type="text/javascript" src="js/script.js"></script>
  <link rel="stylesheet" type="text/css" href="css/style.css" rel="external nofollow" >
</head>

<body>
  <div id="container">
    <ul>
      <li>
        <div class="lebal"><label></label></div>
        <div class="file_name"><p>文件列表</p></div>
      </li>
      <li>
        <div class="lebal"><label></label></div>
        <div class="file_name"><p>文件列表</p></div>
      </li>
      <li>
        <div class="lebal"><label></label></div>
        <div class="file_name"><p>文件列表</p></div>
      </li>
      <li>
        <div class="lebal"><label></label></div>
        <div class="file_name"><p>文件列表</p></div>
      </li>
      <li>
        <div class="lebal"><label></label></div>
        <div class="file_name"><p>文件列表</p></div>
      </li>
      <li>
        <div class="lebal"><label></label></div>
        <div class="file_name"><p>文件列表</p></div>
      </li>
      <li>
        <div class="lebal"><label></label></div>
        <div class="file_name"><p>文件列表</p></div>
      </li>
      <li>
        <div class="lebal"><label></label></div>
        <div class="file_name"><p>文件列表</p></div>
      </li>
      <li>
        <div class="lebal"><label></label></div>
        <div class="file_name"><p>文件列表</p></div>
      </li>
    </ul>
  </div>
</body>

</html>

<<style.css>>

* {margin: 0;padding: 0;}
body {height: 700px;border: 1px black solid;}
#selectBox {border: 1px solid #89d9ff;background-color: rgba(137, 217, 255, 0.5);position: absolute;display: block;}
#container {margin-top: 100px;margin-left: 200px;width: 1200px;height: 600px;border: 1px red solid;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;}
ul {margin: 20px;}
li {width: 100%;height: 40px;border-top: 1px #ddd solid;list-style: none;}
label {background: url('../images/lebal.png')no-repeat;background-position: 0 0;width: 15px;height: 15px;margin: 12.5px auto;display: block;}
.toggleLebalClass {background-position: 0 -52px;}
.toggleLiClass {background: #eeefff;}
.lebal {width: 40px;height: 40px;float: left;}
.file_name {width: 80%;height: 40px;float: left;}
p {line-height: 40px;}

<<script.js>>

"use strict";
var x, y;
$(function() {
  // 点选
  $("li").bind('click', function(event) {
    $(this).children(".lebal").children().toggleClass("toggleLebalClass");
    $(this).toggleClass("toggleLiClass");
  });
  // 复选
  $(".lebal").bind('mousedown', function(event) {
    event.stopPropagation();
  })
  // 拖选
  $("#container").mousedown(function(event) {
    x = event.pageX;
    y = event.pageY;
    $("#container").append("<div id='selectBox'></div>");
    $("li").children(".lebal").children().removeClass("toggleLebalClass");
    $("li").removeClass("toggleLiClass");
    $("li").bind("mouseover", function() {
      $(this).children(".lebal").children().addClass("toggleLebalClass");
      $(this).addClass("toggleLiClass");
    });
  }).mousemove(function(event) {
    $("#selectBox").css({
      left: event.pageX > x ? x : event.pageX,
      top: event.pageY > y ? y : event.pageY,
      width: Math.abs(event.pageX - x),
      height: Math.abs(event.pageY - y)
    });
  }).mouseup(function(event) {
    $("#selectBox").remove();
    $("li").unbind("mouseover");
  })
  $("#container").mouseleave(function() {
    $("#selectBox").remove();
  })
});

以上这篇JavaScript模拟文件拖选框样式v1.0的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
表单的焦点顺序tabindex和对应enter键提交
Jan 04 Javascript
JavaScript字符串对象fromCharCode方法入门实例(用于把Unicode值转换为字符串)
Oct 17 Javascript
用JavaScript动态建立或增加CSS样式表的实现方法
May 20 Javascript
微信小程序实现图片预加载组件
Jan 18 Javascript
微信小程序 下拉列表的实现实例代码
Mar 08 Javascript
jQuery简易时光轴实现方法示例
Mar 13 Javascript
vue2组件实现懒加载浅析
Mar 29 Javascript
简单谈谈关于Angular Cli打包的事
Sep 05 Javascript
bootstrap日期插件daterangepicker使用详解
Oct 19 Javascript
使用vue-cli3 创建vue项目并配置VS Code 自动代码格式化 vue语法高亮问题
May 14 Javascript
Vue.js实现大屏数字滚动翻转效果
Nov 29 Javascript
ant-design表单处理和常用方法及自定义验证操作
Oct 27 Javascript
addeventlistener监听scroll跟touch(实例讲解)
Aug 04 #Javascript
原生js jquery ajax请求以及jsonp的调用方法
Aug 04 #jQuery
Angular2环境搭建具体操作步骤(推荐)
Aug 04 #Javascript
用vue的双向绑定简单实现一个todo-list的示例代码
Aug 03 #Javascript
JavaScript中正则表达式判断匹配规则及常用方法
Aug 03 #Javascript
vue 2.0封装model组件的方法
Aug 03 #Javascript
jQuery实现上传图片前预览效果功能
Aug 03 #jQuery
You might like
PHP打开和关闭文件操作函数总结
2014/11/18 PHP
微信支付的开发流程详解
2016/09/13 PHP
php实现多维数组排序的方法示例
2017/03/23 PHP
Aliyun Linux 编译安装 php7.3 tengine2.3.2 mysql8.0 redis5的过程详解
2020/10/20 PHP
ie 处理 gif动画 的onload 事件的一个 bug
2007/04/12 Javascript
最新的10款jQuery内容滑块插件分享
2011/09/18 Javascript
jQuery中[attribute*=value]选择器用法实例
2014/12/31 Javascript
js对字符的验证方法汇总
2015/02/04 Javascript
jQuery使用drag效果实现自由拖拽div
2015/06/11 Javascript
JavaScript高级程序设计(第三版)学习笔记1~5章
2016/03/11 Javascript
jQuery Tags Input Plugin(添加/删除标签插件)详解
2016/06/20 Javascript
Bootstrap 响应式实用工具实例详解
2017/03/29 Javascript
js获取一组日期中最近连续的天数
2017/05/25 Javascript
基于 flexible 的 Vue 组件:Toast -- 显示框效果
2017/12/26 Javascript
详解webpack import()动态加载模块踩坑
2018/07/17 Javascript
node.js之基础加密算法模块crypto详解
2018/09/11 Javascript
jquery登录的异步验证操作示例
2019/05/09 jQuery
nuxt踩坑之Vuex状态树的模块方式使用详解
2019/09/06 Javascript
Python实现提取文章摘要的方法
2015/04/21 Python
简单了解什么是神经网络
2017/12/23 Python
Python在groupby分组后提取指定位置记录方法
2018/04/20 Python
pandas 对series和dataframe进行排序的实例
2018/06/09 Python
使用python进行波形及频谱绘制的方法
2019/06/17 Python
使用 Python 处理 JSON 格式的数据
2019/07/22 Python
django框架中ajax的使用及避开CSRF 验证的方式详解
2019/12/11 Python
django执行原始查询sql,并返回Dict字典例子
2020/04/01 Python
在python中对于bool布尔值的取反操作
2020/12/11 Python
巴黎卡诗美国官方网站:始于1964年的头发头皮护理专家
2017/07/10 全球购物
美国领先的眼镜和太阳镜在线零售商:Glasses.com
2019/08/26 全球购物
旅游项目开发策划书
2014/01/18 职场文书
电子商务专业毕业生自荐书
2014/06/22 职场文书
小学生民族团结演讲稿
2014/08/27 职场文书
勿忘国耻9.18演讲稿(经典篇)
2014/09/14 职场文书
国庆节标语大全
2014/10/08 职场文书
2014年电信员工工作总结
2014/12/19 职场文书
三年级作文之小小梦想
2019/12/06 职场文书