您好,登錄后才能下訂單哦!
這篇文章主要講解了“JavaScript怎么創建一個非自動播放的GIF網絡組件”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“JavaScript怎么創建一個非自動播放的GIF網絡組件”吧!
這里用的gif是小駱駝和貓的這種可愛互動:
哇,太可愛了!我可以看一天這個
對于這個 Web 組件,我們需要一些東西:
畫布(“縮略圖”所在的位置)
一張圖片(實際的 gif)
標有“gif”的標簽
一些造型
讓我們這樣做:
const noAutoplayGifTemplate = document.createElement('template') noAutoplayGifTemplate.innerHTML = ` <style> .no-autoplay-gif { --size: 30px; cursor: pointer; position: relative; } .no-autoplay-gif .gif-label { border: 2px solid #000; background-color: #fff; border-radius: 100%; width: var(--size); height: var(--size); text-align: center; font: bold calc(var(--size) * 0.4)/var(--size) sans-serif; position: absolute; top: calc(50% - var(--size) / 2); left: calc(50% - var(--size) / 2); } .no-autoplay-gif .hidden { display: none; } </style> <div class="no-autoplay-gif"> <canvas /> <span class="gif-label" aria-hidden="true">GIF</span> <img class="hidden"> </div>
接下來,我們將創建一個派生自 HTMLElement 的類。 此類稍后將包含播放/停止切換行為。
class NoAutoplayGif extends HTMLElement { constructor() { super() // 在此處添加設置 } loadImage() { // 在此處添加渲染 } static get observedAttributes() { return ['src', 'alt']; } attributeChangedCallback(name, oldVal, newVal) { if (oldVal !== newVal || oldVal === null) { this.loadImage() } } }
這里還有一些樣板:一個空的渲染函數,它將加載圖像并顯示縮略圖,以及一個構造函數和一些特定于 Web 組件的方法。
好的,這已經是很多代碼了。讓我解釋。
該loadImage
函數不會自動調用,我們需要自己調用。該函數attributeChangedCallback
讓我們定義當任何指定屬性發生observedAttributes
變化時會發生什么。在這種情況下:加載圖像并顯示它。瀏覽器大致做的是這樣的:
遇到 web 組件
調用它的構造函數(調用constructor()
)
將其屬性一一設置為 DOM 中的設置(因此,src="llama.gif"
調用.setAttribute('src', 'llama.gif')
attributeChangedCallback
對每個更改的屬性執行
簽入構造函數時,這些屬性一開始是空的,稍后才會填充。如果我們需要一個或多個屬性來實際進行渲染,那么如果我們 知道 這些屬性不存在,那么調用該loadImage
函數是沒有意義的。所以我們不在構造函數中調用它,但只有在有可能存在屬性時才調用它。**
為了完成樣板化,讓我們將這個類定義為我們的自定義 Web 組件:
class NoAutoplayGif extends HTMLElement { // ... } window.customElements.define('no-autoplay-gif', NoAutoplayGif)
我們現在可以像這樣使用這個組件:
<no-autoplay-gif src="..." alt="Llama and cat" />
有趣的來了。我們需要添加noAutoplayGifTemplate
作為組件的shadow DOM。src
這已經可以渲染 DOM,但是如果沒有andalt
屬性,我們仍然不能做很多事情。因此我們只從 shadow DOM 中收集一些我們稍后需要的元素,并且已經附加了一個單擊偵聽器來切換啟動/停止模式。
class NoAutoplayGif extends HTMLElement { constructor() { super() // 添加 shadow DOM this._shadowRoot = this.attachShadow({ mode: 'open' }) // 從上面添加模板 this._shadowRoot.appendChild( noAutoplayGifTemplate.content.cloneNode(true) ) // 我們稍后會需要這些 this.canvas = this._shadowRoot.querySelector('canvas') this.img = this._shadowRoot.querySelector('img') this.label = this._shadowRoot.querySelector('.gif-label') this.container = this._shadowRoot.querySelector('.no-autoplay-gif') // 使整個東西可點擊 this._shadowRoot.querySelector('.no-autoplay-gif').addEventListener('click', () => { this.toggleImage() }) } // ... }
為了不遇到未定義的方法錯誤,我們還添加了這三個方法:
class NoAutoplayGif extends HTMLElement { // ... toggleImage(force = undefined) { this.img.classList.toggle('hidden', force) // We need to check for undefined values, as JS does a distinction here. // We cannot simply negate a given force value (i.e. hiding one thing and unhiding another) // as an undefined value would actually toggle the img, but // always hide the other two, because !undefined == true this.canvas.classList.toggle('hidden', force !== undefined ? !force : undefined) this.label.classList.toggle('hidden', force !== undefined ? !force : undefined) } start() { this.toggleImage(false) } stop() { this.toggleImage(true) } // ... }
start/stop 方法允許我們強制啟動或強制停止 gif。理論上,我們現在可以這樣做:
const gif = document.querySelector('no-autoplay-gif') gif.start() gif.stop() gif.toggleImage()
最后,我們可以添加圖片加載部分。讓我們先做一些驗證:
class NoAutoplayGif extends HTMLElement { // ... loadImage() { const src = this.getAttribute('src') const alt = this.getAttribute('alt') if (!src) { console.warn('A source gif must be given') return } if (!src.endsWith('.gif')) { console.warn('Provided src is not a .gif') return } // More stuff } // ... }
最后一步,我們可以加載圖像,設置一些寬度和高度并使用畫布:
class NoAutoplayGif extends HTMLElement { // ... loadImage() { // Validation this.img.onload = event => { const width = event.currentTarget.width const height = event.currentTarget.height // Set width and height of the entire thing this.canvas.setAttribute('width', width) this.canvas.setAttribute('height', height) this.container.setAttribute('style', ` width: ${width}px; height: ${height}px; `) // "Draws" the gif onto a canvas, i.e. the first // frame, making it look like a thumbnail. this.canvas.getContext('2d').drawImage(this.img, 0, 0) } // Trigger the loading this.img.src = src this.img.alt = alt } // ... }
感謝各位的閱讀,以上就是“JavaScript怎么創建一個非自動播放的GIF網絡組件”的內容了,經過本文的學習后,相信大家對JavaScript怎么創建一個非自動播放的GIF網絡組件這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。