# Web企業運算_Week3 # 練習清單 * 上課內容 : 上課內容皆以Codepn來Demo,以下附連結 * 未能完全理解的網頁排版部分 * 預習Flex排版 * 學習Git基礎指令,上傳網頁至Github * P.S 希望老師能到網頁版上觀看此份日誌,我希望能透過這堂課練習撰寫技術文章,故心得都以Hackmd模式撰寫 * 本文章連結 : https://hackmd.io/7J_5s2zKQ8Sa7V4HZypZtQ?both # 程式 ### **定位練習** HTML ``` <div id="parent"> <div id="child"></div> </div> ``` CSS ``` #parent { position: relative; width: 50px; height: 50px; background-color: black; } #child { position: absolute; width: 50px; height: 50px; background-color: red; /* 從上層元素開始,向左50px,向下25px */ left: 50px; top: 25px; } ``` Demo : https://codepen.io/jacky030hsu/pen/vYOzvrE ### CSS Transiton練習 - Leaf HTML ``` <div class="leaf"></div> ``` CSS ``` .leaf { /* 利用absolute + transform */ position: absolute; top:50%; left: 50%; transform: translate(-50%, -50%); width: 200px; height: 200px; background-color: mediumaquamarine; /* 左上 + 右下 右上 + 左下 */ border-radius : 1% 50%; /* 透明度 */ opacity: 0.9; transition: all 3s ease-in-out; } .leaf:hover { transform : rotate(180deg) scale(1.4); } ``` Demo : https://codepen.io/jacky030hsu/pen/qBdMLgz?editors=0110 ### 球滾動動畫練習 HTML ``` <!-- 基本位移 --> <div class="ball ball1">1</div> <!-- Keyframes 動畫設定 --> <div class="ball ball2">2</div> <!-- Transition + Transform --> <div class="ball ball3">3</div> ``` CSS ``` .ball { width: 50px; height: 50px; margin: 50px; border : solid 1px black; text-align: center; border-radius : 50%; transition : 1s; } .ball1 { background-color: red; } .ball1:hover { transform : translateX(200px) rotate(360deg); } .ball2 { background-color: blue; animation: ball2 4s infinite; } @keyframes ball2 { 0% { transform : translateX(0px); opacity: 1; } 50% { transform : translateX(500px); opacity: .5; } 100% { transform : translateX(0px); opacity: 1; } } .ball3 { background-color: #777; transition: all 1.5s ease-in } .ball3:hover { transform : translateX(250px) scale(1.4); } ``` Demo : https://codepen.io/jacky030hsu/pen/YzXOBpG ### **CSS 3D** HTML ``` <div class="container"> <div class="box">0</div> <div class="box1">1</div> <div class="box2">2</div> <div class="box3">3</div> <div class="box4">4</div> </div> ``` CSS ``` .container { position: relative; width: 200px; height: 200px; margin: 0 auto; margin-top: 150px; background-color:rgba(61, 59, 184, 0.8); text-align: center; font-size : 3em; /* 父元素設定第三人稱視角距離 */ perspective: 600px; } .box { position: absolute; text-align: center; width: 200px; height: 200px; /* 子元素設定以3D模式呈現 */ transform-style: preserve-3d; background-color:rgba(198, 198, 76, 0.7); /* Z軸先移動100px、以Y軸為軸心旋轉90度(此時軸向改變),最後再將Z軸移動100px */ transform : translateZ(100px) rotate3d(0,1,0,90deg) translateZ(100px); transition : 1s; } .box:hover { transform : translateZ(200px); } .box1 { position: absolute; text-align: center; width: 200px; height: 200px; transform-style: preserve-3d; background-color:rgba(198, 198, 76, 0.7); transform : translateZ(100px) rotate3d(0,1,0,90deg) translateZ(-100px); transition : 1s; } .box1:hover { transform : translateZ(200px); } .box2 { position: absolute; text-align: center; width: 200px; height: 200px; transform-style: preserve-3d; background-color: rgba(198, 0, 76, 0.7); transform : translateZ(100px) rotate3d(1,0,0,90deg) translateZ(-100px); } .box3 { position: absolute; text-align: center; width: 200px; height: 200px; transform-style: preserve-3d; background-color: rgba(0, 198, 76, 0.7); transform : translateZ(100px) rotate3d(1,0,0,90deg) translateZ(100px); } .box4 { position: absolute; text-align: center; width: 200px; height: 200px; transform-style: preserve-3d; background-color:rgba(255, 3, 0, .5); transform : translatZ(200px); } ``` Demo : https://codepen.io/jacky030hsu/pen/MWwqLrR?editors=0110 # 成果筆記 * **SVG** * 可縮放向量圖形 (Scalable Vector Graphics) 的縮寫。它是一種圖形格式,特色是不被限制於某種解析度。 * 參考網站 : https://intersection.tw/%E8%A8%AD%E8%A8%88%E5%B8%AB%E5%B0%8D-svg-%E6%87%89%E8%A9%B2%E6%9C%89%E7%9A%84%E8%A7%80%E5%BF%B5-38ba64b48b32 * **DOM 文件物件模型** * 全名為 Document Object Model 中文翻譯為 文件物件模型,看起來很抽象但其實就是**把一份 HTML 文件內的各個標籤,包括文字、圖片等等都定義成物件,而這些物件最終會形成一個樹狀結構**,下面有一張示意圖可以參考。 ![](https://i.imgur.com/AdgC2YO.gif) * **CSS Selector** * ID 使用方式 #Demo {width:75%}; * Class 使用方式 .demo {width:75%}; * ID與Class差異在於**ID選擇器在一個HTML文件中只能被使用一次,而Class選擇器在一個HTML文件中可以被使用多次**。第二個不同的地方ID選擇器可以被Javascript中的GetElementByID函數所運用,而Class選擇器無法被Javascript運用到。 * 貓頭鷹選取器(* + *),文件中所有的元素,只要緊接著其他元素,就會套用一個CSS樣式 * **CSS Position** 總共有五種定位方式 1. Static : 網頁預設值,元素間不會產生重疊 Static時,**設定top,bottom,left,right等等無效** 2. Relative : 相對於預設位置進行偏移 Ex.設定Relative後,設定Left : 50px 則元素向左推移50px 3. Absolute : **相對於父元素進行偏移,定位基點為父元素** 限制條件 : **父元素不能為Static定位,否則定位基點會為整個網頁的根元素HTML** 4. Fixed : **相對於瀏覽器(Browser)進行偏移**,位置不隨頁面滾動而變化 5. Sticky : 類似於Relative + Fixed的集合(不支援IE11) **元素滾動到頁面頂端時,定位轉成Fixed.滾回去會再變回Relative** * **Flex 佈局概念** * 設定 : { display:flex; } * **注意 : 設定為Flex後,Float、Clear、Vertical-align等方式失效** * 設定Flex的元素,稱做Flex Container.他的所有子元素自動成為Flex Item * Container存在水平主軸(Main Axis)與垂直交叉軸(Cross Axis),開始及結束位置分別稱做main start、cross end等等.. * **Item預設依主軸方式排列,每個Item佔據的主軸空間為main size,交叉軸空間為cross size** * **flex-direction : 決定主軸方向** * row : 預設。主軸為水平方向,起點在左端 * row-reverse : 水平方向排列,起點在右端 * column : 主軸為垂直方向,起點在上端 * column-reverse : 主軸為垂直方向,起點在下端 * **flex-wrap : 換行方式** * nowrap(不換行) * wrap(換行,第一行在上方) * wrap-reverse(換行,第一行在下方) * **justify-content : 定義Item在主軸上的對齊方式** * flex-start : 左對齊 * flex-end : 右對齊 * center : 置中 * space-between : 兩端對齊,Item間間格相等 * space-around : 每個Item兩側的間隔相等 * **align-items : 定義Item在交叉軸上的對齊方式** * flex-start : 交叉軸起點對齊 * flex-end : 交叉軸終點對齊 * center : 交叉軸中點對齊 * baseline : Item間的第一行文字對齊 * stretch : 預設,若未設置高度,將占滿整個容器 * **CSS Transition** * 用來調整 CSS animation 變動的速度。舉例來說,倘若你設計了一個 element 會由白轉紅,你可以透過 CSS transitions 來控制轉變的時間及變化曲線。 * transition-property : 哪些 CSS properties 會被轉變效果影響 * **transition-duration : 轉變效果發生的時間** * transition-timing-function : 設定轉變時依據的貝茲曲線,像是 : * ease, 等同於 cubic-bezier(0.25, 0.1, 0.25, 1.0) * linear, 等同於 cubic-bezier(0.0, 0.0, 1.0, 1.0) * **transition-delay : 多久以後開始發生轉變** * **CSS 3D** * 要做 CSS 3D 的效果時,可以先假想兩層的元素。外層是視角,是用**第三人稱**的方向在看著內層;內層就是物件的本身,可以有不同的 3D 屬性(旋轉、位移等等)。 * 外層會提供 perspective 的透視屬性,這是從第三人稱看物件的距離。內層的屬性則必須包含 transform-style: preserve-3d,讓物件本身以 3D 的模式呈現 # 心得 這週開始學習的是CSS排版與HTML的版面設計。另外也學習了一些關於3D Canvas的知識。Canvas3D部分是個人較不熟的環節,所以在這週我會加強這部分的練習,未來或許能將3D設計概念結合到自己的網頁上。排版部分則是針對自己使用沒有那麼熟練的定位以及FLEX概念去做複習,希望能讓自己的排版概念更加精確,並提升實作速度。 近期為了個人網頁與履歷,開始把以前所學慢慢透過練習找回熟悉感。僅僅只會排版是不夠的,我會在這堂課上努力學習程式邏輯方面的相關知識,往前端工程師更進一步。