編寫第一個響應式頁面

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

本文為大家講解如何使用一種科學的方法實現網頁設計,從原理上搞清楚什么是響應式設計,并實現一個簡易的響應式設計框架,以此為基礎,編寫出第一個響應式頁面。

不知道現在大家還讀村上春樹嗎?在我剛上大學那會兒,一本《挪威的森林》在大伙兒中間傳來傳去,到最后書都散了架了。這是一種和以前完全不同的閱讀體驗,那淡淡的憂傷仿佛從書中彌漫出來,感染了已處于青春期尾巴上的我們。

然而,這和響應式頁面有什么關系呢?

村上春樹這位大叔很可愛,最近,他推出了一個網站,在上面回答讀者來信。對于讀者拋來的各種問題,他回答的一板一眼,頗有些黑色幽默。下面是該網站首頁的截圖:

圖 1. 村上春樹的答讀者問網站

村上春樹的答讀者問網站

很樸素的頁面對嗎?如果你這樣想,那又被“狡猾”的日本人騙了?在平板上、在手機上訪問這個網站試試!

或者試試調整瀏覽器窗口的大小,大家會看到,同樣的頁面,在不同設備、不同瀏覽器窗口大小的情況下,頁面的顯示方式發生變化了。這就是響應式頁面,頁面會根據不同設備顯示尺寸的大小,自動調整頁面布局和顯示內容,來適應設備,帶給讀者更好的用戶體驗。

所以說,村上春樹回答讀者來信的這個頁面看似樸素,實則設計精巧,充分契合了他的寫作風格和低調隨和的氣質。

無獨有偶,在作者準備寫作此篇文章時,美國白宮的主頁也改版為響應式設計,果殼新推出的在行也是響應式的……響應式頁面的春天仿佛要來了!歡迎大家上網搜尋一些響應式頁面,把地址貼在留言中。

準備

在我們動手實現自己的響應式頁面之前,先得掌握幾個重要的概念。

HTML 簡介

HTML 是 Web 的基本語言,它描述了文檔的結構。比如拿一張報紙,我們會看到上面有標題、引文、正文、腳注等等。HTML 也一樣,它用各種帶有語義的標簽,描述了網頁的結構。它的語法很簡單:

清單 1. HTML 標簽語法
<tag?attribute=”value”>content</tag>

網頁結構全部由 HTML 提供的標簽描述,您可參考 MDN 提供的HTML 參考手冊自行學習常用的標簽。下面給出了一段示例代碼,讀者可將其復制到文本編輯器中,保存為 HMTL 格式,然后使用瀏覽器打開,會對 HTML 有一個直觀的感受。

清單 2. 示例 HTML 代碼
<html>
<body>
<p>
云對雨,雪對風,晚照對晴空。來鴻對去燕,宿鳥對鳴蟲。三尺劍,六鈞弓,
嶺北對江東。人間清暑殿,天上廣寒宮。兩岸曉煙楊柳綠,一園春雨杏花紅。
兩鬢風霜,途次早行之客;一蓑煙雨,溪邊晚釣之翁。
</p>
<q>
從前,有一個程序員,他得到了一盞神燈?。燈神答應實現他一個愿望。
然后他向神燈許愿,?希望在有生之年能寫一個好項目。后來他得到了永生。
</q>
<a?href="http://www.ibm.com/developerworks/cn/">http://www.ibm.com/developerworks/cn/</a>
<blockquote>
浪漫的愛是病態的,因為你無法愛很多人,你累積愛的能力,然后將它泛濫出來。
每當你找到一個人,這個泛濫的愛就被投射出來,一個平凡的女人就變成一個天使,
一個平凡的男人就變成神圣的。但當那個洪水過去后,你再度變正常,你會覺得被騙了。
他只是一個平凡的男人,她只是一個平凡的女人。
</blockquote>
</body>
</html>

這里有兩個地方值得注意:

  1. 選擇標簽時,應使用語義相匹配的標簽。比如上面的很多標簽,也可以使用一個<div>標簽代替,但這就使相應部分失去了語義,是一種不好的實現方式。

  2. HTML 只描述文檔結構,不描述樣式!讀者如果用瀏覽器打開上述示例 HTML 代碼,可能會覺得有些疑惑,文中的三段話在樣式上看起來很明顯不一樣啊,這難道不是不同標簽帶來的效果嗎?不是,瀏覽器會為 HTML 標簽提供默認樣式,如果在瀏覽器中禁用所有樣式,就會發現它們看上去并無差別。以 Chrome 瀏覽器為例,可安裝 Web Developer 插件來禁用樣式。

CSS 簡介

CSS(Cascading Style Sheets),中文譯作級聯樣式表,用來定義文檔的樣式,比如字體、顏色、布局等。它的語法也非常簡單:

清單 3. CSS 語法
selector?{
property:?value;
…
}

您可自行參考CSS 手冊,熟悉其使用方法。

CSS 可以定義在 HTML 文檔頭部、元素里,也可以定義在一個單獨的 css 文件中。在實際開發中,為了達到內容和樣式的分離,一般都在單獨的文件中定義 CSS,這時,就需要在 HTML 文檔頭部引入 CSS:

清單 4. 引入 CSS 文件
<html>
<head>
<link?rel="stylesheet"?type="text/css"?href="style.css">
</head>
<body>
</body>
</html>

CSS 中所謂的級聯是指子元素會繼承父元素的樣式,所以在定義樣式時,應先從最上層的元素開始,先定義那些通用的樣式,然后再一層層下來,定義各子元素獨特的樣式。

一切皆盒子

圖 2. 盒子模型

盒子模型

您可以隨便在瀏覽器的開發者工具中審查頁面上的任意元素,都會發現其外觀符合上圖所示的一個盒子模型。以該圖為例:元素的尺寸為 200×200,內邊距為 30,邊框為 10,另外上下左右各有 20 和 59 的外邊距。在頁面上顯示時,一個元素的尺寸即包含自身大小,也包含內邊距和邊框,即圖中黑色實線圍起來的部分。前端開發人員在編寫 CSS 時,要不斷計算一個元素的實際顯示大小,實在有點繁瑣。

萬幸的是 box-sizing 屬性可以改變 CSS 的盒子模型,將該屬性指定為 border-box 后,元素顯示時的實際大小即為 CSS 中定義的 width 和 height,而元素的大小則在此基礎之上減去內邊距和邊框的大小,自動適應。以下圖為例,如果在 CSS 中加入如下代碼,則元素的大小會自動適應,變為 120×120。試試吧!

清單 5. box-sizing
*?{
-moz-box-sizing:?border-box;
-webkit-box-sizing:?border-box;
-ms-box-sizing:?border-box;
box-sizing:?border-box;}

后續內容都基于您了解了什么是盒子模型,并且使用上述 CSS 片段改變盒子模型的行為基礎之上,如果對于這個知識點還有疑問,請參考文末的參考資料自行學習掌握。


設計自己的響應式 CSS 框架

上面我們對 HTML 和 CSS 做了簡要的介紹,從本節開始,將把重點放在如何實現響應式設計上。為實現響應式頁面,必須具備兩種能力:首先需要靈活方便的布局方式;其次需要在恰當的時機對頁面布局進行調整。在重點討論這兩種方式之前,我們先花點時間研究一下網頁的設計原則。

一切皆網格

您打開一個網頁,目光會首先聚焦到頁面頂部,然后自頂向下,自左向右移動,這是最符合人類行為習慣的。網頁設計也遵循同樣的原則,將網頁自頂向下,自左向右分成不同的單元格。不信的話,您可以隨便打開一個網站,看看是否遵循這樣的原則。下圖是作者的豆瓣頁面,我用紅顏色的方框畫出了大致的單元格,當然,這只是一個粗略的劃分,單元格里面的內容還可以劃分得更精細。

事實上,一個前端開發者拿到一個設計時,就會對設計進行這樣的劃分,以此定義 HTML 結構,然后使用 CSS 對頁面進行布局,并且調整字體、顏色等,最終實現出符合設計師要求的頁面。

那些常用的 CSS 框架對頁面也是以網格劃分,一般將整個頁面劃分為 12 列,之所以選擇 12,是因為 12 是 2、3、4、6 的最小公倍數,這樣就很容易將整個頁面劃分為 2、3、4……列。

圖 3. 一切皆網格

一切皆網格

下面我們看看如何使用 HTML 和 CSS 實現這樣的網格系統。簡單來說,我們將頁面從橫向劃分為若干行,從縱向劃分為 12 列,每一列占整個行寬度的 1/12,這樣當頁面的大小變化時,每一列的寬度也會按比例放大或縮小。比如下面的 HTML 片段,把頁面分成了 4 行,前兩行分成兩列,后兩行分成三列,每列占用不同的頁面寬度。

清單 6. 網格-HTML
??<div?class="grid">
<div?class="row">
<div?class="col-2">2?Columns</div>
<div?class="col-10">10?Columns</div>
</div>
<div?class="row">
<div?class="col-3">3?Columns</div>
<div?class="col-9">9?Columns</div>
</div>
<div?class="row">
<div?class="col-4">4?Columns</div>
<div?class="col-4">4?Columns</div>
<div?class="col-4">4?Columns</div>
</div>
<div?class="row">
<div?class="col-3">3?Columns</div>
<div?class="col-6">6?Columns</div>
<div?class="col-3">3?Columns</div>
</div>
</div>

我們使用如下的 CSS 定義網格,為了調試方便,特意為元素加了 1 個像素的邊框。在 CSS 中,我們定義了行寬為 100%,且分別定義了 1 列、2 列……12 列的寬度。

清單 6. 網格-CSS
*?{
border:?1px?solid?red?!important;
}?.row?{
width:?100%;
}.col-1?{
width:?8.33%;
}.col-2?{
width:?16.66%;
}.col-3?{
width:?25%;
}.col-4?{
width:?33.33%;
}.col-5?{
width:?41.66%;
}.col-6?{
width:?50%;
}.col-7?{
width:?58.33%;
}.col-8?{
width:?66.66%;
}.col-9?{
width:?75%;
}.col-10?{
width:?83.33%;
}.col-11?{
width:?91.66%;
}.col-12?{
width:?100%;
}

用瀏覽器打開頁面,效果并不如我們期望的那樣,雖然每列的寬度符合我們的預期,但是它們并沒有排在同一行內,而是從上到下排列。這一點也不意外,這是瀏覽器對 HTML 元素默認的布局方式。幸運的是,我們只需要一個 CSS 元素,就可以將布局調整為我們期望的方式。

圖 4. 未完成的網格

未完成的網格

flex 布局

flex 布局非常強大,它可以將一個元素的所有子元素以一種彈性的方式布局,按照比例自動填充滿元素的寬度。我們只需在上述 CSS 的.row 類更改如下:

清單 7. flex 布局
.row?{
width:?100%;
display:?flex;
}

如同變戲法一般,我們想要的網格出來了!

圖 5. 完成后的網格

完成后的網格

flex 布局還有一個 flex-wrap: wrap 屬性,當父元素剩下的寬度容納不下更多子元素時,會自動將子元素放在下一行顯示,這在響應式設計中特別有用。

事實上,這個頁面現在已經是響應式頁面了,您可以調整瀏覽器大小,或者在平板、手機上訪問該頁面,它的內容會根據分辨率大小做出相應調整。

圖 6. 響應式的網格

響應式的網格

當然,通常的響應式頁面要做的工作更多,不光內容可以自動適應瀏覽器窗口的大小,布局也要做出相應的調整,甚至在手機或平板上,由于有限的分辨率,需要隱藏一些不重要的內容,以此帶給用戶更好的體驗。

Media Query

這一切都可以通過 media query 實現,media query 可以根據一些判斷條件,對頁面應用不同的 CSS。比如下面的 CSS 片段,會在瀏覽器窗口小于 500 像素時,隱藏第一行第二列,并將第三行的背景色改為黃色。

清單 8. Media query
@media?only?screen?and?(max-width:?500px)?{
.col-4?{
background-color:?yellow;
}.col-10?{
display:?none;
}
}
圖 7

圖 7

事實上,我們已經實現了一個響應式 CSS 框架,使用這一框架我們已經有能力實現一些簡單的響應式頁面。當然,在實際工作中我們一般不會這么做,我們通常選用已有的 CSS 框架,比如Bootstrap,這些框架的功能更加強大,我們只用編寫很少的代碼就能實現一個響應式頁面。之所以我們要自己設計一個響應式 CSS 框架,是為了理解背后的原理,這樣使用其他框架會變得更加容易,而且在框架不能滿足需求時,還可以定制自己的框架。


結束語

本文通過實例,為大家講解了什么是響應式頁面,并且介紹了實現響應式頁面所需要的基礎知識,最后實現了一個簡易的響應式 CSS 框架。希望本文能幫助大家開始自己的響應式頁面之旅。


轉載于:https://my.oschina.net/huangcongcong/blog/534711

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/286573.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/286573.shtml
英文地址,請注明出處:http://en.pswp.cn/news/286573.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

container 的背后

如果要看laravel的單個功能的源代碼&#xff0c;首先去找對應得ServiceProvider,例如加密功能hash,則按一下步驟查看源代碼&#xff1a; HashServiceProvider.php(主要是看register方法) singleton()方法就是將BcryptHasher這個類實例化一次&#xff0c;然后在哪里都可以用&…

android中像素單位dp、px、pt、sp的比較

dp(dip): device independent pixels(設備獨立像素). 不同設備有不同的顯示效果,這個和設備硬件有關&#xff0c;一般我們為了支持WVGA、HVGA和QVGA 推薦使用這個&#xff0c;不依賴像素。px: pixels(像素). 不同設備顯示效果相同&#xff0c;一般我們HVGA代表320x480像素&…

ArcGIS10.8完美實現MODIS NDVI數據格式轉換和投影變換

大家都熟知,MODIS NDVI數據的處理一般是在MRT中進行的,但熟不知ArcGIS中也可以實現投影變換個數據格式的轉換,本文就以MOD13Q1.A2020001.h26v05.006.2020018002618.hdf這一景影像為例,實現將正弦曲線投影轉換為Albers等積投影,將hdf格式轉為tif。 ArcGIS python批處理代碼…

開源項目千千萬,如何發現好項目

視頻來自 OSSInsight 推特。不知道大家聽說沒有 PingCAP 推出的一個 OSSInsight.io 網站&#xff0c;可以根據 GitHub 上的事件&#xff0c;提供開源軟件洞察&#xff0c;這個項目也開源在 GitHub[1] 上。它可以提供以下方面的洞察能力&#xff0c;有點類似于 Google Analytics…

Git之回退已經提交到遠程倉庫的代碼(已經push的代碼)

1 問題 git 把當前的修改已經push到遠程倉庫&#xff0c;現在需要回退這個遠程提交 2 解決辦法 1&#xff09;、我們用git log命令找到commit Id d6434e39e842a40b79119b2b88e76dd1498f8654是我最后一次提交&#xff0c; 然后我們現在需要回退到145c4fc7f237176acba1bca515e9…

構建微型數據中心——在laptop上運行Rancher

對于開發人員而言&#xff0c;他們的最終目標是擁有自己的數據中心&#xff08;data center&#xff09;&#xff0c;使他們能夠在貼近真實情況的副本上測試他們的服務。然而&#xff0c;開發人員的開發過程中卻充滿了妥協。因為&#xff0c;數據要么是個簡化集&#xff0c;要么…

【前端就業課 第一階段】HTML5 零基礎到實戰(五)基礎元素

注意&#xff1a;手機&#xff08;APP&#xff09;打開&#xff0c;內容顯示更佳&#xff0c;不會的私聊博主即可&#xff08;知識點結構參考《HTML5入門到精通》&#xff09; 想要拿代碼或加入學習計劃&#xff08;** 博主會監督你并且教你寫文章 **&#xff09;的拉到最下面&…

phpUnit 安裝,實例和簡單部署

背景&#xff1a;一個小腳本&#xff0c;保證穩定為主&#xff1b;所以試用了下phpunit&#xff0c;快捷方便phpunit 的安裝 phpunit是一個輕量級的php單元測試框架&#xff0c;通過pear安裝安裝過程 wget https://phar.phpunit.de/phpunit.phar chmod x phpunit.phar sudo mv …

1、RN跨平臺開發——環境搭建

了解React NativeReact Native使你能夠在Javascript和React的基礎上獲得完全一致的開發體驗&#xff0c;構建世界一流的原生APP。React Native著力于提高多平臺開發的開發效率 —— 僅需學習一次&#xff0c;編寫任何平臺。(Learn once, write anywhere)。Facebook已經在多項產…

Android之替換App桌面圖標

1、需求 需要動態替換app在桌面的圖標 2、解決辦法 1)、在AndroidManifest.xml里面進行配置多個啟動的alias別名 啟動的activity <activityandroid:name=".ui.SplashActivity"android:launchMode="singleTop"android:screenOrientation="port…

【ArcGIS遇上Python】ArcGIS10.8 Python代碼批量完美實現MODIS NDVI數據格式轉換和投影變換

由于論文的需要,將MODIS NDVI數據進行投影變換和格式轉換,具體操作可以參照:《ArcGIS10.8完美實現MODIS NDVI數據格式轉換和投影變換》,但是該文章中的做法只能一次性實現一景影像的轉換,沒法批量,雖然ArcGIS中提供了Batch的方法但是需要挨個添加數據,確定輸出路徑等等,…

引入 DTM 以支持 ABP 的多租戶多數據庫場景

這篇文章分享了使用 DTM 二階段消息模式解決 issue #10036 的方法。今天我們要使用 EasyAbp 的 Abp.EventBus.Boxes.Dtm 模塊。DTM 事件箱的介紹這個模塊使用了 DTM 的 二階段消息 使得 ABP 的事件箱得以支持 多租戶多數據庫場景。你需要先閱讀 DTM 文檔&#xff0c;它將幫助你…

【前端就業課 第一階段】HTML5 零基礎到實戰(六)表格詳解

注意&#xff1a;手機&#xff08;APP&#xff09;打開&#xff0c;內容顯示更佳&#xff0c;不會的私聊博主即可 想要拿代碼或加入學習計劃&#xff08;** 博主會監督你并且教你寫文章 **&#xff09;的拉到最下面&#xff08;PC端Web打開&#xff09;加博主即可&#xff0c;目…

PHP中file_put_contents()函數的兼容性問題

PHP中file_put_contents()函數的兼容性問題 file_put_contents()函數就相當于依次使用fopen()&#xff0c;fwrite()和fclose()&#xff0c;真是個令人愉快的函數。我的第一個PHP小腳本中用到了這個函數&#xff0c;本地運行很正常&#xff0c;放到服務器上去之后點擊submit按鈕…

Android實戰:手把手實現“捧腹網”APP(一)-----捧腹網網頁分析、數據獲取

“捧腹網”頁面結構分析捧腹網M站地址: http://m.pengfu.com/捧腹網M站部分截圖&#xff1a; 從截圖中&#xff08;可以直接去網站看下&#xff09;&#xff0c;我們可以看出&#xff0c;該網站相對簡單&#xff0c;一共分為四個模塊&#xff1a;最新笑話、捧腹段子、趣圖、神…

專題2-通過按鍵玩中斷\第1課-中斷處理流程深度剖析-lesson1

中斷概念 1、中斷生命周期 串口先產生一個事件&#xff0c;該事件傳送到中斷控制器里面&#xff0c;中斷控制器會進行相應過濾&#xff0c;能通過過濾&#xff0c;那么就交給CPU去處理。 2、中斷源 2440芯片手冊 6410芯片手冊 3、中斷過濾 4、中斷處理 cpu處理方式有兩種&#…

Android之okdownload下載提示奔潰Expected URL scheme ‘http‘ or ‘https‘ but was ‘data‘

1 問題 客戶現場奔潰在firebase上面提示錯誤信息如下 Fatal Exception: java.lang.IllegalArgumentException: Expected URL scheme http or https but was dataat okhttp3.t$a.a(HttpUrl.kt:38)at okhttp3.t$b.b(HttpUrl.kt:8)at okhttp3.y$a.b(Request.kt:5)at com.liulish…

mysql語法學習(一)__Instances__表

2019獨角獸企業重金招聘Python工程師標準>>> ---建表 CREATE TABLE temp( id INT ); ----查詢表 SELECT * FROM temp_t; ---刪表 DROP TABLE temp; ---修改表名 ALTER TABLE temp_tt RENAME temp; ALTER TABLE temp RENAME TO temp_t; ALTER TABLE temp RENAME AS t…

【ArcGIS遇上Python】python批量獲取柵格數據四至(top,bottom,left,right)坐標代碼

上圖所示為ArcGIS自帶的影像數據,存放路徑為C:\Program Files (x86)\ArcGIS\Desktop10.6\ArcGlobeData\wsiearth.tif",在源中可以查看該數據的四至坐標,那么,怎樣用python批量獲取多個柵格數據的四至坐標呢? 參考閱讀:【ArcGIS風暴】ArcGIS求一個矢量圖層中多個圖斑…

使用 C# 讀取 zip 壓縮包解壓文件的方法及注意事項

從 .NET Framework 4.5 版本開始&#xff0c;微軟為 .NET 類庫增加了一個名為 ZipFile 的類型。該類型在 System.IO.Compression 命名空間下&#xff0c;提供創建、解壓縮和打開 zip 存檔的靜態方法。若要在 .NET Framework 應用中使用 ZipFile 類&#xff0c;必須添加對程序集…