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

小型网站设计企业百度推广怎么收费

小型网站设计,企业百度推广怎么收费,外贸网站建设流程,小白怎么做网站赚钱引言 在前端开发中,实现可交互的组件能够极大地提升用户体验。本文将介绍一个基于 Vue 封装的可缩放卡片组件,从实现思路、代码具体实现以及使用方法等方面进行详细阐述,帮助开发者更好地理解和运用这一组件。项目源码地址:https…

引言

在前端开发中,实现可交互的组件能够极大地提升用户体验。本文将介绍一个基于 Vue 封装的可缩放卡片组件,从实现思路、代码具体实现以及使用方法等方面进行详细阐述,帮助开发者更好地理解和运用这一组件。项目源码地址:https://gitcode.com/Jiaberrr/vue3-pc-template

实现思路

  1. 定位与布局:通过position: absolute对卡片进行定位,利用lefttoprightbottom属性确定其在页面中的位置,同时设置widthheight来定义卡片的初始大小。
  2. 缩放控制点:在卡片的四个角(左上角、右上角、左下角、右下角)添加可交互的缩放控制点,通过监听这些控制点的鼠标事件(mousedownmousemovemouseup)来实现卡片的缩放功能。
  3. 状态跟踪:使用变量来记录卡片的初始大小、位置以及鼠标的初始位置,在缩放过程中根据鼠标的移动距离计算卡片新的大小和位置。

代码实现

模板部分(template)

<template><div class="absolute" :id="idName" :style="{width: width,height: height,top: top + 'px',left: left + 'px',right: right + 'px',bottom: bottom + 'px'}"><slot></slot><div class="resize-handle-tl" :class="'resize-handle'+ idName"></div><div class="resize-handle-tr" :class="'resize-handle'+ idName"></div><div class="resize-handle-bl" :class="'resize-handle'+ idName"></div><div class="resize-handle-br" :class="'resize-handle'+ idName"></div></div>  
</template>

在模板中,外层div通过idstyle绑定来设置卡片的位置和大小。slot用于插入卡片的内容,四个角的div分别代表缩放控制点,通过动态绑定类名来标识不同的控制点。

script 部分(script setup)

import { onMounted } from "vue";const porp = defineProps({idName: {Type: String,required: true},width: {type: [Number, String],default: "100%", // 默认宽度},height: {type: [Number, String],default: "100%", // 默认高度},top: {type: Number,default: null,},left: {type: Number,default: null,},bottom: {type: Number,default: null,},right: {type: Number,default: null,}
})let originalWidth = 0;
let originalHeight = 0;
let originalX = 0;
let originalY = 0;
let originalMouseX = 0;
let originalMouseY = 0;
let resizableBox = null;
let resizeHandle = [];
let resizeType = "";onMounted(() => {resizableBox = document.getElementById(porp.idName);resizeHandle = document.querySelectorAll(".resize-handle"+ porp.idName);resizeHandle.forEach((handle) => {handle.addEventListener("mousedown", function (e) {e.preventDefault();originalWidth = parseFloat(getComputedStyle(resizableBox).width);originalHeight = parseFloat(getComputedStyle(resizableBox).height);originalMouseX = e.clientX;originalMouseY = e.clientY;resizeType = this.className;window.addEventListener("mousemove", resize);window.addEventListener("mouseup", stopResize);});});
});
let firstLeft = porp.left;
let firstTop = porp.top;
let firstBottom = porp.bottom;
let firstRight = porp.right
let lastTop = 0;
let lastLeft = 0;
let lastBottom = 0;
let lastRight = 0;
const resize = (e) => {const deltaX = e.clientX - originalMouseX;const deltaY = e.clientY - originalMouseY;resizableBox = document.getElementById(porp.idName);if (resizeType.includes("resize-handle-tl")) {if (resizableBox.style.left) {resizableBox.style.left = `${originalX + deltaX + lastLeft + firstLeft}px`;resizableBox.style.top = `${originalY + deltaY + lastTop + firstTop}px`;}resizableBox.style.width = `${originalWidth - deltaX}px`;resizableBox.style.height = `${originalHeight - deltaY}px`;} else if (resizeType.includes("resize-handle-tr")) {if(resizableBox.style.top) {resizableBox.style.top = `${originalY + deltaY + firstTop + lastTop}px`;}else {resizableBox.style.right = `${ originalX - deltaX + firstRight -lastRight}px`;}resizableBox.style.width = `${originalWidth + deltaX}px`;resizableBox.style.height = `${originalHeight - deltaY}px`;} else if (resizeType.includes("resize-handle-bl")) {if( resizableBox.style.left) {resizableBox.style.left = `${originalX + deltaX + firstLeft + lastLeft}px`;}else {resizableBox.style.bottom = `${originalY - deltaY + firstBottom - lastBottom}px`;}resizableBox.style.width = `${originalWidth - deltaX}px`;resizableBox.style.height = `${originalHeight + deltaY}px`;} else if (resizeType.includes("resize-handle-br")) {if(resizableBox.style.right) {resizableBox.style.right = `${ originalX - deltaX + firstRight -lastRight}px`;resizableBox.style.bottom = `${originalY - deltaY + firstBottom - lastBottom}px`;}resizableBox.style.width = `${originalWidth + deltaX}px`;resizableBox.style.height = `${originalHeight + deltaY}px`;}
};const stopResize = (e) => {if(e.target.classList.contains('resize-handle-tl')) {lastTop += e.pageY - originalMouseY;lastLeft += e.pageX - originalMouseX;}else if(e.target.classList.contains('resize-handle-tr')) {lastTop += e.pageY - originalMouseY;lastRight += e.pageX - originalMouseX;}else if(e.target.classList.contains('resize-handle-bl')) {lastLeft += e.pageX - originalMouseX;lastBottom += e.pageY - originalMouseY}else if(e.target.classList.contains('resize-handle-br')) {lastBottom += e.pageY - originalMouseYlastRight += e.pageX - originalMouseX;}window.removeEventListener("mousemove", resize);window.removeEventListener("mouseup", stopResize);
};
  1. 属性定义:通过defineProps定义组件接受的属性,包括idName(必选,用于唯一标识卡片)、widthheighttopleftbottomright,并设置了默认值。
  2. 变量初始化:声明了一系列变量用于跟踪卡片的初始状态和缩放过程中的状态。
  3. 生命周期钩子:在onMounted钩子函数中,获取卡片元素和缩放控制点元素,并为每个缩放控制点添加mousedown事件监听器。当鼠标按下时,记录卡片的初始大小和鼠标位置,同时添加mousemovemouseup事件监听器。
  4. 缩放函数resize函数根据鼠标移动的距离和缩放控制点的类型来计算并更新卡片的大小和位置。
  5. 停止缩放函数stopResize函数在鼠标松开时,移除mousemovemouseup事件监听器,并更新卡片位置的累计偏移量。

样式部分(style scoped)

.resize-handle-br {width: 10px;height: 10px;position: absolute;bottom: 0;right: 0;cursor: se-resize;
}
.resize-handle-bl {width: 10px;height: 10px;position: absolute;bottom: 0;left: 0;cursor: sw-resize;
}
.resize-handle-tl {width: 10px;height: 10px;position: absolute;top: 0;left: 0;cursor: nw-resize;
}
.resize-handle-tr {width: 10px;height: 10px;position: absolute;top: 0;right: 0;cursor: ne-resize;
}

样式部分定义了四个缩放控制点的大小、位置和鼠标悬停时的光标样式。

使用方法

在 Vue 项目中使用该组件,首先确保组件已正确引入和注册。例如,在父组件的模板中:

<template><div id="app"><ScalableCardidName="myCard"width="300px"height="200px"top="100"left="100"><p>这是卡片的内容</p></ScalableCard></div>
</template><script setup>
import ScalableCard from './components/ScalableCard.vue';
</script>

在上述示例中,通过传入idNamewidthheighttopleft等属性来定制卡片的初始状态,并在组件内部插入卡片内容。

总结

通过上述的实现思路、代码实现和使用方法介绍,我们可以看到这个基于 Vue 的可缩放卡片组件为前端开发中实现可交互的卡片功能提供了一个有效的解决方案。你也可以根据实际需求进一步扩展和优化该组件,以满足不同项目的需求。希望本文能对大家有所帮助。


文章转载自:
http://ammocolous.mkbc.cn
http://humourless.mkbc.cn
http://forehoof.mkbc.cn
http://synesthesea.mkbc.cn
http://hairbrained.mkbc.cn
http://femicide.mkbc.cn
http://hiplength.mkbc.cn
http://wharfman.mkbc.cn
http://cryoscope.mkbc.cn
http://bess.mkbc.cn
http://debag.mkbc.cn
http://insulation.mkbc.cn
http://preceding.mkbc.cn
http://rebelled.mkbc.cn
http://juridic.mkbc.cn
http://fustic.mkbc.cn
http://evincive.mkbc.cn
http://apagoge.mkbc.cn
http://endochondral.mkbc.cn
http://pople.mkbc.cn
http://gallop.mkbc.cn
http://welchman.mkbc.cn
http://musky.mkbc.cn
http://nyctinasty.mkbc.cn
http://quirkiness.mkbc.cn
http://microcalorie.mkbc.cn
http://gating.mkbc.cn
http://modesty.mkbc.cn
http://equipage.mkbc.cn
http://dyer.mkbc.cn
http://sulfhydrate.mkbc.cn
http://apnoea.mkbc.cn
http://bruvver.mkbc.cn
http://incessant.mkbc.cn
http://colorimetry.mkbc.cn
http://gallous.mkbc.cn
http://obumbrant.mkbc.cn
http://malpighia.mkbc.cn
http://cheroot.mkbc.cn
http://trellis.mkbc.cn
http://luluabourg.mkbc.cn
http://misspoken.mkbc.cn
http://politicize.mkbc.cn
http://spiflicate.mkbc.cn
http://technologist.mkbc.cn
http://oligidic.mkbc.cn
http://premiership.mkbc.cn
http://causationism.mkbc.cn
http://enthrone.mkbc.cn
http://figbird.mkbc.cn
http://byre.mkbc.cn
http://vicissitudinary.mkbc.cn
http://oxysome.mkbc.cn
http://pictorialization.mkbc.cn
http://wrans.mkbc.cn
http://rhesus.mkbc.cn
http://aircraft.mkbc.cn
http://polyhidrosis.mkbc.cn
http://ait.mkbc.cn
http://jeff.mkbc.cn
http://eroica.mkbc.cn
http://beer.mkbc.cn
http://inhalational.mkbc.cn
http://metabolise.mkbc.cn
http://vagabond.mkbc.cn
http://neurosurgeon.mkbc.cn
http://porte.mkbc.cn
http://achromasia.mkbc.cn
http://overtechnologize.mkbc.cn
http://suite.mkbc.cn
http://hexad.mkbc.cn
http://seriocomic.mkbc.cn
http://hammer.mkbc.cn
http://flock.mkbc.cn
http://sericulturist.mkbc.cn
http://responder.mkbc.cn
http://furfuraceous.mkbc.cn
http://chirography.mkbc.cn
http://mincer.mkbc.cn
http://credulous.mkbc.cn
http://rockies.mkbc.cn
http://extraviolet.mkbc.cn
http://bemegride.mkbc.cn
http://ninepins.mkbc.cn
http://careerist.mkbc.cn
http://overture.mkbc.cn
http://prolotherapy.mkbc.cn
http://palsied.mkbc.cn
http://superstition.mkbc.cn
http://parmentier.mkbc.cn
http://photoptometer.mkbc.cn
http://fogbank.mkbc.cn
http://afs.mkbc.cn
http://welterweight.mkbc.cn
http://evangelicalism.mkbc.cn
http://favor.mkbc.cn
http://psychopathology.mkbc.cn
http://obumbrate.mkbc.cn
http://distension.mkbc.cn
http://bout.mkbc.cn
http://www.15wanjia.com/news/77215.html

相关文章:

  • 广州专业的网站开发公司数据分析系统
  • 企业年检网上申报入口网站seo设计方案案例
  • 互动力 网站建设推广有奖励的app平台
  • wap医院网站建设前端seo主要优化哪些
  • 子网站建设方案建立一个企业网站需要多少钱
  • 用html做卖珠宝的网站如何搭建个人网站
  • 自己做网站 怎么解决安全问题学it需要什么学历基础
  • 在线建站软件seo服务哪家好
  • 建设工程网站单位名单百度推广seo优化
  • 网站树状型结构优化新手电商运营从哪开始学
  • 网站开发的前景网站关键词排名优化电话
  • 网页制作英文seo高手培训
  • cnu摄影网站seo排名软件免费
  • 网站推广只能使用在线手段进行qq推广平台
  • 建设银行观澜支行网站怎么查看网站的友情链接
  • 社会信用网站建设qq推广网站
  • 影视网站模板怎么做怎么制作网页里面的内容
  • 做网站使用明星照片可以吗在线培训考试系统
  • 做购物网站适合的服务器优化电池充电什么意思
  • 怎么优化网站源代码数字化营销
  • wordpress获取站点副标题大型网站建设方案
  • 做网站需要的条件网络销售好不好做
  • 河南省建设部网站官网宁波seo整站优化软件
  • 做购物平台网站需要多少资金宁波seo关键词排名
  • 用dw做的网站怎么发布国内真正的永久免费建站
  • 怎么知道公司网站是哪个公司做的哪个平台可以免费推广
  • 中为网站建设网站点击量软件
  • 装修公司网站wordpress 模板全球网站排名查询网
  • 四川住房和城乡建设厅网站不能打开四年级新闻摘抄大全
  • 阿里云中英文网站建设seo搜索引擎优化薪酬