mypreciousʲôÒâ˼"/> 2024-10-31 11:38¡¤Í£Áô¿´ÌåÓý"/>

ÌÚ²©tengbo9885¹ÙÍø

mypreciousʲôÒâ˼

mypreciousʲôÒâ˼

Á¬Ã¦²¥·Å ÊÕ²Ø

¡¶mypreciousʲôÒâ˼¡·¾çÇé¼ò½é£º2024-10-31 11:38¡¤Í£Áô¿´ÌåÓýËæ¼´ÓÖ˵µÀÄã²»»áÊÇÏëÒªÎÒ½øÈ¥°Ñ¾­Îı³ÏÂÀ´Äî¸øÄãÌý°ÉÕâ°ì·¨ÐÐÇ·ºàµÄÄǾ­ÎÄÎÒ¼û¹ýÎÞÊý´ÎÁ˵«µ½ÏÖÔÚΪֹÈ´ÊÇÁ¬Ò»¸ö×ÖÒ²Ïë²»ÆðÀ´mypreciousʲôÒâ˼Äã¾Í¶ãÔÚÒ»±ßÌýµ½ÓÐÐÂÎÅÄã¾ÍµãÉÏ»ðÈÓ³öÈ¥µ½Ê±¼ä¾ÍÊÇËûÃÇÔÚÃ÷ÎÒÃÇÔÚ°µÀϹ¤½³Ò²ÒªÑ§ÐÂÊÖÒÕ´Þ´ºá°ËµÏÖÔÚ´ÓÊý×Ö»¯½¨Ä£»·½Úµ½´òÓ¡À¯Ä£ÔÙµ½ÊµÑùÆÊÎöËû¶¼ÊìÖª²Ù×÷Ô­ÀíºÍÊÖÒÕÔÙÍŽá×Ô¼º40ÄêµÄÊÖ¹¤ÖÆ×÷ÂÄÀú¸ü¸ßЧµØÖ¸µ¼ÄêÇáÒ»´ú¹¤½³Íê³ÉÊý×Ö»¯µÄ²úÆ·Éè¼ÆÓëÉú²ú

¡¶mypreciousʲôÒâ˼¡·ÊÓÆµËµÃ÷£ºÃîÔÕÕâʱÎíÆøÉ¢È¥·¿°²ÀÙÑÛǰ¹ÛÖ®ÉñÉ«·ÉÑïÈ̲»×¡ÔÞ̾×÷ÉùÔÚÕâ½Ú×à½ô´Õ¡¢ÄÞºçÉÁׯ¡¢¸ßÂ¥ÁÖÁ¢µÄÌìÏÂÖ®ÖÐÓÐÒ»×ù¶¼»á¾²Ú×µØÒþÄäÔÚ´óµØÖ®ÉÏÈÎÓÉËêÔÂÇáÇḧÃþÍðÈç¾²´ý×ÅÈËÃÇÈ¥·¢Ã÷ËýÕâ¼´ÊÇÀÖɽÒ»×ùµÍµ÷¶ø¸»ÓÐ÷ÈÁ¦µÄ¶¼»á¹ãÖÝ»òÐíÒòÆä·±»ª¶øÒýÈËעĿµ«ÀÖɽÔÚÆä×ÔÎҵ͵÷µÄÆø·ÕÖÐÈ´Õ¹ÏÖ³öÎÞ·¨ºöÊӵķ緶Vue×Ô½ç˵ָÁî2021-04-14 12:13¡¤Ç°¶ËCold³ýÁ˽¹µã¹¦Ð§Ä¬ÈÏÄÚÖõÄÖ¸Áî (v-model ºÍ v-show)Vue Ò²ÔÊÐí×¢²á×Ô½ç˵ָÁî×Ô¶¯×¢²áÖ¸Áîн¨ directives/index.jsÎļþimport copy from './copy'import longpress from './longpress'import permission from './permission'import debounce from './debounce'import emoji from './emoji'import LazyLoad from './LazyLoad'import waterMarker from './waterMarker'import draggable from './draggable'// ×Ô½ç˵ָÁîconst directives = { copy, longpress, permission, debounce, emoji, LazyLoad, waterMarker, draggable}export default { install(Vue) { Object.keys(directives).forEach((key) => { Vue.directive(key, directives[key]) }) },}ÔÚ main.js ÎļþÒýÈëimport Vue from 'vue'import directives from '@/directives'Vue.use(directives)v-copyʵÏÖÒ»¼ü¸´ÖÆÎı¾ÄÚÈÝÓÃÓÚÊó±êÓÒ¼üÕ³Ìù¶¯Ì¬½¨Éè textarea ±êÇ©²¢ÉèÖà readOnly ÊôÐÔ¼°ÒƳö¿ÉÊÓÇøÓò½«Òª¸´ÖƵÄÖµ¸³¸ø textarea ±êÇ©µÄ value ÊôÐÔ²¢²åÈëµ½ bodyÑ¡ÖÐÖµ textarea ²¢¸´Öƽ« body ÖвåÈëµÄ textarea ÒÆ³ýÔÚµÚÒ»´ÎŲÓÃʱ°ó¶¨ÊÂÎñÔÚ½â°óÊ±ÒÆ³ýÊÂÎñconst copy = { bind(el, { value }) { el.$value = value el.handler = () => { if (!el.$value) { // ֵΪ¿ÕµÄʱ¼ä¸ø³öÌáÐÑ¿Éƾ֤ÏîÄ¿UI×ÐϸÉè¼Æ console.log('ÎÞ¸´ÖÆÄÚÈÝ') return } // ¶¯Ì¬½¨Éè textarea ±êÇ© const textarea = document.createElement('textarea') // ½«¸Ã textarea ÉèΪ readonly ±ÜÃâ iOS ÏÂ×Ô¶¯»½Æð¼üÅÌͬʱ½« textarea ÒÆ³ö¿ÉÊÓÇøÓò textarea.readOnly = 'readonly' textarea.style.position = 'absolute' textarea.style.left = '-9999px' // ½«Òª copy µÄÖµ¸³¸ø textarea ±êÇ©µÄ value ÊôÐÔ textarea.value = el.$value // ½« textarea ²åÈëµ½ body ÖÐ document.body.appendChild(textarea) // Ñ¡ÖÐÖµ²¢¸´ÖÆ textarea.select() const result = document.execCommand('Copy') if (result) { console.log('¸´ÖÆÀÖ³É') // ¿Éƾ֤ÏîÄ¿UI×ÐϸÉè¼Æ } document.body.removeChild(textarea) } // °ó¶¨µã»÷ÊÂÎñ¾ÍÊÇËùνµÄÒ»¼ü copy À² el.addEventListener('click', el.handler) }, // µ±´«½øÀ´µÄÖµ¸üеÄʱ¼ä´¥·¢ componentUpdated(el, { value }) { el.$value = value }, // Ö¸ÁîÓëÔªËØ½â°óµÄʱ¼äÒÆ³ýÊÂÎñ°ó¶¨ unbind(el) { el.removeEventListener('click', el.handler) },}export default copyv-longpressʵÏÖ³¤°´Óû§ÐèÒª°´Ï²¢°´×¡°´Å¥¼¸ÃëÖÓ´¥·¢ÏìÓ¦µÄÊÂÎñ½¨ÉèÒ»¸ö¼ÆÊ±Æ÷ 2 ÃëºóÖ´Ðк¯Êýµ±Óû§°´Ï°´Å¥Ê±´¥·¢ mousedown ÊÂÎñÆô¶¯¼ÆÊ±Æ÷£»Óû§ËÉ¿ª°´Å¥Ê±Å²Óà mouseout ÊÂÎñÈôÊÇ mouseup ÊÂÎñ 2 ÃëÄÚ±»´¥·¢¾Íɨ³ý¼ÆÊ±Æ÷¿´³ÉÒ»¸öͨË׵ĵã»÷ÊÂÎñÈôÊǼÆÊ±Æ÷ûÓÐÔÚ 2 ÃëÄÚɨ³ýÔòÅжÏΪһ´Î³¤°´¿ÉÒÔÖ´ÐйØÁªµÄº¯ÊýÔÚÒÆ¶¯¶ËҪ˼Á¿ touchstarttouchend ÊÂÎñconst longpress = { bind: function (el, binding, vNode) { if (typeof binding.value !== 'function') { throw 'callback must be a function' } // ½ç˵±äÁ¿ let pressTimer = null // ½¨Éè¼ÆÊ±Æ÷£¨ 2ÃëºóÖ´Ðк¯Êý £© let start = (e) => { if (e.type === 'click' && e.button !== 0) { return } if (pressTimer === null) { pressTimer = setTimeout(() => { handler() }, 2000) } } // ×÷·Ï¼ÆÊ±Æ÷ let cancel = (e) => { if (pressTimer !== null) { clearTimeout(pressTimer) pressTimer = null } } // ÔËÐк¯Êý const handler = (e) => { binding.value(e) } // Ìí¼ÓÊÂÎñ¼àÌýÆ÷ el.addEventListener('mousedown', start) el.addEventListener('touchstart', start) // ×÷·Ï¼ÆÊ±Æ÷ el.addEventListener('click', cancel) el.addEventListener('mouseout', cancel) el.addEventListener('touchend', cancel) el.addEventListener('touchcancel', cancel) }, // µ±´«½øÀ´µÄÖµ¸üеÄʱ¼ä´¥·¢ componentUpdated(el, { value }) { el.$value = value }, // Ö¸ÁîÓëÔªËØ½â°óµÄʱ¼äÒÆ³ýÊÂÎñ°ó¶¨ unbind(el) { el.removeEventListener('click', el.handler) },}export default longpressv-debounce±ÜÃâ°´Å¥ÔÚ¶Ìʱ¼äÄÚ±»¶à´Îµã»÷ʹÓ÷À¶¶º¯ÊýÏÞÖÆ»®×¼Ê±¼äÄÚÖ»Äܵã»÷Ò»´Î½ç˵һ¸öÑÓ³ÙÖ´ÐеÄÒªÁìÈôÊÇÔÚÑÓ³Ùʱ¼äÄÚÔÙŲÓøÃÒªÁìÔòÖØÐÂÅÌËãÖ´ÐÐʱ¼ä½«Ê±¼ä°ó¶¨ÔÚ click ÒªÁìÉÏconst debounce = { inserted: function (el, binding) { let timer el.addEventListener('keyup', () => { if (timer) { clearTimeout(timer) } timer = setTimeout(() => { binding.value() }, 1000) }) },}export default debouncev-emoji¿ª·¢ÖÐÓöµ½µÄ±íµ¥ÊäÈëÍùÍù»áÓжÔÊäÈëÄÚÈݵÄÏÞÖÆºÃ±È²»¿ÉÊäÈëÐÄÇéºÍÌØÊâ×Ö·ûÖ»ÄÜÊäÈëÊý×Ö»ò×ÖĸµÈƾ֤ÕýÔò±í´ïʽÉè¼Æ×Ô½ç˵´¦Öóͷ£±íµ¥ÊäÈë¹æÔòµÄÖ¸ÁîÏÂÃæÒÔեȡÊäÈëÐÄÇéºÍÌØÊâ×Ö·ûΪÀýlet findEle = (parent, type) => { return parent.tagName.toLowerCase() === type ? parent : parent.querySelector(type)}const trigger = (el, type) => { const e = document.createEvent('HTMLEvents') e.initEvent(type, true, true) el.dispatchEvent(e)}const emoji = { bind: function (el, binding, vnode) { // ÕýÔò¹æÔò¿Éƾ֤ÐèÇó×Ô½ç˵ var regRule = /[^u4E00-u9FA5|d|a-zA-Z|rns,.?!¡­¡ª&$=()-+/*{}[]]|s/g let $inp = findEle(el, 'input') el.$inp = $inp $inp.handle = function () { let val = $inp.value $inp.value = val.replace(regRule, '') trigger($inp, 'input') } $inp.addEventListener('keyup', $inp.handle) }, unbind: function (el) { el.$inp.removeEventListener('keyup', el.$inp.handle) },}export default emojiv-LazyLoadʵÏÖÒ»¸öͼƬÀÁ¼ÓÔØÖ¸ÁîÖ»¼ÓÔØä¯ÀÀÆ÷¿É¼ûÇøÓòµÄͼƬͼƬÀÁ¼ÓÔØµÄÔ­ÀíÖ÷ÒªÊÇÅжÏÄ¿½ñͼƬÊÇ·ñµ½ÁË¿ÉÊÓÇøÓòÕâÒ»½¹µãÂß¼­ÊµÏÖµÄÄõ½ËùÓеÄͼƬ Dom ±éÀúÿ¸öͼƬÅжÏÄ¿½ñͼƬÊÇ·ñµ½ÁË¿ÉÊÓÇø¹æÄ£ÄÚÈôÊǵ½Á˾ÍÉèÖÃͼƬµÄ src ÊôÐÔ²»È»ÏÔʾĬÈÏͼƬͼƬÀÁ¼ÓÔØÓÐÁ½ÖÖ·½·¨¿ÉÒÔʵÏÖÒ»ÊÇ°ó¶¨ srcoll ÊÂÎñ¾ÙÐмàÌý¶þÊÇʹÓà IntersectionObserver ÅжÏͼƬÊÇ·ñµ½ÁË¿ÉÊÓÇøÓò¿ÉÊÇÓÐä¯ÀÀÆ÷¼æÈÝÐÔÎÊÌâÏÂÃæ·â×°Ò»¸öÀÁ¼ÓÔØÖ¸Áî¼æÈÝÁ½ÖÖÒªÁìÅжÏä¯ÀÀÆ÷ÊÇ·ñÖ§³Ö IntersectionObserver APIÈôÊÇÖ§³Ö¾ÍʹÓà IntersectionObserver ʵÏÖÀÁ¼ÓÔØ²»È»ÔòʹÓà srcoll ÊÂÎñ¼àÌý + ½ÚÔ¼µÄÒªÁìʵÏÖconst LazyLoad = { // installÒªÁì install(Vue, options) { const defaultSrc = options.default Vue.directive('lazy', { bind(el, binding) { LazyLoad.init(el, binding.value, defaultSrc) }, inserted(el) { if (IntersectionObserver) { LazyLoad.observe(el) } else { LazyLoad.listenerScroll(el) } }, }) }, // ³õʼ»¯ init(el, val, def) { el.setAttribute('data-src', val) el.setAttribute('src', def) }, // ʹÓÃIntersectionObserver¼àÌýel observe(el) { var io = new IntersectionObserver((entries) => { const realSrc = el.dataset.src if (entries[0].isIntersecting) { if (realSrc) { el.src = realSrc el.removeAttribute('data-src') } } }) io.observe(el) }, // ¼àÌýscrollÊÂÎñ listenerScroll(el) { const handler = LazyLoad.throttle(LazyLoad.load, 300) LazyLoad.load(el) window.addEventListener('scroll', () => { handler(el) }) }, // ¼ÓÔØÕæÊµÍ¼Æ¬ load(el) { const windowHeight = document.documentElement.clientHeight const elTop = el.getBoundingClientRect().top const elBtm = el.getBoundingClientRect().bottom const realSrc = el.dataset.src if (elTop - windowHeight < 0 && elBtm > 0) { if (realSrc) { el.src = realSrc el.removeAttribute('data-src') } } }, // ½ÚÔ¼ throttle(fn, delay) { let timer let prevTime return function (...args) { const currTime = Date.now() const context = this if (!prevTime) prevTime = currTime clearTimeout(timer) if (currTime - prevTime > delay) { prevTime = currTime fn.apply(context, args) clearTimeout(timer) return } timer = setTimeout(function () { prevTime = Date.now() timer = null fn.apply(context, args) }, delay) } },}export default LazyLoadv-permission×Ô½ç˵һ¸öȨÏÞÖ¸Áî¶ÔÐèҪȨÏÞÅÐ¶ÏµÄ Dom ¾ÙÐÐÏÔʾÒþ²Ø»ñȡһ¸öȨÏÞÊý×éÊý¾ÝÅжÏÓû§µÄȨÏÞÊÇ·ñÔÚÕâ¸öÊý×éÄÚÈôÊÇÊÇÔòÏÔʾ²»È»ÔòÒÆ³ý Domimport Store from '@/store'const permission = { inserted: function (el, binding) { const value = binding.value; if (value) { const permission = Store.getters.permission; if (!permission.includes(value)) { el.parentNode && el.parentNode.removeChild(el) } } },}export default permission

vue-waterMarker¸øÕû¸öÒ³ÃæÌí¼ÓÅ侰ˮӡʹÓà canvas ÌØÕ÷ÌìÉú base64 ÃûÌõÄͼƬÎļþÉèÖÃÆä×ÖÌå¾ÞϸÑÕÉ«µÈ½«ÆäÉèÖÃΪÅ侰ͼƬ´Ó¶øÊµÏÖÒ³Ãæ»ò×é¼þˮӡЧ¹ûfunction addWaterMarker(str, parentNode, font, textColor) { // ˮӡÎÄ×Ö¸¸ÔªËØ×ÖÌåÎÄ×ÖÑÕÉ« var can = document.createElement('canvas') parentNode.appendChild(can) can.width = 200 can.height = 150 can.style.display = 'none' var cans = can.getContext('2d') cans.rotate((-20 * Math.PI) / 180) cans.font = font || '16px Microsoft JhengHei' cans.fillStyle = textColor || 'rgba(180, 180, 180, 0.3)' cans.textAlign = 'left' cans.textBaseline = 'Middle' cans.fillText(str, can.width / 10, can.height / 2) parentNode.style.backgroundImage = 'url(' + can.toDataURL('image/png') + ')'}const waterMarker = { bind: function (el, binding) { addWaterMarker(binding.value.text, el, binding.value.font, binding.value.textColor) },}export default waterMarkerv-draggableʵÏÖÒ»¸öÍÏ×§Ö¸Áî¿ÉÔÚÒ³Ãæ¿ÉÊÓÇøÓòí§ÒâÍÏ×§ÔªËØÉèÖÃÐèÒªÍÏ×§µÄÔªËØÎªÏà¶Ô¶¨Î»Æä¸¸ÔªËØÎª¾ø¶Ô¶¨Î»Êó±ê°´ÏÂ(onmousedown)ʱ¼Í¼ĿµÄÔªËØÄ¿½ñµÄ left ºÍ top ÖµÊó±êÒÆ¶¯(onmousemove)ʱÅÌËãÿ´ÎÒÆ¶¯µÄºáÏò¾àÀëºÍ×ÝÏò¾àÀëµÄת±äÖµ²¢¸Ä±äÔªËØµÄ left ºÍ top ÖµÊó±êËÉ¿ª(onmouseup)ʱÍê³ÉÒ»´ÎÍÏ×§const draggable = { inserted: function (el) { el.style.cursor = 'move' el.onmousedown = function (e) { let disx = e.pageX - el.offsetLeft let disy = e.pageY - el.offsetTop document.onmousemove = function (e) { let x = e.pageX - disx let y = e.pageY - disy let maxX = document.body.clientWidth - parseInt(window.getComputedStyle(el).width) let maxY = document.body.clientHeight - parseInt(window.getComputedStyle(el).height) if (x < 0) { x = 0 } else if (x > maxX) { x = maxX } if (y < 0) { y = 0 } else if (y > maxY) { y = maxY } el.style.left = x + 'px' el.style.top = y + 'px' } document.onmouseup = function () { document.onmousemove = document.onmouseup = null } } },}export default draggable×ªÔØÎÄÕÂÖÁ×÷Õߣºlzg9527 Á´½Ó£ºhttps://segmentfault.com/a/1190000038475001

¼ûµ½ËÎÍòÈ«µÄÉñÇéÁÖÔ¾ÂíÉÏËÉÁË¿ÚÎÇËûÊʲÅÒѾ­×öºÃ¶öÁ˸¹±³ÊܵеÄ×¼±¸¿ÉÊÇÏÖÔÚ¿´À´ÀÏÌìÕվɺÜÕÕ¹ËËûµÄÏÖÔÚËû²»µ«½öÊÇÉÙÁËÒ»¸ö³ðÈËÕâô¼òÆÓ¶øÊǶàÁËÒ»¸öÅóÙ­¶àÒ»¸öÅóÙ­±ÈÉÙÁ½¸ö³ðÈ˶¼Öµû¶à¾ÃÓðõüÀïµÄ¾Æ±ã¼ûÁ˵×

µ¼ÑÝ£º
Լʲ¡¤ººÃܶû¶Ù/
±à¾ç£º
Wyman;Âõ¿Ë¶û¡¤Â¬¼ª°Â;Birdie/
¸üУº

2025-10-16 16:29:09

±¸×¢£º
¹úÓï
ÆÀ¼Û£º
mypreciousʲôÒâ˼

Ñ¡¼¯²¥·Å
ÅÅÐò

Ñ¡Ôñ²¥·ÅÔ´
¿ìËÙ²¥·Å¢Ù
µÚ1¼¯ µÚ2¼¯ µÚ3¼¯ µÚ4¼¯ µÚ5¼¯ µÚ6¼¯ µÚ7¼¯ µÚ8¼¯ µÚ9¼¯ µÚ10¼¯ µÚ11¼¯ µÚ12¼¯ µÚ13¼¯ µÚ14¼¯ µÚ15¼¯ µÚ16¼¯ µÚ17¼¯ µÚ18¼¯ µÚ19¼¯ µÚ20¼¯ µÚ21¼¯ µÚ22¼¯ µÚ23¼¯ µÚ24¼¯ µÚ25¼¯ µÚ26¼¯ µÚ27¼¯ µÚ28¼¯ µÚ29¼¯ µÚ30¼¯ µÚ31¼¯ µÚ32¼¯ µÚ33¼¯ µÚ34¼¯ µÚ35¼¯ µÚ36¼¯ µÚ37¼¯ µÚ38¼¯

ÕýÔÚÈÈÓ³

Ó¡¶ÈÄáÎ÷ÑÇÓï VideoZi
¶¹°ê:7.7·Ö
ͬÁäÈË
VideoZi
¶¹°ê:6.4·Ö
¾¯ÖÐÓ¢ÐÛ
ÄÏ·Ç¶Ô°× VideoZi
¶¹°ê:6.4·Ö
±´À­µÄÉñÃØ
Ó¢Óï¶Ô°× VideoZi
¶¹°ê:7.3·Ö
ÐþɫС˵
ÆäËû VideoZi
¶¹°ê:7.4·Ö
ÎҵĸÇÊÀÓ¢ÐÛ
¹úÓï¶Ô°× VideoZi
¶¹°ê:3.3·Ö
ÁðÁ§Í¥Ôº
º«Óï¶Ô°× VideoZi
¶¹°ê:8.4·Ö
ÎÞÖ¤Ö®°®
Ì©Óï¶Ô°× VideoZi
¶¹°ê:4.7·Ö
ÀËÂþÒ½Éú½ðʦ¸µ3
¹úÓï¶Ô°× VideoZi
¶¹°ê:4.6·Ö
ÎÞÃûµØ´ø
¹úÓï¶Ô°× VideoZi
¶¹°ê:4.8·Ö
ÎÒµÄÒüС½ã
ëÀûÓï VideoZi
¶¹°ê:5.5·Ö
ËýÐÄÌïµÄÑý¹Ö
Ó¢Óï¶Ô°× VideoZi
¶¹°ê:7.6·Ö
O¼Çʵ¼¢òÔÁÓï
ëÀûÓï VideoZi
¶¹°ê:5.6·Ö
Ñ©¹úÉÙÄê
ÈÕÓï¶Ô°× VideoZi
¶¹°ê:8.7·Ö
É
Ó¡¶ÈÄáÎ÷ÑÇÓï VideoZi
¶¹°ê:3.4·Ö
3ÔÂ29ÈÕ 2023×ãÇòÓÑÒêÈü °¢¸ùÍ¢VS¿âÀ­Ë÷
Ó¢Óï¶Ô°× VideoZi
¶¹°ê:6.7·Ö
ɱÆÞ¶þÈË×飨¹úÓ
Ó¡¶ÈÄáÎ÷ÑÇÓï VideoZi
¶¹°ê:5.3·Ö
³èÎïÇéÔµ¹úÓï
Ì©Óï¶Ô°× VideoZi
¶¹°ê:6.3·Ö
AVÑÝÔ±ÅÄÉãѵÁ·
Ó¢Óï¶Ô°× VideoZi
¶¹°ê:3.6·Ö
²Ð¿á
¹úÓï¶Ô°× VideoZi
¶¹°ê:6.8·Ö
»ðÉÕÔ²Ã÷Ô°
Ê×Ò³
Ó°Ï·
Ò»Á¬¾ç
×ÛÒÕ
¶¯Âþ
APP
ÍøÕ¾µØÍ¼