整合營(yíng)銷(xiāo)服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢(xún)熱線:

          頭條首發(fā)必備指南#為了避免首發(fā)內(nèi)容被他人抄襲

          頭條首發(fā)必備指南#為了避免首發(fā)內(nèi)容被他人抄襲

          頭條首發(fā)必備指南#為了避免首發(fā)內(nèi)容被他人抄襲,您可以采取以下措施:

          1. 使用版權(quán)聲明

          在您的內(nèi)容中添加版權(quán)聲明,包括版權(quán)符號(hào)(?)、出版年份和版權(quán)持有人的名字。這樣可以明確表示您對(duì)內(nèi)容的所有權(quán),并在法律上提供一定程度的保護(hù)。

          2. 添加水印

          對(duì)于圖像和視頻內(nèi)容,添加水印是一種常見(jiàn)的保護(hù)方法。水印通常包含文本或標(biāo)識(shí),被添加到內(nèi)容中,使得內(nèi)容竊賊難以或不可能在不改變或降低原始內(nèi)容質(zhì)量的情況下將其去除。

          3. 申請(qǐng)DMCA保護(hù)

          通過(guò)美國(guó)的《數(shù)字千年版權(quán)法案》(DMCA),您可以申請(qǐng)保護(hù)您的網(wǎng)站免受內(nèi)容盜竊。一旦您的網(wǎng)站被標(biāo)記為重復(fù)內(nèi)容或剽竊,DMCA可以幫助您要求任何未經(jīng)許可復(fù)制您的內(nèi)容的人從其網(wǎng)站上刪除這些內(nèi)容。

          4. 制定使用條款

          在您的網(wǎng)站上制定使用條款,明確規(guī)定訪問(wèn)者如何使用您的內(nèi)容以及任何未經(jīng)授權(quán)的使用的后果。這是一份法律協(xié)議,可以用來(lái)保護(hù)您的內(nèi)容,防止未經(jīng)授權(quán)的使用。

          5. 使用密碼保護(hù)

          對(duì)于某些內(nèi)容,您可以設(shè)置密碼保護(hù),限制對(duì)這些內(nèi)容的訪問(wèn)。這樣,只有經(jīng)過(guò)授權(quán)的用戶(hù)才能查看或下載這些內(nèi)容,從而防止未授權(quán)的訪問(wèn)和復(fù)制。

          6. 使用"無(wú)索引"元標(biāo)簽

          通過(guò)在HTML代碼中添加"無(wú)索引"元標(biāo)簽,您可以告訴搜索引擎不要索引某個(gè)特定網(wǎng)頁(yè)。這樣,您的內(nèi)容將不會(huì)顯示在搜索引擎的結(jié)果頁(yè)上,減少了被他人找到和復(fù)制的機(jī)會(huì)。

          7. 保留創(chuàng)作記錄

          保留作品的創(chuàng)作記錄,包括草稿、修改稿、最終稿等。這些記錄可以證明作品的創(chuàng)作過(guò)程和原創(chuàng)性,防止他人抄襲。

          8. 使用原創(chuàng)性檢測(cè)軟件

          使用原創(chuàng)性檢測(cè)軟件可以幫助檢測(cè)作品是否與現(xiàn)有文獻(xiàn)相同或相似,從而避免抄襲和剽竊。

          9. 及時(shí)維權(quán)

          如果發(fā)現(xiàn)作品被抄襲或剽竊,應(yīng)及時(shí)采取措施維權(quán)。可以通過(guò)法律途徑或向相關(guān)機(jī)構(gòu)投訴,要求侵權(quán)者停止侵權(quán)行為并賠償損失。

          通過(guò)上述措施,您可以在一定程度上保護(hù)您的首發(fā)內(nèi)容不被他人抄襲。同時(shí),也要注意不斷提升自己的創(chuàng)作水平,形成獨(dú)特的風(fēng)格和觀點(diǎn),這樣即使有人試圖模仿,也難以達(dá)到同樣的原創(chuàng)性和深度。#頭條怎樣不侵權(quán)# #版權(quán)問(wèn)題大討論# #標(biāo)題是形式#

          信不少開(kāi)發(fā)人員都會(huì)遇見(jiàn)這個(gè)問(wèn)題,基本上每個(gè)網(wǎng)站都會(huì)有版權(quán)聲明,其中會(huì)用到版權(quán)符號(hào)copyright:?,但是我們?cè)陂_(kāi)發(fā)的過(guò)程中,是不能直接以漢字輸入?的,需要用到html代碼來(lái)實(shí)現(xiàn)輸出,否則顯示是不正常的,那么我們應(yīng)該怎么利用html代碼來(lái)正常的輸出版權(quán)符號(hào)“?”的呢?

          如果我沒(méi)有記錯(cuò)的話,html版權(quán)符號(hào)是?

          下面再給大家推薦其他的html特殊字符編碼

          使用一個(gè)“&”后面帶上特殊符指令,就可以了

          接下來(lái)再看一下下面的這些特殊符號(hào)的轉(zhuǎn)義寫(xiě)法

          ?

          最后還有這些:

          大家可以收藏下上面這些html符號(hào)編碼,很有可能會(huì)用的到啊!

          、前言

          通常情況下,HTML 中的圖片資源會(huì)自上而下依次加載,而部分圖片只有在用戶(hù)向下滾動(dòng)頁(yè)面的場(chǎng)景下才能被看見(jiàn),否則這部分圖片的流量就白白浪費(fèi)了。

          所以,對(duì)于那些含有大量圖片資源的網(wǎng)站,會(huì)采用“按需加載”的方式,也就是當(dāng)圖片資源出現(xiàn)在視口區(qū)域內(nèi),才會(huì)被加載,這樣可能會(huì)影響一丟丟用戶(hù)體驗(yàn),但是能大大節(jié)省網(wǎng)站的流量。

          而上述“按需加載”的方式就是今天的主角 -- 圖片懶加載技術(shù)

          二、原理

          圖片懶加載技術(shù)主要通過(guò)監(jiān)聽(tīng)圖片資源容器是否出現(xiàn)在視口區(qū)域內(nèi),來(lái)決定圖片資源是否被加載。

          那么實(shí)現(xiàn)圖片懶加載技術(shù)的核心就是如何判斷元素處于視口區(qū)域之內(nèi)。

          三、前世

          早前實(shí)現(xiàn)的思路:

          • 給目標(biāo)元素指定一張占位圖,將真實(shí)的圖片鏈接存儲(chǔ)在自定義屬性中,通常是data-src;
          • 監(jiān)聽(tīng)與用戶(hù)滾動(dòng)行為相關(guān)的 scroll 事件;
          • 在 scroll 事件處理程序中利用 Element.getBoundingClientRect() 方法判斷目標(biāo)元素與視口的交叉狀態(tài);
          • 當(dāng)目標(biāo)元素與視口的交叉狀態(tài)大于0時(shí),將真實(shí)的圖片鏈接賦給目標(biāo)元素 src 屬性或者 backgroundImage 屬性。

          1、scroll 事件

          scroll 事件可能會(huì)被高頻度的觸發(fā),而按照上述思路,必然會(huì)在 scroll 事件處理程序中出現(xiàn)大量的 DOM 操作,這很可能會(huì)使頁(yè)面不再“如絲般順滑”,這時(shí)就需要降低 DOM 操作的頻率。

          降低 DOM 操作的頻率可以采用函數(shù)節(jié)流的方式,函數(shù)節(jié)流能夠確保在固定時(shí)間間隔只執(zhí)行一次操作。

          與函數(shù)節(jié)流相關(guān)的另一個(gè)概念叫做函數(shù)防抖,這位兄弟同樣等待一個(gè)時(shí)間間隔執(zhí)行操作,但是它被打斷之后就需要重新開(kāi)始計(jì)時(shí)。

          這也是此場(chǎng)景下采用函數(shù)節(jié)流的原因。在 JavaScript 中可以采用 setTimeout + 閉包的方式實(shí)現(xiàn)函數(shù)節(jié)流:

          function throttle (fn, interval=500) {
           let timer=null
           let firstTime=true
           return function (...args) {
           if (firstTime) {
           // 第一次加載
           fn.apply(this, args)
           return firstTime=false
           }
           if (timer) {
           // 定時(shí)器正在執(zhí)行中,跳過(guò)
           return
           }
           timer=setTimeout(()=> {
           clearTimeout(timer)
           timer=null
           fn.apply(this, args)
           }, interval)
           }
          }
          

          除了上述 setTimeout + 閉包的實(shí)現(xiàn)方式,還可以通過(guò) window.requestAnimationFrame() 方法實(shí)現(xiàn),這里不再贅述,有興趣的同學(xué)可以自己嘗試嘗試。

          2、getBoundingClientRect()方法

          JavaScript 提供 Element.getBoundingClientRect() 方法返回元素的大小以及相對(duì)于視口的位置信息,接下來(lái)會(huì)用到返回對(duì)象的四個(gè)屬性:

          • top 和 left 是目標(biāo)元素左上角坐標(biāo)與網(wǎng)頁(yè)左上角坐標(biāo)的偏移值;
          • width 和 height 是目標(biāo)元素自身的寬度和高度。

          再結(jié)合視口的高度和寬度,即可判斷元素是否出現(xiàn)在視口區(qū)域內(nèi):

          function isElementInViewport (el) {
           const { top, height, left, width }=el.getBoundingClientRect()
           const w=window.innerWidth || document.documentElement.clientWidth
           const h=window.innerHeight || document.documentElement.clientHeight
           return (
           top <=h &&
           (top + height) >=0 &&
           left <=w &&
           (left + width) >=0
           )
          }
          

          3、實(shí)現(xiàn)

          接下來(lái)在實(shí)現(xiàn)圖片懶加載的過(guò)程中,還需要注意一些小問(wèn)題:

          • scroll 事件只有在滾動(dòng)行為發(fā)生時(shí),才會(huì)被觸發(fā),這里需要手動(dòng)加載一次首屏的圖片;
          • 利用 addEventListener 注冊(cè)事件處理程序時(shí),需要保存事件處理程序的引用,以便銷(xiāo)毀注冊(cè)的事件程序。
          function LazyLoad (el, options) {
           if (!(this instanceof LazyLoad)) {
           return new LazyLoad(el)
           }
           this.setting=Object.assign({}, { src: 'data-src', srcset: 'data-srcset', selector: '.lazyload' }, options)
           if (typeof el==='string') {
           el=document.querySelectorAll(el)
           }
           this.images=Array.from(el)
           this.listener=this.loadImage()
           this.listener()
           this.initEvent()
          }
          LazyLoad.prototype={
           loadImage () {
           return throttle(function () {
           let startIndex=0
           while (startIndex < this.images.length) {
           const image=this.images[startIndex]
           if (isElementInViewport(image)) {
           const src=image.getAttribute(this.setting.src)
           const srcset=image.getAttribute(this.setting.srcset)
           if (image.tagName.toLowerCase()==='img') {
           if (src) {
           image.src=src
           }
           if (srcset) {
           image.srcset=srcset
           }
           } else {
           image.style.backgroundImage=`url(${src})`
           }
           this.images.splice(startIndex, 1)
           continue
           }
           startIndex++
           }
           
           if (!this.images.length) {
           this.destroy()
           }
           }).bind(this)
           },
           initEvent () {
           window.addEventListener('scroll', this.listener, false)
           },
           destroy () {
           window.removeEventListener('scroll', this.listener, false)
           this.images=null
           this.listener=null
           }
          }
          

          四、今生

          如今,Web為開(kāi)發(fā)者提供了 IntersectionObserver 接口,它可以異步監(jiān)聽(tīng)目標(biāo)元素與其祖先或視窗的交叉狀態(tài),注意這個(gè)接口是異步的,它不隨著目標(biāo)元素的滾動(dòng)同步觸發(fā),所以它并不會(huì)影響頁(yè)面的滾動(dòng)性能。

          IntersectionObserver 構(gòu)造函數(shù)接收兩個(gè)參數(shù),回調(diào)函數(shù)以及配置項(xiàng)。

          1、配置項(xiàng)

          配置項(xiàng)中的參數(shù)有以下三個(gè):

          • root:所監(jiān)聽(tīng)對(duì)象的具體祖先元素,默認(rèn)是 viewport ;
          • rootMargin:計(jì)算交叉狀態(tài)時(shí),將 margin 附加到祖先元素上,從而有效的擴(kuò)大或者縮小祖先元素判定區(qū)域;
          • threshold:設(shè)置一系列的閾值,當(dāng)交叉狀態(tài)達(dá)到閾值時(shí),會(huì)觸發(fā)回調(diào)函數(shù)。

          2、回調(diào)函數(shù)

          IntersectionObserver 實(shí)例執(zhí)行回調(diào)函數(shù)時(shí),會(huì)傳遞一個(gè)包含 IntersectionObserverEntry 對(duì)象的數(shù)組,該對(duì)象一共有七大屬性:

          • time:返回一個(gè)記錄從 IntersectionObserver 的時(shí)間原點(diǎn)到交叉被觸發(fā)的時(shí)間的時(shí)間戳;
          • target:目標(biāo)元素;
          • rootBounds:祖先元素的矩形區(qū)域信息;
          • boundingClientRect:目標(biāo)元素的矩形區(qū)域信息,與前面提到的 Element.getBoundingClientRect() 方法效果一致;
          • intersectionRect:祖先元素與目標(biāo)元素相交區(qū)域信息;
          • intersectionRatio:返回intersectionRect 與 boundingClientRect 的比例值;
          • isIntersecting:目標(biāo)元素是否與祖先元素相交。

          3、實(shí)現(xiàn)

          在此之前,還需要了解 IntersectionObserver 實(shí)例方法:

          • observe:開(kāi)始監(jiān)聽(tīng)一個(gè)目標(biāo)元素;
          • unobserve:停止監(jiān)聽(tīng)特定的元素;
          • disconnect:使 IntersectionObserver 對(duì)象停止監(jiān)聽(tīng)工作;
          • takeRecords:為所有監(jiān)聽(tīng)目標(biāo)返回一個(gè) IntersectionObserverEntry 對(duì)象數(shù)組并且停止監(jiān)聽(tīng)這些目標(biāo)。

          以下為實(shí)現(xiàn)代碼:

          function LazyLoad (images, options={}) {
           if (!(this instanceof LazyLoad)) {
           return new LazyLoad(images, options)
           }
           this.setting=Object.assign({}, { src: 'data-src', srcset: 'data-srcset', selector: '.lazyload' }, options)
           this.images=images || document.querySelectorAll(this.setting.selector)
           this.observer=null
           this.init()
          }
          LazyLoad.prototype.init=function () {
           let self=this
           let observerConfig={
           root: null,
           rootMargin: '0px',
           threshold: [0]
           }
           this.observer=new IntersectionObserver(entries=> {
           entries.forEach(entry=> {
           const target=entry.target
           if (entry.intersectionRatio > 0) {
           this.observer.unobserve(target)
           const src=target.getAttribute(this.setting.src)
           const srcset=target.getAttribute(this.setting.srcset)
           if ('img'===target.tagName.toLowerCase()) {
           if (src) {
           target.src=src
           }
           if (srcset) {
           target.srcset=srcset
           }
           } else {
           target.style.backgroundImage=`url(${src})`
           }
           }
           })
           }, observerConfig)
           this.images.forEach(image=> this.observer.observe(image))
          }
          

          五、總結(jié)

          到此,實(shí)現(xiàn)圖片懶加載主要有兩種方法:

          • 監(jiān)聽(tīng) scroll 事件,通過(guò) getBoundingClientRect() 計(jì)算目標(biāo)元素與視口的交叉狀態(tài);
          • IntersectionObserver 接口。

          第二種方法更加省心,到目前為止兼容性也還行:

          相比較下,第一種方法需要從各個(gè)方面去優(yōu)化 scroll 事件,從而達(dá)到頁(yè)面滾動(dòng)“如絲般順滑”的效果。最后,放上兩篇關(guān)于滾動(dòng)優(yōu)化的文章。

          • 百度外賣(mài)前端 -- 如何不擇手段提升scroll事件的性能(https://zhuanlan.zhihu.com/p/30078937)
          • 高性能滾動(dòng) scroll 及頁(yè)面渲染優(yōu)化(https://www.cnblogs.com/coco1s/p/5499469.html)

          版權(quán)

          作者:descire

          鏈接:https://juejin.im/post/5c9376506fb9a070fc623b2c

          著作權(quán)歸作者所有。


          主站蜘蛛池模板: 国模视频一区二区| 91久久精品午夜一区二区| 国产色综合一区二区三区| 国产伦精品一区二区三区无广告| 香蕉视频一区二区三区| 国产在线一区二区视频| 国产一区二区草草影院| 国产精品香蕉在线一区| 亚洲欧洲精品一区二区三区| 亚洲国产精品一区二区第一页 | 亚洲一区二区三区久久久久| 中文乱码精品一区二区三区| 视频一区视频二区日韩专区| 日韩三级一区二区| 日本一区二区在线免费观看| 日本精品3d动漫一区二区| 亚洲AV日韩AV一区二区三曲| 一区二区传媒有限公司| 亚洲Av无码国产一区二区| 欧美日韩精品一区二区在线视频| 精品国产aⅴ无码一区二区| 精品性影院一区二区三区内射| 久久亚洲AV午夜福利精品一区| 中文字幕在线视频一区| 香蕉视频一区二区| 亚欧色一区W666天堂| 国产福利一区二区三区在线观看| 日韩精品一区二区三区中文精品| 麻豆一区二区免费播放网站| 国产乱码精品一区二区三区麻豆| 日韩精品一区二区三区国语自制| 精品在线视频一区| 国内精品无码一区二区三区| 日本不卡免费新一区二区三区| 人妻体体内射精一区二区| 亚洲熟女综合色一区二区三区 | 日韩一区二区三区视频| 波多野结衣高清一区二区三区| 国产高清不卡一区二区| 亚洲另类无码一区二区三区| 视频一区二区三区免费观看|