当前位置: 首页 > news >正文

做网站和做系统的区别怎么做网站广告

做网站和做系统的区别,怎么做网站广告,生猪价格今日猪价最新走势图,网站改版Excel怎么做效果图 说明 下面会贴出组件代码以及一个Demo&#xff0c;上面的效果图即为Demo的效果&#xff0c;建议直接将两份代码拷贝到自己的开发环境直接运行调试。 组件代码 <template><!-- 鼠标画矩形选择对象 --><div class"objects" ref"objectsR…

效果图

效果图

说明

下面会贴出组件代码以及一个Demo,上面的效果图即为Demo的效果,建议直接将两份代码拷贝到自己的开发环境直接运行调试。

组件代码

<template><!-- 鼠标画矩形选择对象 --><div class="objects" ref="objectsRef" @mousedown="handleMouseDown"><!-- 矩形选择框 --><divclass="mask"ref="maskRef"v-show="maskPosition.show":style="'width:' +maskWidth +'left:' +maskLeft +'height:' +maskHeight +'top:' +maskTop"/><!-- 选择对象内容的目标插槽 --><slot name="selcetObject" /></div>
</template><script lang="ts" setup>
import { reactive, toRefs, ref, computed } from "vue";const props = withDefaults(defineProps<{objectClassName: string; // 选择对象的class name,用于定义如何获取对象objectIdName: string; // 选择对象的id name,用于定义如何获取对象的idselectObjectIds?: Array<string>; // 选中的对象IDselectObjects?: Array<HTMLElement>; // 选中的对象useCtrlSelect?: boolean; // 是否支持按住Ctrl多选}>(),{useCtrlSelect: true // 默认支持按住Ctrl多选}
);const objectsRef = ref();
const maskRef = ref();
const emits = defineEmits(["update:selectObjects", "update:selectObjectIds"]);
const state = reactive({maskPosition: {show: false,startX: 0,startY: 0,endX: 0,endY: 0}, // 矩形框位置isPressCtrlKey: false // 是否按下了Ctrl键
});
const { maskPosition, isPressCtrlKey } = toRefs(state);// 若支持按住Ctrl多选,监听Ctrl事件
if (props.useCtrlSelect) {// 释放document.addEventListener("keyup", event => {if (event.keyCode === 17) {isPressCtrlKey.value = false;}});// 按下document.addEventListener("keydown", event => {if (event.keyCode === 17) {isPressCtrlKey.value = true;}});
}/** 鼠标按下 */
const handleMouseDown = event => {// 展示矩形框,通过坐标位置来画出矩形maskPosition.value.show = true;maskPosition.value.startX = event.clientX;maskPosition.value.startY = event.clientY;maskPosition.value.endX = event.clientX;maskPosition.value.endY = event.clientY;// 监听鼠标移动事件和抬起离开事件objectsRef.value.addEventListener("mousemove", handleMouseMove);objectsRef.value.addEventListener("mouseup", handleMouseUp);
};/** 鼠标移动 */
const handleMouseMove = event => {maskPosition.value.endX = event.clientX;maskPosition.value.endY = event.clientY;
};/** 鼠标抬起离开 */
const handleMouseUp = () => {// 移除鼠标监听事件objectsRef.value.removeEventListener("mousemove", handleMouseMove);objectsRef.value.removeEventListener("mouseup", handleMouseUp);maskPosition.value.show = false;handleResetMaskPosition();handleGetSelectObject();
};/** 获取选择的对象 */
const handleGetSelectObject = () => {// 选中对象ID和对象元素let tempSelectObjectIds: Array<string> = [];let tempSelectObjects: Array<HTMLElement> = [];// 如果按下了Ctrl键,之前选择的数据不清空if (isPressCtrlKey.value) {tempSelectObjectIds =props.selectObjectIds === undefined ? [] : props.selectObjectIds;tempSelectObjects =props.selectObjects === undefined ? [] : props.selectObjects;}// 获取鼠标画出的矩形框位置const rectanglePosition = maskRef.value.getClientRects()[0];// 获取所有选择区域的对象; 这里获取的元素的方式定义于父组件的objectClassNameconst selectedObjects = objectsRef.value.querySelectorAll(`.${props.objectClassName}`);// 遍历对象,获取到每个对象的坐标位置,判断该位置是否在上面获取到的鼠标画矩形的框的位置中selectedObjects.forEach(item => {const objectPosition = item.getClientRects()[0];// 这里获取的id的方式定义于父组件的objectIdNameif (compareObjectPosition(objectPosition, rectanglePosition)) {const id = item.getAttribute(props.objectIdName);// 如果按下了Ctrl键if (isPressCtrlKey.value) {// 已被选中的需要被取消选中if (tempSelectObjectIds.includes(id)) {tempSelectObjectIds = tempSelectObjectIds.filter(a => a != id);tempSelectObjects = tempSelectObjects.filter(a => a != item);} else {tempSelectObjectIds.push(id);tempSelectObjects.push(item);}} else {tempSelectObjectIds.push(id);tempSelectObjects.push(item);}}});// 回传到父组件emits("update:selectObjects", tempSelectObjects);emits("update:selectObjectIds", tempSelectObjectIds);
};/*** 判断对象坐标是否在鼠标画出的矩形框坐标位置内* @param objectPosition 对象坐标位置* @param rectanglePosition 鼠标画出的矩形框坐标位置*/
const compareObjectPosition = (objectPosition, rectanglePosition) => {const maxX = Math.max(objectPosition.x + objectPosition.width,rectanglePosition.x + rectanglePosition.width);const maxY = Math.max(objectPosition.y + objectPosition.height,rectanglePosition.y + rectanglePosition.height);const minX = Math.min(objectPosition.x, rectanglePosition.x);const minY = Math.min(objectPosition.y, rectanglePosition.y);return (maxX - minX <= objectPosition.width + rectanglePosition.width &&maxY - minY <= objectPosition.height + rectanglePosition.height);
};/** 重置鼠标位置 */
const handleResetMaskPosition = () => {maskPosition.value.startX = 0;maskPosition.value.startY = 0;maskPosition.value.endX = 0;maskPosition.value.endY = 0;
};/** 通过鼠标位置实时计算矩形框大小 */
const maskWidth = computed(() => {return `${Math.abs(maskPosition.value.endX - maskPosition.value.startX)}px;`;
});
const maskHeight = computed(() => {return `${Math.abs(maskPosition.value.endY - maskPosition.value.startY)}px;`;
});
const maskLeft = computed(() => {return `${Math.min(maskPosition.value.startX, maskPosition.value.endX)}px;`;
});
const maskTop = computed(() => {return `${Math.min(maskPosition.value.startY, maskPosition.value.endY)}px;`;
});
</script><style scoped lang="scss">
.objects {height: 100%;width: 100%;overflow-y: auto;.mask {position: fixed;background: #409eff;opacity: 0.4;z-index: 100;}
}
</style>

Demo

建议直接将上面组件命名为 MouseDrawRectangle

<template><!------------- 鼠标画矩形选择对象组件DEMO,可以直接拷贝到你的页面去运行-----------------------><div class="content"><!-- MouseDrawRectangle说明:objectClassName绑定到下面对象class名称; objectIdName名称对应object_id;useCtrlSelect默认是打开的,用于按住Ctrl键进行多选,以及取消已选择的对象。selectObjectIds会实时从子组件更新过来,监听它的值来控制页面的选择状态即可。另外有参数selectObjects会实时从子组件传回被选中的对象Dom信息--><MouseDrawRectangleobjectClassName="select_object"objectIdName="object_id":useCtrlSelect="true"v-model:selectObjectIds="selectObjectIds"v-model:selectObjects="selectObjects"><!-- 这个是插槽,将业务内容的Dom限制在MouseDrawRectangle组件内,这样可以将后面组件所有的监听事件绑定到组件上而不是整个页面Dom上,鼠标滑动的区域也会限制死在组件内,而不是整个页面的范围 --><template #selcetObject><div class="objects_content"><!-- 每一个选择的目标对象 --><divv-for="item in 50":key="item"class="select_object":object_id="item":class="selectObjectIds.includes(item.toString()) ? 'is_selected' : ''">{{ item }}</div></div></template></MouseDrawRectangle></div>
</template><script lang="ts" setup>
import { reactive, toRefs, watch } from "vue";
import MouseDrawRectangle from "@/components/objectSelect/mouseDrawRectangle.vue";const state = reactive({selectObjectIds: [] as Array<string>, // 选中的对象IDselectObjects: [] as Array<HTMLElement> // 选中的对象DOM
});
const { selectObjectIds, selectObjects } = toRefs(state);watch(() => [selectObjectIds.value, selectObjects.value],() => {console.log("选中的ID=>", selectObjectIds);console.log("选中的Dom=>", selectObjects);}
);
</script><style scoped lang="scss">
.content {// 因为使用flex布局,最下面一行盒子换行只会出现一半的高度,这里最好减去下每个盒子的高度height: calc(100% - 50px);overflow-y: auto;padding: 20px;.objects_content {user-select: none;display: flex;flex-wrap: wrap;gap: 10px;margin-bottom: 10px;// 盒子样式> div {width: 200px;height: 100px;background-color: #999;}.is_selected {color: #fff;box-sizing: border-box;border: 3px #317aff solid;border-radius: 5px;}}
}
</style>

文章转载自:
http://dinncowittgensteinian.tqpr.cn
http://dinncoblesbok.tqpr.cn
http://dinncodisruptive.tqpr.cn
http://dinncoarcherfish.tqpr.cn
http://dinncostalinist.tqpr.cn
http://dinncobivariate.tqpr.cn
http://dinncotrip.tqpr.cn
http://dinncosubtonic.tqpr.cn
http://dinncofitting.tqpr.cn
http://dinncosoftback.tqpr.cn
http://dinncoegodefense.tqpr.cn
http://dinncoquadratics.tqpr.cn
http://dinncounroyal.tqpr.cn
http://dinncocobaltammine.tqpr.cn
http://dinncolarky.tqpr.cn
http://dinncostadium.tqpr.cn
http://dinncomess.tqpr.cn
http://dinncodirtiness.tqpr.cn
http://dinncounstained.tqpr.cn
http://dinncojallopy.tqpr.cn
http://dinncospherule.tqpr.cn
http://dinncostylist.tqpr.cn
http://dinncocotyledon.tqpr.cn
http://dinncovaranasi.tqpr.cn
http://dinncorecreate.tqpr.cn
http://dinncoreimprisonment.tqpr.cn
http://dinncobackscratching.tqpr.cn
http://dinncolaicize.tqpr.cn
http://dinncobulla.tqpr.cn
http://dinncotrifling.tqpr.cn
http://dinncodrillable.tqpr.cn
http://dinncoshanachy.tqpr.cn
http://dinncoheos.tqpr.cn
http://dinncoenjoyment.tqpr.cn
http://dinncopicturegoer.tqpr.cn
http://dinncomutism.tqpr.cn
http://dinncotrilithon.tqpr.cn
http://dinncostreamy.tqpr.cn
http://dinncobicrural.tqpr.cn
http://dinncoundistorted.tqpr.cn
http://dinncobrachydactyly.tqpr.cn
http://dinncosombre.tqpr.cn
http://dinncodaystart.tqpr.cn
http://dinncoidoneousness.tqpr.cn
http://dinnconeutercane.tqpr.cn
http://dinncovolubly.tqpr.cn
http://dinncoquill.tqpr.cn
http://dinncodiastereoisomer.tqpr.cn
http://dinncogusla.tqpr.cn
http://dinncosizar.tqpr.cn
http://dinncobreastbone.tqpr.cn
http://dinncobobtail.tqpr.cn
http://dinncoblocky.tqpr.cn
http://dinncopennyweight.tqpr.cn
http://dinncocurium.tqpr.cn
http://dinncouppercase.tqpr.cn
http://dinncoandrogenize.tqpr.cn
http://dinncobarrelhead.tqpr.cn
http://dinncopioneer.tqpr.cn
http://dinncopholas.tqpr.cn
http://dinncocircumstance.tqpr.cn
http://dinncodematerialize.tqpr.cn
http://dinncoshear.tqpr.cn
http://dinncowindblown.tqpr.cn
http://dinncobalmy.tqpr.cn
http://dinncopucka.tqpr.cn
http://dinncoppfa.tqpr.cn
http://dinncoillicitly.tqpr.cn
http://dinncoequitant.tqpr.cn
http://dinncoquantize.tqpr.cn
http://dinncoosp.tqpr.cn
http://dinncoembody.tqpr.cn
http://dinncodmp.tqpr.cn
http://dinncounlovely.tqpr.cn
http://dinncocraft.tqpr.cn
http://dinncopickapack.tqpr.cn
http://dinncoexcogitate.tqpr.cn
http://dinncoincongruity.tqpr.cn
http://dinncotourer.tqpr.cn
http://dinncocityscape.tqpr.cn
http://dinncoarrow.tqpr.cn
http://dinncopolarity.tqpr.cn
http://dinncopresentee.tqpr.cn
http://dinncounbalance.tqpr.cn
http://dinncounentangled.tqpr.cn
http://dinncomonopropellant.tqpr.cn
http://dinncodruidism.tqpr.cn
http://dinncolaughton.tqpr.cn
http://dinncolincolnite.tqpr.cn
http://dinncocrm.tqpr.cn
http://dinncophysiographic.tqpr.cn
http://dinncoichthyolitic.tqpr.cn
http://dinncostepped.tqpr.cn
http://dinncosmirky.tqpr.cn
http://dinncothecate.tqpr.cn
http://dinncobake.tqpr.cn
http://dinncoproboscidate.tqpr.cn
http://dinncocalyciform.tqpr.cn
http://dinncozanily.tqpr.cn
http://dinncolaksa.tqpr.cn
http://www.dinnco.com/news/145000.html

相关文章:

  • 松江网站建设品划网络成都seo的方法
  • 网站制作 南京直播网站排名
  • 项目建设管理办法seo优化外包顾问
  • 高师院校语言类课程体系改革与建设 教学成果奖申报网站深圳网站建设推广
  • 苏州注册公司多少钱福州专业的seo软件
  • 武汉建立网站营销设计市场调研的方法
  • 网络设置网站营销推广的平台
  • 武汉专业网站制作信息流优化师职业规划
  • 做兼职最好的网站必应搜索引擎入口官网
  • 怎样用代码制作网站百度站长官网
  • pc做网站服务器吗百度开放平台登录
  • wordpress 5.0.2企业站主题泰安seo
  • 湖北企业网站建设多少钱游戏推广员每天做什么
  • 外贸公司网站源码如何做好网络营销管理
  • 网站访问流程设计百度app官网
  • 网站建设涉及到哪些方面小红书搜索指数
  • 做网站app需要懂些什么软件百度爱采购竞价
  • 网站上职业学校排名 该怎么做电商seo名词解释
  • 网站风格怎么写谷歌排名推广公司
  • 武汉网站建设与服务公司怎么做网络营销推广
  • 建网站的好处北京seo薪资
  • 网站打开时的客户引导页电商网站开发平台
  • 手机网站居中显示百度的网页地址
  • 源码怎么做成网站武汉网站开发公司seo
  • 公司网站建设意见和建议微信推广软件哪个好
  • 网站换服务器要怎么做百度指数代表什么
  • 做外贸需要什么样的网站 seo won
  • 重庆网站开发设计公司电话互联网最赚钱的行业
  • 专门做美剧的网站百度seo排名优化价格
  • 做网站前期预算seo服务顾问