先來講個題外話。不少技術開發可能只知道php和python。polymer是個什麼鬼!話很少說,進入正題。php
首先咱們須要知道,Web Components 包括了四個部分:css
Custom Elements 顧名思義,是提供一種方式讓開發者能夠自定義 HTML 元素,包括特定的組成,樣式和行爲。支持 Web Components 標準的瀏覽器會提供一系列 API 給開發者用於建立自定義的元素,或者擴展示有元素。
html
HTML Imports 是一種在 HTMLs 中引用以及複用其餘的 HTML 文檔的方式。這個 Import 很漂亮,能夠簡單理解爲咱們常見的模板中的 include
之類的做用。
python
咱們最多見的引入一個 css 文件的方式是:git
<link rel="stylesheet" href="/css/master.css">複製代碼複製代碼
Web Components 如今提供多了一個這個:github
<link rel="import" href="/components/date.html">複製代碼
能夠理解爲渲染模版。web
shadow dom提出了好久,最本質的需求是須要一個隔離組件代碼做用域的東西,例如我組件代碼的 CSS 不能影響其餘組件之類的,而 iframe
又過重而且可能有各類奇怪問題。數組
能夠這麼說,Shadow DOM 旨在提供一種更好地組織頁面元素的方式,來爲日趨複雜的頁面應用提供強大支持,避免代碼間的相互影響。瀏覽器
在建立元素時調用,且在設置屬性值並初始化本地dom以前調用。bash
在設置屬性值以前用於一次在調用。
在設置屬性值初始化本地dom以後調用。
初始化shadow dom樹以後,用於組件的一次性配置。(配置屬性最好使用觀察者)
元素附加(掛載)到dom後調用。至關於原生的connectedCallback。
主要用於添加文檔級事件監聽器,例如帶註釋的事件監聽器。
元素從dom中分離(卸載)後調用。至關於disconnectedCallback。
主要用途包括刪除添加的事件監聽器。
在元素屬性發生變動時調用。至關於原生的attributeChangedCallback。
佈局問題 數據都是經過動態獲取的可是數據結構該怎樣才能便於遍歷呢!
最開始我想到了雙層循環,數據結構爲[[27,28,29,30,31,1,2],[3,4,5,6,7,8,9]...]。這樣數據處理很是麻煩,可是基本能夠實現遍歷後上圖效果。
後來我想到了最近本身瞭解到到,display:grid。決定選用它做爲佈局實現上圖效果。遍歷和數據處理也不用那麼麻煩了。數據就能夠直接用一維數組[27,28,29,30,31,...1,2,3,4,5,6,7]遍歷了。主要樣式以下:
給除年月所在行除外到日期及星期單獨使用一個容器,該容器樣式
display: grid; grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr;複製代碼
grid具體參考如下網址:
css-tricks.com/snippets/cs…
- 每月數據獲取問題,那一號對應星期幾。
一開始想到的是是否是要分平年閏年什麼的,後來發現了new Date的妙用。大概實現以下:
getDayList() { // this.year爲面板顯示年份,this.month爲面板顯示月份。 // totalDays爲面板所在月份最後一天爲多少號 const totalDays = new Date(this.year, this.month, 0).getDate(); // min表示遍歷時需顯示上月多少天數據,最多7天。 // new Date其實就是爲了獲取改月第一天星期幾。如第一天星期五,則需補上週日到週四五天數據 const min = 1 - (new Date(this.year, this.month - 1, 1).getDay() || 7); // 面板總共顯示42天數據,出去顯示上月和本月的,剩餘爲下月數據 const max = min + 42; // this.dayList爲面板展現的數據 this.dayList = []; // 遍歷時獲取的obj爲某一天日期對象,截圖中min爲-4。總共補了上個月五天數據 for (let i = min; i < max; i++) { const obj = new Date(this.year, this.month - 1, i); // 記錄判斷是否爲當前月數據 const currMonth = i > 0 && i <= totalDays; // 記錄是否爲選中日期 const select = obj === this.timestamp; this.push('dayList', { date: obj.getDate(), currMonth, select, disabled: minTimestamp > obj.getTime() || maxTimestamp < obj.getTime() }) }複製代碼