這一篇要來實作第一個side project,那在開始實作前,先把資料夾建立好~
資料夾結構如上圖↑,第一個side project我們要來做Expanding_Cards,所以就建立一個名為Expanding_Cards的資料夾,裡面主要會有三個檔案( index.html、style.css、script.js),第二個side project也會是一樣的結構
1.挑5張你喜歡的照片,如果想找網路上免費的圖庫可以點此,自己比較常用的是unsplash、pixels
2.記得把style.css和script.js引入index.html中
根據這個小project,會用到的屬性和方法以及分別做了什麼
我們先來看看成品,用滑鼠點擊圖片時它就會被展開,而原本展開的圖片在點擊下一張圖後就會縮小
用一張截圖說明,可能會清楚一點,建立一個class為container的<div>
,裡面再建立5個class="card"的子<div>
和<h3>
,並以inline的方式加入background-image,不不寫在外部css檔的原因,是為了讓圖片(background-image)與結構(background-size、background-position....)分離,因為結構都一樣,所以可以共用屬性。並在其中一個的<div>
中多加入一個class="active",代表被展開的那張圖片
程式碼的部分
<div class="container">
<div class="card active" style="background-image: url('網址');">
//預設第一圖片會被展開,所以加入active在這
<h3></h3> //放入圖片的標題
</div>
<div class="card active" style="background-image: url('網址');">
<h3></h3>
</div>
<div class="card" style="background-image: url('網址');">
<h3></h3>
</div>
<div class="card" style="background-image: url('網址');">
<h3></h3>
</div>
<div class="card" style="background-image: url('網址');">
<h3></h3>
</div>
</div>
P.S通常設背景圖片,最好加上一個background-color以防圖片沒跑出來,有替代的選擇
* {
box-sizing: border-box;
}
body {
margin: 0;
padding: 0;
display: flex; /*讓內容在viewport的中間*/
justify-content: center;
align-items: center;
height: 100vh;
overflow: hidden;
}
以上都設定好了,你會看到如下圖的呈現,背景會水平垂直置中顯示在viewport的正中央,接下來要來調整的會是背景圖的位子、大小和卡片要橫向排版
/*裝卡片的容器*/
div.container {
display: flex; /*讓圖片變成水平排列*/
width: 90vw; /*會隨著視窗調整寬度*/
}
/*卡片主體*/
div.card {
background-position: center;
background-repeat: no-repeat;
background-size: cover;
height: 80vh;
border-radius: 50px;
cursor: pointer;
color: #ffffff;
font-weight: bold;
flex: 0.5; /*flex是<flex-grow> <flex-shrink> <flex-basis>的縮寫,只有一個值代表是flex-grow*/
margin: 10px;
position: relative; /*這樣設是因h3要依照絕對位子擺放*/
transition: flex 0.7s ease-in;
}
若沒給定flex-item高度,它會由content決定,這時候align-items預設為stretch(拉長;撐大),高度會撐開到跟flex- container一樣
/* 未被展開的圖片標題 */
div.card h3 {
font-size: 24px;
position: absolute;
bottom: 20px;
left: 20px;
margin: 0;
opacity: 0; /*透明度設為0讓它看不到*/
}
/* 展開的圖片 */
div.card.active {
flex: 5; /*flex是<flex-grow> <flex-shrink> <flex-basis>的縮寫,若只有一個值代表是flex-grow*/
}
/* 展開圖片的標題 */
div.card.active h3 {
opacity: 1;
transition: opacity 0.3s ease-in 0.5s; /*讓標題比圖片慢0.5秒進入*/
}
/* 小屏幕下只會有三張圖 */
@media screen and (max-width: 576px) {
.container {
width: 100vw; /*原本是90vw,為了在小屏幕下佔用更多空間所以設100vw*/
}
.card:nth-of-type(4),
.card:nth-of-type(5) {
display: none;
}
}
let cards = document.querySelectorAll(".card");
console.log(cards); //NodeList(5),五個區塊就五個節點
cards.forEach((card) => {
//箭頭函式中若只有一個參數,可以省略括號( )不寫
console.log(card); //每個子<div>
card.addEventListener("click", () => {
removeActiveClasses(); //把原本的active先移除
card.classList.add("active"); //再新增active到點擊的圖片上
});
});
function removeActiveClasses() {
cards.forEach((card) => {
card.classList.remove("active");
});
}
附上codepen連結 https://codepen.io/hangineer/pen/KKRprXo
你可以把卡片做成任何你想要的形式,不一定是要背景圖片配上標題,就像房子骨架鋪設好了,內部要做什麼裝潢可以自由決定^ ^ 那今天的練習就到這裡,明天見
https://www.udemy.com/course/50-projects-50-days/