js拖拽框选插件

简介: js拖拽框选插件

只要你具备了精神气质的美,只要你有这样的自信,你就会拥有风度的自然之美。——金马

分享一个js的拖拽框选插件

官网:https://dragselect.com/

源码:https://github.com/ThibaultJanBeyer/DragSelect.git

使用:

pnpm i dragselect

有前端大佬翻译了部分,并编写了一个htmldemo

https://gitee.com/ovsexia/DragSelect-Doc-Cn

我在使用过程中发现反选有点问题,所以如果是跟我一样pnpm i下载下的版本,应该也会有这个问题,因此反选自己实现即可,这是我按照上面链接中的demovue模块化项目中的组件:

TagDragSelect.vue

<!-- https://gitee.com/ovsexia/DragSelect-Doc-Cn -->
<!-- https://github.com/houbb/opencc4j -->
<!--  -->
<script>
import DragSelect from "dragselect";
export default {
  name: "TagDragSelect",
  data() {
    return { ds: null };
  },
  mounted() {
    console.log(window);
    console.log(document);
    this.ds = new DragSelect({
      area: document.getElementById("ul"),
      selectables: document.getElementsByClassName("mar"),
      //选中
      onElementSelect: (element) => {
        // console.log("onElementSelect", { element });
        element.classList.add("on");
        element.querySelector('input[type="checkbox"]').checked = true;
      },
      //取消选中
      onElementUnselect: (element) => {
        // console.log("onElementUnselect", { element });
        element.classList.remove("on");
        element.querySelector('input[type="checkbox"]').checked = false;
      },
      //鼠标抬起后返回所有选中的元素
      callback: (elements) => {
        console.log(elements);
      },
    });
    console.log({ "this.ds": this.ds });
  },
  methods: {
    selectAll() {
      this.ds.setSelection(this.ds.getSelectables());
    },
    selectNone() {
      this.ds.clearSelection();
    },
    selectReverse() {
      const elements = this.ds.getSelectables()
      const willRemoveSelection = [];
      const willAddSelection = [];
      elements.forEach((el) => (this.ds.SelectedSet.has(el) ? willRemoveSelection : willAddSelection).push(el))
      this.ds.removeSelection(willRemoveSelection)
      this.ds.addSelection(willAddSelection)
    },
  },
  render() {
    return (
      <div class="margin">
        <div class="tip">
          <p>提示:</p>
          <p>1.在灰色区域内拖动选择,也可以点击选择</p>
          <p>
            2.主区域最好添加css 属性 user-select:none
            取消文本选择,防止选择事件冲突
          </p>
        </div>
        <div id="ul" class="ul">
          {Array.from({ length: 20 }, (i, len) => (
            <div class="li">
              <div class={"mar mar" + len}>
                <span class="checkbox"></span>
                <input type="checkbox" />
              </div>
            </div>
          ))}
        </div>
        <button onClick={this.selectAll}>全选</button>
        <button onClick={this.selectNone}>全不选</button>
        <button onClick={this.selectReverse}>反选</button>
      </div>
    );
  },
};
</script>
<style scoped>
.margin {
  width: 1000px;
  margin: 100px auto 0;
}
.tip {
  text-align: center;
  font-size: 16px;
  padding-bottom: 10px;
  line-height: 22px;
}
.ul:after {
  content: "";
  display: block;
  clear: both;
}
.ul {
  background-color: #ccc;
  padding: 40px 35px 0;
  user-select: none;
}
.li {
  width: 25%;
  float: left;
  margin-bottom: 40px;
}
.li .mar {
  margin: 0 20px;
  height: 120px;
  background-color: #ddd;
  position: relative;
}
.li .mar.on {
  background-color: #4892db;
}
.li .mar input[type="checkbox"] {
  visibility: hidden;
}
.checkbox {
  width: 18px;
  height: 18px;
  border: 2px solid #13b8cb;
  background-color: #fff;
  position: absolute;
  top: 3px;
  left: 3px;
}
.checkbox:before,
.checkbox:after {
  content: "";
  display: block;
  background-color: #fff;
  height: 2px;
  position: absolute;
}
.checkbox:before {
  width: 7px;
  top: 10px;
  left: 2px;
  transform: rotate(45deg);
}
.checkbox:after {
  width: 12px;
  top: 8px;
  left: 5px;
  transform: rotate(-45deg);
}
.li .mar.on .checkbox {
  background-color: #13b8cb;
}
.li .mar.on .checkbox:after,
.li .mar.on .checkbox:before {
  background-color: #fff;
}
</style>
相关文章
|
17天前
|
JavaScript 前端开发
javascript开发的简单的弹幕插件
这是一个原生javascript开发的简单的弹幕插件,具有美观、易用,占用的资源较低等特点,可以给弹幕设置内容、颜色、头像、链接地址等属性,鼠标悬停等,简单实用,欢迎下载!
35 5
|
17天前
|
JavaScript 定位技术
jQuery鹰眼视图小地图定位预览插件minimap.js
这是一个jQuery小地图定位预览视图,默认左侧是页面主要内容,minimap.js的好处就是在它的右侧形成一个快速定位通道,产生一个缩小版的页面,即预览效果,可以点击并快速定位到页面的某个位置。简单实用,欢迎下载!
28 0
|
28天前
|
存储 JSON JavaScript
Vue.js开发中基于localStorage与sessionStorage的本地存储利器:Vue-ls插件使用详解
Vue.js开发中基于localStorage与sessionStorage的本地存储利器:Vue-ls插件使用详解
45 0
|
3月前
|
编解码 JavaScript 前端开发
JS逆向浏览器脱环境专题:事件学习和编写、DOM和BOM结构、指纹验证排查、代理自吐环境通杀环境检测、脱环境框架、脱环境插件解决
JS逆向浏览器脱环境专题:事件学习和编写、DOM和BOM结构、指纹验证排查、代理自吐环境通杀环境检测、脱环境框架、脱环境插件解决
105 1
|
3月前
|
JavaScript 前端开发 测试技术
[译] 用 Vue.js 3 Composition API 创建 i18n 插件
[译] 用 Vue.js 3 Composition API 创建 i18n 插件
|
4月前
|
JavaScript 前端开发 API
Chrome插件实现问题之 content_script.js能做什么
Chrome插件实现问题之 content_script.js能做什么
|
3月前
|
JavaScript 调度
Three.js开发秘籍:FlyControls的拖拽视角问题解决方案
Three.js开发秘籍:FlyControls的拖拽视角问题解决方案
60 0
|
4月前
|
JavaScript
js好用的动态分页插件
js好用的动态分页插件是一款简单的分页样式插件,支持样式类型,当前页,每页显示数量,按钮数量,总条数,上一页文字,下一页文字,输入框跳转等功能。
41 1
|
4月前
|
JavaScript
vue 农历日期转公历日期(含插件 js-calendar-converter 使用教程)
vue 农历日期转公历日期(含插件 js-calendar-converter 使用教程)
236 0
|
4月前
|
前端开发 JavaScript API
只会用插件可不行,这些前端动画技术同样值得收藏-JavaScript篇(下)
只会用插件可不行,这些前端动画技术同样值得收藏-JavaScript篇(下)
50 0