Programming Abstractions In C》學習第47天,p111-p113,總結如下:
/*
* File: random.h
* Version: 1.0
* Last modified on Fri Jul 22 16:44:36 1994 by eroberts
* -----------------------------------------------------
* This interface provides several functions for generating
* pseudo-random numbers.
*/
#ifndef _random_h
#define _random_h
#include "genlib.h"
#include <stdlib.h>
/*
* Constant: RAND_MAX
* ------------------
* Unfortunately, several libraries that supposedly conform to
* the ANSI standard do not define RAND_MAX in <stdlib.h>. To
* reduce portability problems, this interface defines RAND_MAX
* to be the largest positive integer if it is undefined.
*/
#ifndef RAND_MAX
# define RAND_MAX ((int) ((unsigned) ~0 >> 1))
#endif
/*
* Function: Randomize
* Usage: Randomize();
* -------------------
* This function sets the random seed so that the random sequence
* is unpredictable. During the debugging phase, it is best not
* to call this function, so that program behavior is repeatable.
*/
void Randomize(void);
/*
* Function: RandomInteger
* Usage: n=RandomInteger(low, high);
* ------------------------------------
* This function returns a random integer in the range low to high,
* inclusive.
*/
int RandomInteger(int low, int high);
/*
* Function: RandomReal
* Usage: d=RandomReal(low, high);
* ---------------------------------
* This function returns a random real number in the half-open
* interval [low .. high), meaning that the result is always
* greater than or equal to low but strictly less than high.
*/
double RandomReal(double low, double high);
/*
* Function: RandomChance
* Usage: if (RandomChance(p)) . . .
* ---------------------------------
* The RandomChance function returns TRUE with the probability
* indicated by p, which should be a floating-point number between
* 0 (meaning never) and 1 (meaning always). For example, calling
* RandomChance(.30) returns TRUE 30 percent of the time.
*/
bool RandomChance(double p);
#endif
p113,These three lines are often referred to as interface boilerplate。boilerplate這個詞會在計算機相關的教材中會經常看到,英文的意思是:“text that can be copied and used in computer program,with only small changes.”(模板),之所以叫模板,是因為在每個頭文件中都有這三句。這個單詞不難理解,關鍵是通過此次的教材對這個單詞有一個具體的、形象的記錄,當提到這個單詞,就知道具體指的是什么。
答:die: n.a small cube with a different number of spots on each side.(骰子),所以roll a die的就是"擲骰子"。
答:along with在表示伴隨、以及或連同等意思時,兩者之間無先后順序,可能在前也可能在后。這點與follow不同。示例:For each of these functions, the interface contains
one-line prototype along with a comment that describe the purpose of the function from
the perspective of clients.
答:原文:The line:
#ifndef _random_h
cause the compiler to skip any text up to the #endif line if the the symbol _random_h has been previously defined。
up to短語主要有兩種用法:
(1)adv. used to say that sth is less than or equal to but not more than a stated value。
(2)adv. until。
都表示的是“程度”,而不是“方向”。
1) Eric S.Roberts,《Programming Abstractions in C》:https://book.douban.com/subject/2003414
1) Etymology Dictionary:https://www.etymonline.com
2) Cambridage Dictionary:https://dictionary.cambridge.org
歡迎搜索及關注:編程人(a_codists)
常來說,Web頁面開發的流程大致是這樣的:設計師(設計師不是美工,就像程序員不是碼農一樣)提供設計稿,通常是圖片格式。然后前端的開發人員(在ThoughtWorks我們稱之為UI Dev)來手工的將圖片轉換為對應的HTML+CSS,往往還需要在各個瀏覽器中調試等。
大多數時候,設計師會提供色卡,或者至少前景色/背景色/高亮色的值給開發人員。如果沒有的話,開發人員會用到一些工具如colorpicker, ruler之類來確保最終的效果和設計稿是一致的。
如果你觀察過UI Dev的工作流程的話,你會發現基本的上是這樣的:使用編輯器(或者IDE)編寫HTML代碼,CSS代碼,保存修改內容,切換到瀏覽器窗口,按F5或者Ctrl-R刷新,然后對比設計稿和實現,如果發現不一致的地方,再切換到編輯器中修改代碼,如是往復。
避免手工勞動
純手工的方式來編輯HTML/CSS會非常耗時,特別是作為標記語言的HTML,開發者需要時刻關注關閉已經打開的標簽。比如一個標題元素,你需要:
This is the page title
幾乎從一開始,人們就想到了各種辦法來避免自己重復的鍵入,比如Vim的SuperTab以及Snipmate插件,可以通過輸入標簽名+Tab來補全所有的標簽等,又或者DreamWaver提供的代碼生成的方式來簡化這一流程。
Sublime的編輯器上的著名插件Emmet可以幫助開發人員飛速的開發HTML/CSS,這里有一個小例子。假設我們需要實現的頁面是這樣的:
那么對應的HTML結構可能會是:
...
使用Emmet,則只需要給出
表達式,然后按一下Tab鍵就可以補全為上述的結構了:
ul>li*3>.feature>span.number+i+h4+p
上邊的這條命令可以讀作:”創建一個UL,該UL下有3個LI,每個LI下有一個class為feature的DIV(不指定元素名稱的話,默認生成div),每個DIV內,有一個類為.number的SPAN,一個i元素,一個H4元素和一個P元素”
完整的技巧可以參看官方文檔。
避免重復勞動
上邊提到的頻繁的F5刷新,可以通過LiveReload+Guard兩個工具的組合來解決。LiveReload是一個瀏覽器的插件,通過協議與后臺的服務器進行通信。當后臺文件發生變化時,LiveReload會自動刷新頁面。
Guard會使用操作系統的API來感知本地文件的變化,當文件變化后,它可以通知LiveReload進行刷新,當然Guard可以做其他一些事情,比如等SCSS發生變化時,自動編譯CSS等。
兩者結合之后,就可以節省我們大量的時間,而把精力主要投放在開發這件事情本身上。
樣板工程
我在Github上公開了一個樣板工程,這是一個開箱即用的工程,其中提供了這樣一些配置:
Guardfile的配置中,如果index.html發生變化,或者stylesheets中的css文件發生變化,或者scripts目錄中的js文件發生變化,都會觸發livereload任務(通知瀏覽器)。
guard 'livereload' do watch('index.html') watch(%r{stylesheets/.+\.(css)}) watch(%r{scripts/.+\.(js)}) end guard :compass
你只需要簡單的將這個工程克隆到本地:
$ git clone git@github.com:abruzzi/design-boilerplate.git mydesign
然后在該目錄中執行bundle install即可:
$ cd mydesign $ bundle install
這里有兩點假設: 1. 你已經安裝了rvm 2. 你已經使用rvm安裝了某個版本的ruby,即bundler這個gem
開發流程
我通常會啟動兩個終端,一個用來運行Guard,另一個用來運行HTTP Server,然后是一個瀏覽器:
當在編輯器中進行編輯之后,保存文件,瀏覽器會自動刷新,這樣的快速反饋可以告訴我下一步應該如何修改:將背景色調整的再淡一點,還是把會h2的字體變得更大,或者圖片和文字的上邊緣沒有對齊等等。
這種開發流程和后臺開發人員進行TDD的方式非常類似:實時反饋,小步前進!如果你的桌子上有兩個顯示器的話,那就更好了,你可以在一臺顯示器上顯示設計稿,另一臺上分屏顯示編輯器和瀏覽器,這樣就可以非常舒服的進行UI開發了:
載說明:原創不易,未經授權,謝絕任何形式的轉載
層疊樣式表(CSS)是一種強大的樣式表語言,可以幫助前端開發人員為簡單的網頁添加樣式。然而,在使用這種樣式表語言時,開發人員可能會犯一些錯誤。這些錯誤會妨礙開發人員編寫高效的代碼。本文探討了一些常見的錯誤,并為每個錯誤提供了解決方案。
以下是我們開發人員經常犯的九個最常見的錯誤;你也犯過其中一些嗎?
!important 是 CSS 中的一個關鍵字,它可以幫助我們將屬性值設置為比其他樣式選項更重要。例如,如果您將 !important 聲明應用于元素樣式,那么該樣式將覆蓋該屬性類別的所有其他樣式。以下是語法:
selector {
property: value !important;
}
例如,如果您有一個標題元素 - h1 ,就像這樣:
<h1 class="css-mistake">CSS Mistakes</h1>
然后您應用以下樣式規則:
h1 {
color: red;
}
.css-mistake {
color: green;
}
默認情況下,標題文本的顏色將為“綠色”,因為類選擇器具有比元素(標簽)選擇器更高的CSS特異性選擇器。但是使用 !important ,您可以覆蓋該樣式CSS規則(從而使元素(標簽)選擇器覆蓋類選擇器)。通過這種方式,標題文本的顏色將為紅色,優先于類選擇器設置的綠色。
h1 {
color: red !important;
}
過度使用 !important 會導致特異性戰爭-一種狀態,其中樣式開始互相覆蓋,無法按照樣式表的作者定義的方式工作。下一節將通過列舉適當使用 !important 的實例來提供解決此問題的方法。
什么時候應該使用?
就像本節標題所說的那樣——“過度使用 !important ”,我們在使用這個關鍵詞時必須小心謹慎。只有在迫切需要時才應該節制地使用 !important 。以下是一些使用它的情況:
在進行樣式設計時,使用正確的長度單位對于創建響應式設計至關重要。CSS有兩類長度單位:絕對單位和相對單位。許多CSS屬性,如“寬度”、“高度”、“字體大小”等,都使用單位來表示其值。下面的代碼片段給出了單位的使用示例:
selector {
font-size: 14px;
}
在上面的代碼片段中,我們聲明了“font-size”CSS屬性,然后給它賦了一個14px的值。
什么是絕對單位?
這些是長度單位,無論渲染媒體如何,都具有固定的值,與設備的屏幕尺寸無關。這些單位非常適合在不同屏幕尺寸上保持元素的相同大小。你可能已經使用過一些標準的絕對單位,如像素 - px, 點 - pt, 英寸 - in, 毫米 - mm, 厘米 - cm, 和派卡 - pc. 絕對單位為我們提供了準確、固定和精確的樣式值,但它們不會根據屏幕尺寸進行縮放。絕對單位不適用于實現響應式設計。因此,將它們限制在不需要根據瀏覽器尺寸或設備屏幕尺寸進行調整的元素上。另一方面,相對單位如其名稱所示,是相對于另一個屬性(大多數情況下是父元素)的。這些單位具有靈活性,可以根據視口動態增長,適應響應式設計,與絕對單位不同。一些相對單位的例子是百分比(%)- rem, em, 等等。
如何使用相對單位及其解釋
了解每個相關單位的重要性,使您具備有效使用它們的知識。以下是一些相關單位及其解釋:
% - 這個單位完全依賴于父元素。因此,它是相對于父元素的。例如,如果你將一個元素的寬度設置為80%,它將是父元素寬度的80%。請注意,在以下屬性的值中使用百分比:寬度、高度、邊距和內邊距。
em - 這與父元素的字體大小相關。例如,如果您將元素的字體大小設置為4em,則它將是父元素字體大小的四倍。在處理排版(文本)時使用 em - 這使文本按比例縮放。
rem - 這是相對于根元素的字體大小。通常使用 rem 來實現整個布局的一致樣式。
vh - 相對于視口高度的1%。
vw - 相對于視口寬度的1%。
內聯樣式是一種通過 style 屬性將直接樣式傳遞給HTML元素的樣式系統。雖然存在這種樣式系統,但重要的是要理解它的使用不支持應用程序構建的最佳實踐,因為它會創建不可重用的代碼。只有在測試或美化簡單的HTML文件時才使用內聯樣式。以下是一些避免使用這種樣式系統的原因:
最佳實踐
為了克服內聯樣式的缺點,您必須使用內部樣式表(位于 <style> 標簽內的樣式)或外部樣式表來保持您的代碼健康和有組織。
不同的瀏覽器具有各種默認樣式,這些樣式不同,導致元素的外觀不一致。這就是為什么我們必須定義一些樣式,以便在其他瀏覽器上為網頁樣式提供一致的起點。這些樣式被稱為“CSS重置”。CSS重置是一種CSS樣式,用于刪除瀏覽器默認樣式的規則。如果您熟悉CSS,并且在使用過程中有時會注意到某些特定屬性的默認樣式,如 margin. ,CSS重置可以幫助我們將樣式基礎調整到一致的水平。以下是使用這些重置的原因:
如何創建自己的CSS重置
這里是要遵循的簡單步驟:
* {
margin: 0;
padding: 0;
border: 0;
}
上面的代碼是一個基本的CSS重置,它針對邊距、內邊距和邊框屬性,將每個屬性的值設為0。這個過程被稱為“標準化過程”,它可以消除瀏覽器默認的間距和邊框。這里有一些在線的CSS重置:
CSS中的單行代碼是CSS代碼的速記樣式。它可以使代碼更加清晰和有結構。掌握這些速記技巧將有助于您編寫更簡潔的代碼(將多行代碼壓縮為單行)。例如,當您想要在所有邊緣(上,下,左,右)處對元素邊距進行樣式設置時,您不需要明確地指定所有屬性(如 margin-top, margin-right, margin-bottom, 和 margin-left, ),您可以直接使用邊距屬性的速記方式。下面的代碼解釋了這一點:
/* Don't do this */
margin-top: 10px;
margin-bottom: 10px;
margin-right: 15px;
margin-left: 15px;
/* Instead, use Margin Shorthand */
margin: 10px 20px 10px 20px;
/* Margin Shorthand can even be more simplified */
margin: 10px 20px;
這些簡短的話語帶來了許多優點:
CSS選擇器可以在外部或內部樣式表中定位HTML元素。CSS中有許多選擇器方法,包括標簽(元素)、類、ID和偽元素。知道何時使用選擇器以及何時不使用選擇器非常重要。此外,您還必須了解CSS選擇器的工作原理。
如何避免使用過于復雜的選擇器
如果你在你的樣式表中遇到了像下面這樣的代碼片段,那就意味著你正在使用過于復雜的選擇器。
#container > .box > content .section .title p > span .italic {
color: blue;
font-weight: bold;
}
以下是避免過于復雜選擇器的技巧:
瀏覽器兼容性很重要,因為你不希望樣式在一個瀏覽器上良好運行,在另一個瀏覽器上則運行不正常。忽略瀏覽器兼容性可能會導致用戶在不同瀏覽器上的體驗不一致。這是因為不同的瀏覽器有其自己的CSS樣式渲染方式。但是,你可以通過考慮瀏覽器兼容性并確保你的樣式與不同瀏覽器兼容來實現樣式一致性。實現瀏覽器兼容性代碼的一種方法是實施以下操作:
使用供應商前綴:某些CSS屬性需要您使用前綴來渲染,無論使用哪種瀏覽器。需要這些前綴的瀏覽器包括Internet Explorer,Mozilla Firefox和Safari。這些前綴被稱為供應商前綴,因為它們是特定類型的瀏覽器獨有的。前綴的示例: -webkit-, -moz-, 和 -ms-. 。
/* webkit-prefixed version - used by browsers that use the WebKit layout engine, such as Chrome and Safari- */
-webkit-border-radius: 8px;
/* ms-prefixed version -used by browsers that use the Microsoft layout engine, such as Internet Explorer. */
-ms-border-radius: 10px;
/* standard version */
border-radius: 8px;
聲明字體回退:在為“font-family”等屬性分配值時,您必須添加回退字體。如果自定義字體不可用,回退字體將是實施的選項之一。
利用Can I Use網站檢查CSS屬性在各種瀏覽器中的兼容性。(https://caniuse.com/)
Hex碼是顏色的十六進制表示。它是一個由“#”符號前綴的6位代碼,后跟三對十六進制數字,其中第一對表示紅色值,第二對表示綠色值,最后一對表示藍色值。語法:
使用直接的顏色關鍵詞有一些限制:
顏色名稱在不同的瀏覽器中是不一致的。例如,如果你將顏色屬性設置為綠色,不同的瀏覽器對其解釋的方式也會有所不同。因此,不同瀏覽器之間的渲染是不一致的。
顏色名稱受到限制,因為您無法調整它們的色調、陰影等。
顏色名稱的選擇有限。由于使用顏色名稱的限制,我們需要選擇使用十六進制代碼,這些代碼沒有這些限制。以下是十六進制代碼比顏色關鍵字更合適的原因:
尋找十六進制代碼的高效方法
以下是獲取十六進制代碼的幾種方法:
使用0px替代0:毫無疑問,這可能不會對樣式表產生影響,但為了最佳實踐,請確保使用0而不是0px。
selector {
/*Don't do this*/
padding: 10px 12px 15px 0px;
/*Do this*/
padding: 10px 12px 15px 0;
}
設置高的z-index值:給 z-index 分配高值是非常不必要和過度的。遲早,這將在你的樣式表中造成問題,特別是當 z-index. 有多個實現時。
selector {
/*Don't do this*/
z-index: 50;
/*Do this*/
z-index: 2; /*Let the value be minimal*/
}
本文深入探討了常見的CSS錯誤,并為每個錯誤提供了深入的解決方案。通過閱讀本指南,毫無疑問您已經了解了一些常見的CSS錯誤,并且從此以后,您將知道如何解決它們,因為我們還要研究每個錯誤的解決方案。
由于文章內容篇幅有限,今天的內容就分享到這里,文章結尾,我想提醒您,文章的創作不易,如果您喜歡我的分享,請別忘了點贊和轉發,讓更多有需要的人看到。同時,如果您想獲取更多前端技術的知識,歡迎關注我,您的支持將是我分享最大的動力。我會持續輸出更多內容,敬請期待。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。