點贊是動力 💪,關注是支持 👊!
建議、疑問、話題歡迎在評論區留言哦!
CSS是一個很獨特的語言。看起來非常簡單,但是某種特殊效果看似簡單,實現起來就頗有難度。這篇文章主要是給在學習前端的童鞋分享一些新的CSS技巧,一些在前端教程和培訓課堂中不會講到的知識。第二就是讓還在前端開發這條道路上的童鞋們,重新燃起對前端排版和特效的熱愛和熱情!🔥
文章目錄
1. 固定底部內容
這種是一個非常常見的佈局方式,但是對於新手來說是比較常見的難題。
這種佈局方式在後臺管理系統中比較常見,當我們內容不足瀏覽器窗口高度時,底部內容需要固定在底部。當內容超出了瀏覽器窗口高度,就會隨着內容往後推。
在有CSS3之前,實現這個效果是頗有難度的。瀏覽器窗口高度是會根據不同用戶打開瀏覽器的情況,屏幕大小的差異和瀏覽器的縮放比例而變。我們需要藉助JavaScript來實時獲取瀏覽器高度進行運算才能實現。雖然說標題是說“固定”底部,但是我們想要的效果不是position: fixed
。使用固定定位,在內容高於窗口高度時,就會擋住我們的內容。
隨着CSS3的來臨,最完美的實現方式是使用Flexbox
。實現的關鍵就是使用不太被關注的flex-grow
屬性,可以在我們的內容標籤元素(比如div
)中使用。在我們下面的例子裏使用了main
標籤。
我來講解一下實現原理吧。
flew-grow
是用來控制一個flex元素相對它同等級flex元素的自身可擴充的空間。如果我們使用flex-grow: 0
,那這個flex元素就完全不會擴展了。所以我們需要把頭部和底部之間的內容標籤元素設置爲flex-grow: 1
或者flex-grow: auto
,這樣內容部分就會自動填充滿頭部和底部之外的所有空間。
爲了避免底部內容受內容部分擴充空間的影響,我們給footer
底部元素flex-shrink: 0
屬性。flex-shrink
的作用與flex-grow
是恰恰相反,用來控制flex元素收縮的空間,這裏我們給了flex-shrink: 0
就是爲了底部footer
的大小不受影響。
我們直接上HTML和CSS代碼看看是怎麼實現的。
- HTML
<div id="document">
<nav>
<h1>頭部內容</h1>
</nav>
<main>
<p>可以添加更多內容看看底部的變化哦!</p>
</main>
<footer>
<h1>底部內容</h1>
</footer>
</div>
- CSS
#document {
height: 100vh;
display: flex;
flex-direction: column;
background: #202020;
font-family: microsoft yahei,wenquanyi micro hei,sans-serif !important;
}
nav, footer {
background: #494949;
display: flex;
justify-content: center;
}
main {
color: #bdbdbd;
flex: auto;
}
footer {
flex-shrink: 0;
}
* {
margin: 0;
}
h1,
p {
padding: 15px;
}
nav > h1 {
color: #82FCFD;
text-shadow: 1px 1px 4px #00000080;
}
footer > h1 {
color: #82FCFD;
text-shadow: 1px 1px 4px #00000080;
}
🌟知識點總結:
- flex-grow — 是用來控制一個flex元素相對它同等級flex元素的自身可擴充的空間
- flex-shrink — 作用與
flex-grow
是恰恰相反,用來控制flex元素收縮的空間
2. 懸停放大圖片特效
懸停放大圖片是一個特別吸引眼球的特效,比較常用於可點擊的圖片。當用戶懸停鼠標在圖片上,圖片會稍微的放大。
其實實現這個特效是非常簡單的。首先我們需要一個div
包裹這img
標籤,這個包裹層是用來遮擋住圖片,當圖片放大時不會出現圖片超出我們規定的寬高以外。
首先我們來講講div
包裹的屬性,我們需要給它一個固定的width
寬和height
高。然後我們必須給予這個元素overflow: hidden
屬性。讓圖片放大的時候不會超出這個div
元素的寬高。有了這個包裹層,我們就可以編寫img
的各種效果了。
我的例子裏面用了transform: scale(1,1)
作爲懸停時的圖片特效,這個transform
是用於改變任何元素的屬性的,然後scale
是用於放大(整數就會放大)或者縮小(負數就會縮小)元素的。
上代碼讓大家看看:
- html body中放入
<div class="img-wrapper">
<img src="https://img-blog.csdnimg.cn/2020032122230564.png"/>
</div>
- CSS
.img-wrapper {
width: 400px;
height: 400px;
overflow: hidden;
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.6);
}
.img-wrapper img {
height: 400px;
-webkit-transition: 0.3s linear;
transition: 0.3s linear;
}
.img-wrapper img:hover {
transform: scale(1.1);
}
.img-wrapper {
display: inline-block;
box-sizing: border-box;
border: 3px solid #000;
}
如果你們想讓圖片更加炫酷可以加上圖片過濾屬性filter
,讓圖片變灰或者變深褐色,然後懸停時候出現更加炫酷的顏色變幻。灰化的屬性是filter: grayscale(100%);
,然後深褐色化的屬性是filter: sepia(100%)
。其實圖片還有很多過濾屬性的,大家有興趣也可以去嘗試一下哦!
加入特殊效果的代碼如下:
- HTML
<!-- 灰度過濾 -->
<div class="img-wrapper">
<img
class="grayscale-img"
src="https://img-blog.csdnimg.cn/2020032211021728.png"
/>
</div>
<!-- 深褐色過濾 -->
<div class="img-wrapper">
<img
class="sepia-img"
src="https://img-blog.csdnimg.cn/2020032122230564.png"
/>
</div>
- CSS
/* ==============
* 灰度過濾
* ==============*/
.grayscale-img {
-webkit-filter: grayscale(100%);
filter: grayscale(100%);
}
.grayscale-img:hover {
-webkit-filter: grayscale(0);
filter: grayscale(0);
}
/* ==============
* 深褐色過濾
* ==============*/
.sepia-img {
-webkit-filter: sepia(100%);
filter: sepia(100%);
}
.sepia-img:hover {
-webkit-filter: sepia(0);
filter: sepia(0);
}
🌟知識總結
- transform — 用於改變元素
- scale — 對元素進行放大和縮小
- filter — 圖片過濾器
- grayscale — 灰度過濾
- sepia — 深褐色過濾
3. 瞬間黑暗模式
最近微信也逃脫不了黑暗時代的到來,網頁也很多都做了黑暗模式的兼容和主題。如果我們在做的一個網站想瞬間實現黑暗模式可以怎麼實現呢?
其實有一個很快的方式,我們可以使用invert
和hue-rotate
兩個CSS3過濾器來實現。
filter: invert()
— 是從0
到1
的刻度,1
是從白變黑。
filter: hue-rotate()
— 用於改變你元素的顏色,同時或多或少保持原本相同的色系。這個屬性的值可以從0deg
到360deg
。
在我們頁面的body
標籤上添加這兩個屬性,我們就可以快速嘗試把我們的網站變成"黑暗模式"。這裏需要注意的是,如果body
和html
上沒有設置background
背景顏色,這個過濾就會不起效了哦。
CSS的代碼如下:
html {
background: #fff;
}
body {
background: #fff;
filter: invert(1) hue-rotate(270deg);
}
實現效果
這裏我們會發現圖片的顏色會受影響,並不是很美觀,使用css過濾器是無法完美切換黑暗模式的。不過使用JavaScript輔助就可以完美的切換黑暗模式。
最近出了一個JavaScript輔助插件叫Darkmode.js
。
🌓 Darkmode.js
其實Darkmode.js
運用的也是css裏面的一個特性叫mix-blend-mode
— “CSS 屬性描述了元素的內容應該與元素的直系父元素的內容和元素的背景如何混合“。加上Javascript的輔助判斷哪些頁面上的元素需要黑化的,哪些是不需要黑化的。就會想我們之前那種做法,導致其他不需要黑化的元素,比如圖片,受到影響導致顏色出現問題。
使用Darkmode.js
非常簡單,只要在腳本里面添加以下代碼就可以馬上加入一個插件,
<script src="https://cdn.jsdelivr.net/npm/[email protected]/lib/darkmode-js.min.js"></script>
<script>
// 這些是這個插件的可配置項:
var options = {
bottom: "32px", // 定位底部距離 - 默認: '32px'
right: "32px", // 定位右邊距離 - 默認: '32px'
left: "unset", // 定位左邊距離 - 默認: 'unset'
time: "0.5s", // 默認動畫時間: '0.3s'
mixColor: "#fff", // 需要改變的顏色 - 默認: '#fff'
backgroundColor: "#fff", // 背景顏色 - 默認: '#fff'
buttonColorDark: "#262728", // 黑暗模式下按鈕顏色 - 默認: '#100f2c'
buttonColorLight: "#fff", // 日間模式下按鈕顏色 - 默認: '#fff'
saveInCookies: true, // 是否在cookie保存當前模式 - 默認: true,
label: "🌓", // 切換模式按鈕圖標 - 默認: ''
autoMatchOsTheme: true // 是否自動根據系統適應模式 - 默認: true
};
let darkmode = new Darkmode(options);
darkmode.showWidget();
</script>
如果你不希望用這個插件的默認按鈕,你可以在你的JavaScript代碼中自主控制。我們可以通過.toggle()
方法來切換模式,同時可以使用.isActivated()
來檢測是否已經進入黑暗模式。
const darkmode = new Darkmode();
darkmode.toggle();
console.log(darkmode.isActivated()) // 如果已經進入黑暗模式會返回 true
🌟知識總結
- filter: invert() — 可以把頁面從白變黑,也可以從黑變白。
- filter: hue-rotate() — 用於改變你元素的顏色,同時或多或少保持原本相同的色系。
- Darkmode.js — 瞬間實現黑暗模式。
Invert方式黑暗模式:預覽實際效果 | GitHub源碼 | 喜歡的童鞋 🌟star 一下謝謝
Darkmode.js黑暗模式:預覽實際效果 | GitHub源碼 | 喜歡的童鞋 🌟star 一下謝謝
4. 自定義列表符號
ul
,li
的無序列表有默認的符號·
,但是在很多情況下我們希望可以給這個符號加入自己的樣式和顏色,甚至是換成自定義的符號。默認的符號我們是無法做任何的樣式處理,而且默認的符號在CSS屬性裏面只有幾個選擇可以使用,很多情況下都是無法滿足我們的設計。
其實自定義無序列表符號不難,我們只需要使用僞元素::before
加content
屬性就可以實現。
在我這個例子裏面我做了兩個任務列表,一個是待處理任務,一個是已完成任務,各自給了不一樣的列表符號和顏色。
實現原理
一、首先我們禁用了ul
的默認符號樣式list-style: none
二、在li
的:before
僞元素上給予content
內容值,待處理任務使用🗹
,已完成任務li.completed:before
使用✔
三、爲了展示效果更加好看我分別給了li
和li .completed
兩個不同的顏色
上代碼看看是怎麼實現的吧:
HTML
<div>
<h2>待處理</h2>
<ul>
<li>待辦任務1</li>
<li>待辦任務2</li>
<li>待辦任務3</li>
<li>待辦任務4</li>
<li>待辦任務5</li>
</ul>
</div>
<div>
<h2>已完成</h2>
<ul>
<li class="completed">完成任務1</li>
<li class="completed">完成任務2</li>
<li class="completed">完成任務3</li>
</ul>
</div>
CSS
ul {
list-style: none;
color: #fff;
font-size: 20px;
border: 3px solid #000;
padding: 1rem 2rem;
min-height: 200px;
margin: 15px 2rem 0 0;
background: #323232;
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.6);
border-radius: 8px;
}
li {
padding: 0.3rem 0;
}
li::before {
content: "🗹 ";
color: aqua;
}
li.completed::before {
content: "✔ ";
text-decoration: none;
color: greenyellow;
}
li.completed {
text-decoration: line-through;
color: #bdbdbd;
}
::before
和::after
僞元素加content
屬性可以用來做很多特殊的效果,也是當代前端排版比較常用的“魔法”。說到僞元素的使用,我再給大家說一個比較常用的使用場景。
在管理後臺或者是文章展示中,我們經常可以見到的“麪包屑導航”也是用僞元素來插入每個目錄中間的符號的。
實現邏輯
一、這個導航含有3個a
標籤,首先給每個a
標籤加入一個僞元素::after
,然後在content
屬性插入/
符號。
二、然後使用a:first-child
,這個僞類會選擇到第一個a
標籤,然後使用content
屬性加入»
符號。
三、因爲我們第一步在每個a
標籤的後面插入了/
符號, 所以我們需要在最後一個a
標籤清除掉。這裏我們使用:last-child
選擇到最後一個a
標籤,然後用content: " "
屬性把僞元素的內容清楚掉。
HTML
<div class="breadcrumb">
<a>三鑽</a>
<a>前端</a>
<a>教程</a>
</div>
CSS
.breadcrumb {
font-size: 1.6rem;
color: #fff;
}
.breadcrumb a:first-child {
color: #82fcfd;
}
.breadcrumb a:first-child::before {
content: " » ";
}
.breadcrumb a::after {
content: " /";
color: #ef6eae;
}
.breadcrumb a:last-child::after {
content: "";
}
🌟知識總結
- ::before | ::after — 僞元素用於向某些選擇器添加特殊的效果。
- content — CSS 屬性用於在元素的 ::before 和 ::after 僞元素中插入內容。使用content 屬性插入的內容都是匿名的可替換元素。
- :first-child — CSS僞類表示在一組兄弟元素中的第一個元素。
- :last-child — CSS僞類代表父元素的最後一個子元素。
自定義無序列表:預覽實際效果 | GitHub源碼 | 喜歡的童鞋 🌟star 一下謝謝
麪包屑導航:預覽實際效果 | GitHub源碼 | 喜歡的童鞋 🌟star 一下謝謝
5. 圖片視差效果
這個超級炫酷的效果在官網中非常的受歡迎,這種效果可以給用戶帶來視覺衝擊,也給我們的網站帶來了活力。普通的網頁圖片會跟隨着網頁一起滑動,但是視覺差效果圖就會固定在底部,只有圖片所在的窗口上的元素會移動。
僅使用CSS
對你沒有看錯,這個效果只需要用到CSS就能輕易的實現!我們只要使用一個CSS背景圖的屬性background-attachment: fixed
,這個特性會把背景相對於視口固定。即使一個元素擁有滾動機制,背景也不會隨着元素的內容滾動。
實現理論:
一、在含有圖片的元素中加入background: url()
和background-size: cover
(第二個屬性適用於定義圖片爲封面,可以讓圖片大小自動適應,在很大的屏幕也會顯示完整的圖片)
二、然後附加固定背景圖的屬性background-attachment: fixed
三、最後給這個元素加入一個高度height: 100%
或者任意的高度height: 400px
就那麼簡單哦!不用懷疑,馬上上代碼,大家都可以自己去試試哦!
HTML
<div class="wrapper">
<div class="parallax-img"></img>
<p>這裏填寫一堆文字就可以了,儘量多一點哦</p>
</div>
CSS
.wrapper {
height: 100wh;
}
.parallax-img {
background-attachment: fixed;
background-position: center;
background-repeat: no-repeat;
background-size: cover;
height: 100%;
background-image: url("http://ppe.oss-cn-shenzhen.aliyuncs.com/collections/182/7/thumb.jpg");
}
p {
font-size: 20px;
padding: 1.5rem 3rem;
min-height: 1000px; // 當你的文字內容不夠,也能撐出足夠的高度來看到效果,當然如果你文字足夠多,就不需要了
}
如果想做到我動圖裏面一樣的效果,或者想看是怎麼實現的,可以查看下面總結裏面的“預覽實際效果”或者看“GitHub源碼”。
🌟知識總結
- background-attachment: fixed — 把背景相對於視口固定。即使一個元素擁有滾動機制,背景也不會隨着元素的內容滾動。
- background-size: cover — 可以讓圖片大小自動適應,在很大的屏幕也會顯示完整的圖片。
使用CSS + JavaScript
有些童鞋可能沒有被這個震撼到或者還是覺得不夠刺激。那我們再來一個高級例子,上面的例子在滑動的時候圖片是固定死的。如果我們加上JavaScript的助力,我們可以讓窗口的圖片緩慢的跟隨這個頁面滑動,使得效果更有動力和更有衝擊感。
實現理論
首先講一下排版,因爲我們需要在我們滑動頁面的時候使用JavaScript偏移圖片,所以我們需要給圖片一個CSS屬性讓我們可以讓圖片可以根據一個速度來往上或者往下移動。這個例子裏面我們讓所有圖片包裹在一個div
裏面,class
名爲block
。這個div
給予相對定位屬性position: relative
,這個時候我們就可以在裏面加入圖片,然後讓圖片絕對定位position: absolute
在這個div
盒子裏面。
但是圖片是可能很大的,我們需要把圖片不超出我們定義個盒子,所以我們的div
同時也給予了overflow: hidden
和一個高度height: 100%
。這樣圖片超出div
盒子就會被隱藏。
佈局代碼如下:
<div class="block">
<img
src="https://unsplash.it/1920/1920/?image=1005"
data-speed="-1"
class="img-parallax"
/>
<h2>視差速度 -1</h2>
</div>
<div class="block">
<img
src="https://unsplash.it/1920/1920/?image=1067"
data-speed="1"
class="img-parallax"
/>
<h2>視差速度 1</h2>
</div>
html, body{
margin: 0;
padding: 0;
height: 100%;
width: 100%;
font-family: 'Amatic SC', cursive;
}
.block{
width: 100%;
height: 100%;
position: relative;
overflow: hidden;
font-size: 16px;
}
.block h2{
position: relative;
display: block;
text-align: center;
margin: 0;
top: 50%;
transform: translateY(-50%);
font-size: 10vw;
color: white;
font-weight: 400;
}
.img-parallax {
width: 100vmax;
z-index: -1;
position: absolute;
top: 0;
left: 50%;
transform: translate(-50%,0);
pointer-events: none
}
實現這個佈局,在你滑動的時候,圖片是不會移動的。因爲最後一步就是加入JavaScript的輔助,讓圖片活起來。
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<script>
// 循環獲取每一個圖片元素
$(".img-parallax").each(function () {
var img = $(this);
var imgParent = $(this).parent();
function parallaxImg() {
var speed = img.data("speed"); // 獲取每張圖片設置了的偏移速度
var imgY = imgParent.offset().top; // 獲取圖片盒子所在的Y位置
var winY = $(this).scrollTop(); // 獲取當前滑動到的位置
var winH = $(this).height(); // 獲取瀏覽器窗口高度
var parentH = imgParent.innerHeight(); // 獲取圖片盒子的內高度
// 瀏覽器窗口底部的所在位置
var winBottom = winY + winH;
// 當前圖片是否進入瀏覽器窗口
if (winBottom > imgY && winY < imgY + parentH) {
// 運算圖片需要開始移動的位置
var imgBottom = (winBottom - imgY) * speed;
// 運算出圖片需要停止移動的位置
var imgTop = winH + parentH;
// 獲取從開始移動到結束移動的%(根據開始與結束像素 + 移動速度)
var imgPercent = (imgBottom / imgTop) * 100 + (50 - speed * 50);
}
img.css({
top: imgPercent + "%",
transform: "translate(-50%, -" + imgPercent + "%)",
});
}
$(document).on({
scroll: function () {
parallaxImg();
},
ready: function () {
parallaxImg();
},
});
});
</script>
🌟知識總結
- position: relative — 相對定位。
- position: absolute — 絕對定位。
- overflow: hidden — 如果需要,內容將被剪裁以適合填充框。 不提供滾動條。
6. 裁剪圖像的動畫
在有CSS3之前裁剪圖片實現也是頗有難度的。現在我們有了兩個非常方便簡單的CSS3屬性可以實現裁剪,那就是object-fit
和object-position
, 這兩個屬性可以讓我們改變圖片的大小,但是不影響圖片的長寬比。
當然我們可以使用圖片處理工具或者使用JavaScript等插件來實現圖片裁剪功能。但是因爲有了CSS3的屬性,我們不只可以裁剪,我們還可以用裁剪的屬性來做圖片的動態效果。
爲了讓我們的例子更加簡單,我們這裏使用了<input type="checkbox">
複選框元素,這樣我們就可以使用:checked
的僞類來觸發啓動效果。所以在例子裏面我們完全不需要JavaScript的協助。
實現原理:
一、首先給予圖片一個寬高height: 1080px
,width: 1920px
。
二、然後用CSS選擇器,鎖定當input
被選中後img
標籤的樣式變化。當被選中時,給圖片設定一個新的寬高,這裏我們給寬高各自500像素:width: 500px
,height: 500px
。
三、然後我們加上了過渡效果和時間讓圖片改變寬高時有動畫過渡效果:transition: width 2s, height 4s;
。
四、最後加上object-fit: cover
和object-position: left-top
這兩個屬性來保持圖片的寬高比例,這樣就大功告成了!
我們來看看完成的代碼:
勾選裁剪圖片 <input type="checkbox" />
<br />
<img
src="https://img-blog.csdnimg.cn/2020032122230564.png"
alt="Random"
/>
input {
transform: scale(1.5); /* 只是用來放大複選框大小 */
margin: 10px 5px;
color: #fff;
}
img {
width: 1920px;
height: 1080px;
transition: 0s;
}
/* css選擇器鎖定複選框被選中時的狀態 */
input:checked + br + img {
width: 500px;
height: 500px;
object-fit: cover;
object-position: left-top;
transition: width 2s, height 4s;
}
🌟知識總結
- object-fit — CSS 屬性指定可替換元素的內容應該如何適應到其使用的高度和寬度確定的框。
- object-position — 用來切換被替換元素的內容對象在元素框內的對齊方式。
- transition — 過渡可以爲一個元素在不同狀態之間切換的時候定義不同的過渡效果。
7. 混合模式(Blend)
如果有使用過Photoshop的同學對blend
混合模式應該是非常熟悉了,我們都知道混合模式是非常強大,也是p圖時非常常用的一個功能。但是你們有沒有想象過可以在瀏覽器的CSS中直接使用呢?對我們不需要設計師給我們做圖,我們前端也可以實現混合模式了。
在CSS中我們不只可以對background
背景加入混合模式,我們可以對任何一個元素的自帶背景加入混合模式,讓你可以做出很多之前沒有想過的效果和排版。
往一個元素加入混合模式,我們只需要使用到一個CSS屬性mix-blend-mode
即可。
簡單實現原理:
首先我們只需要加一個h1標題標籤
<h1>混合模式:顏色減淡</h1>
然後我們給h1
標籤加入mix-blend-mode
中的顏色減弱模式color-dodge
,但是要注意的是我們需要給body
和html
加入背景顏色background: white
,要不你會發現這個效果會無效。因爲h1
我們沒有給顏色,會自動往上級繼承,並且混合模式是針對背景顏色的過濾,所以body和html需要有背景顏色才行。
h1 {
mix-blend-mode: color-dodge;
font-family: yahei;
font-size: 5rem;
text-align: center;
margin: 0;
padding: 20vh 200px;
color: #D1956C;
}
html,
body {
margin: 0;
background-color: white;
}
body {
background-image: url(https://images.unsplash.com/photo-1505567745926-ba89000d255a?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=3302&q=80);
background-repeat: no-repeat;
background-size: cover;
min-height: 100vh;
overflow: hidden;
}
換換背景圖和h1
標籤的字體顏色就可以弄出各種不同的特效了。
🌟知識總結
- mix-blend-mode — CSS 屬性描述了元素的內容應該與元素的直系父元素的內容和元素的背景如何混合。
8. 瀑布流佈局
CSS Grid
和Flexbox
讓我們可以更簡便,更容易和更快的實現各式各樣的響應佈局,並且讓我們快捷方便的在佈局中實現橫向劇中和豎向劇中。但是回想一下以前是頗爲困難的。
雖然這些新出的佈局方式可以讓我們解決很多以前的佈局難題,但是像瀑布流佈局這種,就無法用它們簡單來實現了。因爲瀑布流一般來說都是寬度一致,但是高度是根據圖片自適應的。並且圖片的位置也是根據在上方圖片的位置而定的。
其實最好實現瀑布流佈局的辦法就是用CSS的列屬性套件,這套屬性大多數都是用於排版雜誌中的文本列。但是用於佈局瀑布流也是特別實用哦。因爲以前需要實現瀑布流,就必須有JavaScript的輔助來計算圖片高度然後決定每張圖片的定位和位置,所以現在有了列屬性就可以使用純CSS實現了。
實現原理:
實現這個佈局,首選我們需要把所有的內容先包裹在一個div
元素裏面,然後給這個元素column-width
和column-gap
屬性。
然後,爲了防止任何元素被分割到兩個列之間,將column-break-inside: avoid
添加到各個元素中。
神奇的效果就完美實現了,零JavaScript。
我們來看看代碼:
<div class="columns">
<figure>
<img src="https://source.unsplash.com/random?city" alt="" />
</figure>
<figure>
<img src="https://source.unsplash.com/random?night" alt="" />
</figure>
<figure>
<img src="https://source.unsplash.com/random?developer" alt="" />
</figure>
<figure>
<img src="https://source.unsplash.com/random?building" alt="" />
</figure>
<figure>
<img src="https://source.unsplash.com/random?water" alt="" />
</figure>
<figure>
<img src="https://source.unsplash.com/random?coding" alt="" />
</figure>
<figure>
<img src="https://source.unsplash.com/random?stars" alt="" />
</figure>
<figure>
<img src="https://source.unsplash.com/random?forest" alt="" />
</figure>
<figure>
<img src="https://source.unsplash.com/random?girls" alt="" />
</figure>
<figure>
<img src="https://source.unsplash.com/random?working" alt="" />
</figure>
</div>
.columns {
column-width: 320px;
column-gap: 15px;
width: 90%;
max-width: 1100px;
margin: 50px auto;
}
.columns figure {
display: inline-block;
box-shadow: 0 1px 2px rgba(34, 25, 25, 0.4);
column-break-inside: avoid;
border-radius: 8px;
}
.columns figure img {
width: 100%;
height: auto;
margin-bottom: 15px;
border-radius: 8px;
}
🌟知識總結
- column-width — CSS屬性建議一個最佳列寬。 列寬是在添加另一列之前列將成爲最大寬度。
- column-width — 該 CSS 屬性用來設置元素列之間的間隔 (gutter) 大小。
- column-break-inside — 設置或檢索對象內部是否斷。
總結
我希望這8個前端小技巧和特效對大家有幫助,或多或少有吸收一點新的前端知識。這篇文章提到的內容,其實很多都是值得深挖和學習的。有一些例子我做的比較簡單,但是其實是有無限的可能性。喜歡前端的童鞋們,讓我們繼續在前端領域中一起深挖,讓我們的熱愛無限的燃燒起來吧!
在最後我想給大家講一下我對前端的熱愛和態度。
回想前端這幾年,發展真的是突飛猛進,從前端排版,HTML5+CSS3做H5頁面,到前端組件化,各種UI框架滿天飛。
一開始我隨着熱潮用起了UI框架,起初覺得特別方便,來一個新的項目就直接上一個UI框架,研發速度也非常快。但是久而久之就覺得前端開發變成了處理數據,對接接口,實現交互。
某天在閱覽國外的一些前端設計和框架的時候,我突然發現國內多數的前端開發者都不再怎麼使用CSS3做出一些很好玩的佈局和特效了。現在市面上的系統和頁面都是千篇一律,普遍都是用一些知名的UI框架搭建系統和APP,基本自己動手去排版已經少之又少。前端已不再是以前的前端,缺少了靈魂。
但是我們回想一下,我們剛剛開始學習前端的時候,讓我們最有成就感,覺得前端特別有意思的那種感覺。就是那種讓我們覺得神乎奇蹟,不可思議的佈局,特效和交互。那種感覺自己成功實現了很優美,很炫酷的頁面和特效的感覺,讓我們越做越來勁,越做越是興奮。
但是在某些公司,研發部都是要求快速開發,UI設計部門也是受到時間的控制和限制,所以逐步走進了UI框架的限制之中。都是圍繞這一些UI框架來設計和開發系統和應用。
作爲一名熱愛前端的開發者,我還是堅持在絕大多數的項目中,自己排版和實現頁面交互特效。然後使用UI框架作爲輔助,主要是用來減輕一些小組件和常用組建的快速實現。(可以說我是比較追求完美和外貌協會的程序員 😂)
推薦閱讀
- 🔥《寫給想學和在學編程的你們,學習編程的7個好處》 — 其實選擇學編程是能改變人生的。可能起初很多人學編程,報了一個編程培訓班,爲了就是能拿到更高的工資或者有更好的工作環境。最後堅持着堅持着,最後會發現編程還會給我們帶來很多個人能力和技能上的提升。
- 🔥《如何高效學習編程》 — 編程確實不是一件容易的事情,除了要有較強的邏輯思維,還需要花大量的時間和集中力來提升或者維持一定的高度。
- 🔥《5大法則助你 成爲更出色的開發者》 — 這篇文章傳授5大法則助我們成爲更出色的開發者,在衆多開發者中脫穎而出的訣竅,也會在我們的技術職業生涯中給我們很多的幫助。
- 🔥《用“易於改編”原則,提升編程水平,寫出更好的代碼》 — 無論新手還是資深開發者都會經常問一個問題,“怎麼寫好的代碼?”,要知道怎麼寫好代碼,首先我們要知道怎麼樣纔是好的代碼。要有明確的目標,才能知道如何達成目標。在《程序員修煉之道》中提到的“ETC Principle” – 易於改編原則。這個原則看似簡單,但是我們越是深入思考越是覺得“簡約而不簡單”。