通用容器,集成了常见功能,持续补充。
<!-- 引入 -->
<script type="module">
import './node_modules/xy-ui/components/xy-view.js';
</script>
<!-- 使用 -->
<xy-view draggable>...</xy-view>
大部分功能基于原生,不影响原生api
使用。
设置draggable
属性可以使该组件拖拽,采用原生drag
实现,美化了拖拽预览样式(原生默认为半透明预览图)。
设置allowdrop
可以允许被拖拽元素放入该容器,支持嵌套。
<xy-view class="dragbox" draggable></xy-view>
<xy-view allowdrop class="dropbox dropbox-parent" ondrop="console.log(this)">
<xy-view allowdrop class="dropbox" ondrop="console.log(this)"></xy-view>
<xy-view class="dropbox"></xy-view>
</xy-view>
当被拖拽元素经过放置容器allowdrop
时,被拖拽元素会添加dragging
属性,放置容器会添加over
属性,移开或者放下会移除该属性
.dragbox[dragging]{
box-shadow:0 3px 10px rgba(0,0,0,.2);
transform: rotate(10deg)!important; /**需要覆盖初始transform**/
transform-origin: left top;
}
.dropbox[over]{
border-color: #2c9666;
}
拖拽其他原生可拖拽元素也会触发以上over
效果,比如拖拽一段文本,或一张图片。
this is a draggable text
以上仅仅是对原生的美化,具体功能实现仍需借助原生事件
//拖拽元素draggable
draggable.addEventListener('dragstart',()=>{})
draggable.addEventListener('drag',()=>{})
draggable.addEventListener('dragend',()=>{})
//目标元素allowdrop
allowdrop.addEventListener('dragover',()=>{})
allowdrop.addEventListener('dragenter',()=>{})
allowdrop.addEventListener('dragleave',()=>{})
allowdrop.addEventListener('drop',()=>{})
设置dragaxis
可以用来限制拖拽的方向,取值为X|Y
。
不设置可以按住Shift
键来限制水平拖拽或竖直拖拽。
dragaxis="X"
dragaxis="Y"
press shift
<xy-view class="dragbox" draggable dragaxis="X">dragaxis="X"</xy-view>
<xy-view class="dragbox" draggable dragaxis="Y">dragaxis="Y"</xy-view>
<xy-view class="dragbox" draggable>press shift</xy-view>
设置resizable
属性可以使元素改变尺寸
<xy-view resizable class="resizebox"></xy-view>
改变尺寸会触发一下三个回调事件resizestart
、resize
、resizend
resizebox.addEventListener('resizestart',()=>{})
resizebox.addEventListener('resize',(ev)=>{
console.log(ev.detail)
/*
detail:{
offsetX,//x偏移
offsetY,//y偏移
width,//当前宽度
height,//当前高度
}
*/
})
resizebox.addEventListener('resizend',()=>{})
当拖拽左上部分时,除了改变宽高以外,为了保证拖拽自然性,此时会给
transform
添加offsetX
和offsetY
偏移
CSS
获取不到鼠标位置信息,可以设置coord
属性,将坐标信息在内部通过自定义属性--x
、--y
传递下来,取值范围为0~1
(坐标相对于宽高的比值)。
很多鼠标跟随的效果就可以借助CSS
实现了。
look me
.coord-con{
perspective: 550px;
transform-style: preserve-3d;
}
.coord-con:hover .coord-box{
transform: rotateX(calc( (var(--y) - .5) * 45deg)) rotateY(calc( (var(--x) - .5) * 45deg));
/**通过calc计算旋转角度**/
}
<xy-view coord class="coord-con">
<div class="coord-box">look me</div>
</xy-view>
更多实用场景...