中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScript怎么創建一個非自動播放的GIF網絡組件

發布時間:2022-02-19 13:38:34 來源:億速云 閱讀:135 作者:iii 欄目:開發技術

這篇文章主要講解了“JavaScript怎么創建一個非自動播放的GIF網絡組件”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“JavaScript怎么創建一個非自動播放的GIF網絡組件”吧!

一些很可愛的測試數據

這里用的gif是小駱駝和貓的這種可愛互動:

JavaScript怎么創建一個非自動播放的GIF網絡組件

哇,太可愛了!我可以看一天這個

構建 Web 組件

對于這個 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網絡組件這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宜都市| 开江县| 宜君县| 荣昌县| 青海省| 南溪县| 东安县| 南京市| 阿拉尔市| 蓬安县| 巢湖市| 睢宁县| 丹凤县| 宁远县| 宜阳县| 孟津县| 墨脱县| 寻乌县| 雅江县| 丰宁| 武义县| 印江| 宽甸| 靖西县| 湛江市| 昭苏县| 长治县| 西乡县| 双峰县| 曲阳县| 黄龙县| 喜德县| 桐城市| 黔南| 兰溪市| 资讯| 玛纳斯县| 马山县| 赣榆县| 清镇市| 柳河县|