Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
Style 對象
Style 對象表示一個個別的樣式聲明。
訪問 Style 對象
Style 對象可以從文檔的頭部區(qū)域訪問,或者從指定的 HTML 元素訪問。
從文檔的頭部區(qū)域訪問 style 對象:
var x = document.getElementsByTagName("STYLE");嘗試一下
訪問一個指定元素的 style 對象:
var x = document.getElementById("myH1").style;
創(chuàng)建 Style 對象
您可以使用 document.createElement() 方法來創(chuàng)建 <style> 元素:
var x = document.createElement("STYLE");嘗試一下
您也可以設(shè)置一個已有元素的 style 屬性:
document.getElementById("myH1").style.color = "red";
Style 對象屬性
"CSS" 列表示該屬性是在哪一個 CSS 版本中定義的(CSS1、CSS2 或 CSS3)。
屬性 | 描述 | CSS |
---|---|---|
alignContent | 設(shè)置或返回當(dāng)靈活容器內(nèi)的各項沒有占用所有可用的空間時各項之間的對齊方式(水平)。 | 3 |
alignItems | 設(shè)置或返回靈活容器內(nèi)的各項的對齊方式。 | 3 |
alignSelf | 設(shè)置或返回靈活容器內(nèi)被選中項目的對齊方式。 | 3 |
animation | 是下面除了 animationPlayState 屬性之外的其他屬性的速記屬性。 | 3 |
animationDelay | 設(shè)置或返回動畫何時開始。 | 3 |
animationDirection | 設(shè)置或返回是否循環(huán)交替反向播放動畫。 | 3 |
animationDuration | 設(shè)置或返回動畫完成需花費的秒數(shù)或毫秒數(shù)。 | 3 |
animationFillMode | 設(shè)置或返回當(dāng)動畫不播放時(當(dāng)動畫完成時,或當(dāng)動畫有一個延遲未開始播放時),要應(yīng)用到元素的樣式。 | 3 |
animationIterationCount | 設(shè)置或返回動畫的播放次數(shù)。 | 3 |
animationName | 設(shè)置或返回關(guān)鍵幀 @keyframes 動畫的名稱。 | 3 |
animationTimingFunction | 設(shè)置或返回動畫的速度曲線。 | 3 |
animationPlayState | 設(shè)置或返回動畫是運行的還是暫停的。 | 3 |
background | 設(shè)置或返回在一個聲明中的所有背景屬性。 | 1 |
backgroundAttachment | 設(shè)置或返回背景圖像是否固定或隨頁面滾動。 | 1 |
backgroundColor | 設(shè)置或返回元素的背景色。 | 1 |
backgroundImage | 設(shè)置或返回元素的背景圖像。 | 1 |
backgroundPosition | 設(shè)置或返回的背景圖像的起始位置。 | 1 |
backgroundRepeat | 設(shè)置或返回如何重復(fù)背景圖像。 | 1 |
backgroundClip | 設(shè)置或返回背景的繪制區(qū)域。 | 3 |
backgroundOrigin | 設(shè)置或返回背景圖像的定位區(qū)域。 | 3 |
backgroundSize | 設(shè)置或返回背景圖像的大小。 | 3 |
backfaceVisibility | 設(shè)置或返回當(dāng)一個元素背對屏幕時是否可見。 | 3 |
border | 設(shè)置或返回在一個聲明中的 borderWidth、borderStyle 和 borderColor。 | 1 |
borderBottom | 設(shè)置或返回在一個聲明中的所有 borderBottom* 屬性。 | 1 |
borderBottomColor | 設(shè)置或返回下邊框的顏色。 | 1 |
borderBottomLeftRadius | 設(shè)置或返回左下角邊框的形狀。 | 3 |
borderBottomRightRadius | 設(shè)置或返回右下角邊框的形狀。 | 3 |
borderBottomStyle | 設(shè)置或返回下邊框的樣式。 | 1 |
borderBottomWidth | 設(shè)置或返回下邊框的寬度。 | 1 |
borderCollapse | 設(shè)置或返回表格的邊框是否被折疊為一個單一的邊框。 | 2 |
borderColor | 設(shè)置或返回元素邊框的顏色(最多可以有四個值)。 | 1 |
borderImage | 一個用于設(shè)置或返回所有的 borderImage* 屬性的速記屬性。 | 3 |
borderImageOutset | 設(shè)置或返回邊框圖像區(qū)域超出邊界框的量。 | 3 |
borderImageRepeat | 設(shè)置或返回圖像邊框是重復(fù)拼接圖塊還是延伸圖塊。 | 3 |
borderImageSlice | 設(shè)置或返回圖像邊框的向內(nèi)偏移。 | 3 |
borderImageSource | 設(shè)置或返回要作為邊框使用的圖像。 | 3 |
borderImageWidth | 設(shè)置或返回圖像邊框的寬度。 | 3 |
borderLeft | 設(shè)置或返回在一個聲明中的所有 borderLeft* 屬性。 | 1 |
borderLeftColor | 設(shè)置或返回左邊框的顏色。 | 1 |
borderLeftStyle | 設(shè)置或返回左邊框的樣式。 | 1 |
borderLeftWidth | 設(shè)置或返回左邊框的寬度。 | 1 |
borderRadius | 一個用于設(shè)置或返回四個 border*Radius 屬性的速記屬性。 | 3 |
borderRight | 設(shè)置或返回在一個聲明中的所有 borderRight* 屬性。 | 1 |
borderRightColor | 設(shè)置或返回右邊框的顏色。 | 1 |
borderRightStyle | 設(shè)置或返回右邊框的樣式。 | 1 |
borderRightWidth | 設(shè)置或返回右邊框的寬度。 | 1 |
borderSpacing | 設(shè)置或返回表格中單元格之間的距離。 | 2 |
borderStyle | 設(shè)置或返回元素邊框的樣式(最多可以有四個值)。 | 1 |
borderTop | 設(shè)置或返回在一個聲明中的所有 borderTop* 屬性。 | 1 |
borderTopColor | 設(shè)置或返回上邊框的顏色。 | 1 |
borderTopLeftRadius | 設(shè)置或返回左上角邊框的形狀。 | 3 |
borderTopRightRadius | 設(shè)置或返回右上角邊框的形狀。 | 3 |
borderTopStyle | 設(shè)置或返回上邊框的樣式。 | 1 |
borderTopWidth | 設(shè)置或返回上邊框的寬度。 | 1 |
borderWidth | 設(shè)置或返回元素邊框的寬度(最多可以有四個值)。 | 1 |
bottom | 設(shè)置或返回定位元素的底部位置。 | 2 |
boxDecorationBreak | 設(shè)置或返回分頁處元素的背景和邊框行為,或者換行處內(nèi)聯(lián)元素的背景和邊框行為。 | 3 |
boxShadow | 設(shè)置或返回元素的下拉陰影。 | 3 |
boxSizing | 允許您以特定的方式定義匹配某個區(qū)域的特定元素。 | 3 |
captionSide | 設(shè)置或返回表格標(biāo)題的位置。 | 2 |
clear | 設(shè)置或返回元素相對浮動對象的位置。 | 1 |
clip | 設(shè)置或返回定位元素的可見部分。 | 2 |
color | 設(shè)置或返回文本的顏色。 | 1 |
columnCount | 設(shè)置或返回元素應(yīng)該被劃分的列數(shù)。 | 3 |
columnFill | 設(shè)置或返回如何填充列。 | 3 |
columnGap | 設(shè)置或返回列之間的間隔。 | 3 |
columnRule | 一個用于設(shè)置或返回所有的 columnRule* 屬性的速記屬性。 | 3 |
columnRuleColor | 設(shè)置或返回列之間的顏色規(guī)則。 | 3 |
columnRuleStyle | 設(shè)置或返回列之間的樣式規(guī)則。 | 3 |
columnRuleWidth | 設(shè)置或返回列之間的寬度規(guī)則。 | 3 |
columns | 一個用于設(shè)置或返回 columnWidth 和 columnCount 的速記屬性。 | 3 |
columnSpan | 設(shè)置或返回一個元素應(yīng)橫跨多少列。 | 3 |
columnWidth | 設(shè)置或返回列的寬度。 | 3 |
content | 與 :before 和 :after 偽元素一起使用,來插入生成的內(nèi)容。 | 2 |
counterIncrement | 增加一個或多個計數(shù)器。 | 2 |
counterReset | 創(chuàng)建或重置一個或多個計數(shù)器。 | 2 |
cursor | 設(shè)置或返回鼠標(biāo)指針顯示的光標(biāo)類型。 | 2 |
direction | 設(shè)置或返回文本的方向。 | 2 |
display | 設(shè)置或返回元素的顯示類型。 | 1 |
emptyCells | 設(shè)置或返回是否顯示表格中的空單元格的邊框和背景。 | 2 |
filter | 設(shè)置或返回圖片濾鏡(可視效果,如:高斯模糊與飽和度) | 3 |
flex | 相對于同一容器其他靈活的項目,設(shè)置或返回項目的長度。 | 3 |
flexBasis | 設(shè)置或靈活項目的初始長度。 | 3 |
flexDirection | 設(shè)置或返回靈活項目的方向。 | 3 |
flexFlow | 是 flexDirection 和 flexWrap 屬性的速記屬性。 | 3 |
flexGrow | 設(shè)置或返回項目將相對于同一容器內(nèi)其他靈活的項目進(jìn)行擴(kuò)展的量。 | 3 |
flexShrink | 設(shè)置或返回項目將相對于同一容器內(nèi)其他靈活的項目進(jìn)行收縮的量。 | 3 |
flexWrap | 設(shè)置或返回靈活項目是否拆行或拆列。 | 3 |
cssFloat | 設(shè)置或返回元素的水平對齊方式。 | 1 |
font | 設(shè)置或返回一個聲明中的 fontStyle、fontVariant、fontWeight、fontSize、lineHeight 和 fontFamily。 | 1 |
fontFamily | 設(shè)置或返回文本的字體。 | 1 |
fontSize | 設(shè)置或返回文本的字體尺寸。 | 1 |
fontStyle | 設(shè)置或返回字體樣式是否是 normal(正常的)、italic(斜體)或 oblique(傾斜的)。 | 1 |
fontVariant | 設(shè)置或返回是否以小型大寫字母顯示字體。 | 1 |
fontWeight | 設(shè)置或返回字體的粗細(xì)。 | 1 |
fontSizeAdjust | 當(dāng)使用備用字體時,確保文本的可讀性。 | 3 |
fontStretch | 從字體庫中選擇一種正常的、濃縮的或擴(kuò)大的字體。 | 3 |
hangingPunctuation | 規(guī)定一個標(biāo)點符號是否可以放置在線框外。 | 3 |
height | 設(shè)置或返回元素的高度。 | 1 |
hyphens | 設(shè)置如何拆分單詞來提高段落布局。 | 3 |
icon | 向作者提供為一個帶有等價于圖標(biāo)的元素定義樣式的功能。 | 3 |
imageOrientation | 規(guī)定一個用戶代理應(yīng)用到圖像上的順時針方向的旋轉(zhuǎn)。 | 3 |
justifyContent | 設(shè)置或返回當(dāng)靈活容器內(nèi)的各項沒有占用所有可用的空間時各項之間的對齊方式(垂直)。 | 3 |
left | 設(shè)置或返回定位元素的左部位置。 | 2 |
letterSpacing | 設(shè)置或返回文本中字符之間的空間。 | 1 |
lineHeight | 設(shè)置或返回在文本中行之間的距離。 | 1 |
listStyle | 設(shè)置或返回一個聲明中的 listStyleImage、listStylePosition 和 listStyleType。 | 1 |
listStyleImage | 設(shè)置或返回作為列表項標(biāo)記的圖像。 | 1 |
listStylePosition | 設(shè)置或返回列表項標(biāo)記的位置。 | 1 |
listStyleType | 設(shè)置或返回列表項標(biāo)記的類型。 | 1 |
margin | 設(shè)置或返回元素的外邊距(最多可以有四個值)。 | 1 |
marginBottom | 設(shè)置或返回元素的的下外邊距。 | 1 |
marginLeft | 設(shè)置或返回元素的左外邊距。 | 1 |
marginRight | 設(shè)置或返回元素的右外邊距。 | 1 |
marginTop | 設(shè)置或返回元素的上外邊距。 | 1 |
maxHeight | 設(shè)置或返回元素的最大高度。 | 2 |
maxWidth | 設(shè)置或返回元素的最大寬度。 | 2 |
minHeight | 設(shè)置或返回元素的最小高度。 | 2 |
minWidth | 設(shè)置或返回元素的最小寬度。 | 2 |
navDown | 設(shè)置或返回當(dāng)使用向下箭頭導(dǎo)航鍵時要導(dǎo)航到哪里。 | 3 |
navIndex | 設(shè)置或返回元素的顯示順序。 | 3 |
navLeft | 設(shè)置或返回當(dāng)使用向左箭頭導(dǎo)航鍵時要導(dǎo)航到哪里。 | 3 |
navRight | 設(shè)置或返回當(dāng)使用向右箭頭導(dǎo)航鍵時要導(dǎo)航到哪里。 | 3 |
navUp | 設(shè)置或返回當(dāng)使用向上箭頭導(dǎo)航鍵時要導(dǎo)航到哪里。 | 3 |
opacity | 設(shè)置或返回元素的不透明度。 | 3 |
order | 設(shè)置或返回一個靈活的項目相對于同一容器內(nèi)其他靈活項目的順序。 | 3 |
orphans | 設(shè)置或返回當(dāng)元素內(nèi)有分頁時,必須在頁面底部預(yù)留的最小行數(shù)。 | 2 |
outline | 設(shè)置或返回在一個聲明中的所有 outline 屬性。 | 2 |
outlineColor | 設(shè)置或返回一個元素周圍的輪廓顏色。 | 2 |
outlineOffset | 對輪廓進(jìn)行偏移,并在邊框邊緣進(jìn)行繪制。 | 3 |
outlineStyle | 設(shè)置或返回一個元素周圍的輪廓樣式。 | 2 |
outlineWidth | 設(shè)置或返回一個元素周圍的輪廓寬度。 | 2 |
overflow | 設(shè)置或返回如何處理呈現(xiàn)在元素框外面的內(nèi)容。 | 2 |
overflowX | 規(guī)定如果內(nèi)容溢出元素的內(nèi)容區(qū)域,是否對內(nèi)容的左/右邊緣進(jìn)行裁剪。 | 3 |
overflowY | 規(guī)定如果內(nèi)容溢出元素的內(nèi)容區(qū)域,是否對內(nèi)容的上/下邊緣進(jìn)行裁剪。 | 3 |
padding | 設(shè)置或返回元素的內(nèi)邊距(最多可以有四個值)。 | 1 |
paddingBottom | 設(shè)置或返回元素的下內(nèi)邊距。 | 1 |
paddingLeft | 設(shè)置或返回元素的左內(nèi)邊距。 | 1 |
paddingRight | 設(shè)置或返回元素的右內(nèi)邊距。 | 1 |
paddingTop | 設(shè)置或返回元素的上內(nèi)邊距。 | 1 |
pageBreakAfter | 設(shè)置或返回元素后的分頁行為。 | 2 |
pageBreakBefore | 設(shè)置或返回元素前的分頁行為。 | 2 |
pageBreakInside | 設(shè)置或返回元素內(nèi)的分頁行為。 | 2 |
perspective | 設(shè)置或返回 3D 元素被查看的視角。 | 3 |
perspectiveOrigin | 設(shè)置或返回 3D 元素的底部位置。 | 3 |
position | 設(shè)置或返回用于元素定位方法的類型(static、relative、absolute 或 fixed)。 | 2 |
quotes | 設(shè)置或返回嵌入引用的引號類型。 | 2 |
resize | 設(shè)置或返回是否可由用戶調(diào)整元素的尺寸大小。 | 3 |
right | 設(shè)置或返回定位元素的右部位置。 | 2 |
tableLayout | 設(shè)置或返回表格單元格、行、列的布局方式。 | 2 |
tabSize | 設(shè)置或返回制表符(tab)字符的長度。 | 3 |
textAlign | 設(shè)置或返回文本的水平對齊方式。 | 1 |
textAlignLast | 設(shè)置或返回當(dāng) text-align 屬性設(shè)置為 "justify" 時,如何對齊一個強制換行符前的最后一行。 | 3 |
textDecoration | 設(shè)置或返回文本的修飾。 | 1 |
textDecorationColor | 設(shè)置或返回文本修飾的顏色。 | 3 |
textDecorationLine | 設(shè)置或返回文本修飾要使用的線條類型。 | 3 |
textDecorationStyle | 設(shè)置或返回文本修飾中的線條樣式。 | 3 |
textIndent | 設(shè)置或返回文本第一行的縮進(jìn)。 | 1 |
textJustify | 設(shè)置或返回當(dāng) text-align 屬性設(shè)置為 "justify" 時,要使用的對齊方法。 | 3 |
textOverflow | 設(shè)置或返回當(dāng)文本溢出包含它的元素,應(yīng)該發(fā)生什么。 | 3 |
textShadow | 設(shè)置或返回文本的陰影效果。 | 3 |
textTransform | 設(shè)置或返回文本的大小寫。 | 1 |
top | 設(shè)置或返回定位元素的頂部位置。 | 2 |
transform | 向元素應(yīng)用 2D 或 3D 轉(zhuǎn)換。 | 3 |
transformOrigin | 設(shè)置或返回被轉(zhuǎn)換元素的位置。 | 3 |
transformStyle | 設(shè)置或返回被嵌套的元素如何呈現(xiàn)在 3D 空間中。 | 3 |
transition | 一個用于設(shè)置或返回四個過渡屬性的速記屬性。 | 3 |
transitionProperty | 應(yīng)用過渡效果的 CSS 屬性的名稱。 | 3 |
transitionDuration | 設(shè)置或返回完成過渡效果需要花費的時間(以秒或毫秒計)。 | 3 |
transitionTimingFunction | 設(shè)置或返回過渡效果的速度曲線。 | 3 |
transitionDelay | 設(shè)置或返回過渡效果何時開始。 | 3 |
unicodeBidi | 設(shè)置或返回文本是否被重寫,以便在同一文檔中支持多種語言。 | 2 |
verticalAlign | 設(shè)置或返回元素中內(nèi)容的垂直對齊方式。 | 1 |
visibility | 設(shè)置或返回元素是否應(yīng)該是可見的。 | 2 |
whiteSpace | 設(shè)置或返回如何處理文本中的制表符、換行符和空格符。 | 1 |
width | 設(shè)置或返回元素的寬度。 | 1 |
wordBreak | 設(shè)置或返回非 CJK 語言的換行規(guī)則。 | 3 |
wordSpacing | 設(shè)置或返回文本中單詞之間的空間。 | 1 |
wordWrap | 允許長單詞或 URL 地址換行到下一行。 | 3 |
widows | 設(shè)置或返回一個元素必須在頁面頂部的可見行的最小數(shù)量。 | 2 |
zIndex | 設(shè)置或返回定位元素的堆疊順序。 | 2 |
如您還有不明白的可以在下面與我留言或是與我探討QQ群308855039,我們一起飛!
三部分 附錄(因為暫時不支持插入超鏈接所以部分內(nèi)容無法顯示)
附錄一 DIV命名規(guī)范
附錄二 CSS精靈
a { display:block; width:200px; height:65px; line-height:65px; /*定義狀態(tài)*/ text-indent:-2015px; /*隱藏文字*/ background-image:url(button.png); /*定義背景圖片*/ background-position:0 0; /*定義鏈接的普通狀態(tài),此時圖像顯示的是頂上的部分*/ } a:hover { background-position:0 -66px; /*定義鏈接的滑過狀態(tài),此時顯示的為中間部分,向下取負(fù)值*/ } a:active { background-position:0 -132px; /*定 義鏈接的普通狀態(tài),此時顯示的是底部的部分,向下取負(fù)值*/ }
附錄三 一些tips解決方案
頁面優(yōu)化實踐
寫DIV+CSS 的一些常識
常用代碼片段
body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, code, form, fieldset, legend, input, button, textarea, p, blockquote, th, td { margin:0; padding:0; } body { background:#fff; color:#555; font-size:14px; font-family: Verdana, Arial, Helvetica, sans-serif; } td, th, caption { font-size:14px; } h1, h2, h3, h4, h5, h6 { font-weight:normal; font-size:100%; } address, caption, cite, code, dfn, em, strong, th, var { font-style:normal; font-weight:normal; } a { color:#555; text-decoration:none; } a:hover { text-decoration:underline; } img { border:none; } ol,ul,li { list-style:none; } input, textarea, select, button { font:14px Verdana,Helvetica,Arial,sans-serif; } table { border-collapse:collapse; } html { overflow-y: scroll; } .clearfix:after { content: "."; display: block; height:0; clear:both; visibility: hidden; } .clearfix { *zoom:1; }
<meta name=”viewport” content=”width=320,target-densitydpi=dpi_value,initial-scale=1, user-scalable=no”/>
table-layout: fixed; word-break: break-all;;border-collapse: collapse
<div id=”abc” style=”display:table;text-align:center;width:100%;height:100%;”> <span style=”background:#f00; display:table-cell; vertical-align:middle;”> <input type=”button” value=”item1″ /> </span> </div>
filter:alpha(opacity=50); /*1-100*/ -moz-opacity:0.5; /*0-1.0*/ -khtml-opacity:0.5; /*0-1.0*/ opacity:0.5; /*0-1.0*/
white-space:nowrap; text-overflow:ellipsis; overflow:hidden;
.fix{zoom:1;} .fix:after{ display:block; content:'clear'; clear:both; line-height:0; visibility:hidden; }
一些總結(jié)
一些概念
學(xué)習(xí)從來不是一個人的事情,要有個相互監(jiān)督的伙伴,想要學(xué)習(xí)或交流前端問題的小伙伴可以私信“學(xué)習(xí)”小明加群獲取2019web前端最新入門資料,一起學(xué)習(xí),一起成長!
有些人玩游戲,是為了尋求刺激;有些人玩游戲,是為了休閑安靜地打發(fā)時間。二者的感受如何才能兼得,近日,蘇格蘭愛丁堡的一位開發(fā)者 Anslo 潛心開發(fā)了 16 個月,發(fā)布了一款名為 《Slow Roads》(slowroads.io)的免費、輕松的駕駛游戲,可以讓玩家在電腦上體驗《速度與激情》的感覺,還能欣賞由程序自動生成的優(yōu)美風(fēng)景。此外,這款游戲可以直接在瀏覽器中運行,無需登錄或者安裝,對于玩家而言,即開即玩。
玩法
《Slow Roads》一經(jīng)推出之后,便受到了不少玩家的關(guān)注和試玩。和傳統(tǒng)駕駛類游戲有所不同,這款游戲在玩法和技術(shù)實現(xiàn)上有著巨大的差異。
首先,在游戲玩法上,它沒有撞車、沒有失敗更沒有輸贏。隨著汽車的行駛,道路會一直在延伸,風(fēng)景秀麗的景觀在身邊飛馳,最為值得關(guān)注無論是春夏秋冬,還是白天、傍晚、黑夜,亦或是森林、沙漠、環(huán)山,場景都可以一鍵“無縫切換”。
另外,駕駛的車也可以切換為轎車、長途汽車、自行車。
如果你的方向盤偏離了道路,也可以按一下「R」鍵將車重新定位到快速道上,甚至道路也是可以選擇的。當(dāng)然,如果你愿意,還可以駕駛越野車或者體驗一下水下行駛的感覺。
當(dāng)然,玩累了,還可以開啟自動駕駛模式。
同時,這款游戲的操作也非常簡單,W 鍵或向上箭頭是加速,S 鍵或向下箭頭是剎車。A 鍵和 D 鍵(或左右箭頭)控制轉(zhuǎn)向;玩家也可以通過按住 Shift 或雙擊 W 鍵來升級汽車;C 鍵可改變攝像機(jī)角度,Q 鍵和 E 鍵在可用的天氣和照明條件下循環(huán)。如果你不喜歡鍵盤控制,也可以改用基于鼠標(biāo)的轉(zhuǎn)向。
在技術(shù)實現(xiàn)上,與使用傳統(tǒng)游戲引擎開發(fā)的游戲不同,Anslo 表示,《Slow Roads》使用了 three.js 的 3D JavaScript 庫構(gòu)建,可直接在 Chrome、Firefox、Safari 和 Edge 瀏覽器中運行。與此同時,上述的場景切換都是由程序自動生成,通過技術(shù)實現(xiàn),可以動態(tài)生成無限地圖和處理事務(wù)。這是一個相當(dāng)復(fù)雜且有趣的技術(shù)演示。用開發(fā)者 Anslo 自己的話來形容,「該游戲的實驗正在挑戰(zhàn)瀏覽器游戲的合理邊界」。
接下來,我們不妨一起來看一下具體的技術(shù)原理。
技術(shù)實現(xiàn)
事實上,這一款游戲的制作不僅需要深厚的開發(fā)功底,也需要有設(shè)計、物理學(xué)等知識儲備。在《Slow Roads》中,作者首先通過生成一個高度圖,采用了類似于 Perlin 噪聲的算法,并進(jìn)行了修改優(yōu)化,從而實現(xiàn)更真實的山丘景觀。
繼而使用一個 npm 包 Alea(https://www.npmjs.com/package/alea)用作 PRNG(偽隨機(jī)數(shù)生成器,Preudo Random Number Generator),用于復(fù)制和粘貼實現(xiàn)。
當(dāng)完成第一步開發(fā)之后,第二步便是進(jìn)行車子行駛的道路規(guī)劃。Anslo 選擇采用了以下步驟:
選擇地圖中一個不太陡峭、不太深的地方,作為行駛的起點。同時,這也是道路中線的第一個點。
進(jìn)而選擇一個方向,并測量周圍的高度圖,以此評估橫向和縱向的坡度。
然后,道路中線最好是能向坡度下滑的方向移動 10 米。點被編碼在一個雙向鏈表中,每個點都使用元數(shù)據(jù)(如坡度、道路寬度和曲率)注釋。
上面這個過程是會一直重復(fù)的(以從車輛位置開始的 15 公里的地平線為界),但注意行駛的車道不要有自相交的情況,這也是游戲中道路規(guī)劃最難的地方。
中線點的高度用一個 9 個點的窗口進(jìn)行追溯平滑,以避免海拔的突然急劇變化。
在一個較短的地平線上,大概 10 米的中線被用二次貝塞爾曲線以 1 米的分辨率進(jìn)行平滑點的注釋。
當(dāng)?shù)缆芬?guī)劃完成之后,第三步便是渲染環(huán)境。這里可以使用一個 5x5 的大粗網(wǎng)格(這款游戲中,作者采用的是 10 米的分辨率和 1 公里的最大視距)來渲染大型場景。這被稱之為“遠(yuǎn)網(wǎng)格”。
在靠近道路的地方,是一個由更細(xì)的 5x5 網(wǎng)格組成的,每個網(wǎng)格拼接到一起,沿著道路中線行進(jìn),形成一個連續(xù)的 "走廊"。這就是 "近網(wǎng)格",從車輛的位置向前生成一個固定的水平線。
同時,遠(yuǎn)處網(wǎng)格現(xiàn)在重疊的頂點被粗略地 "隱藏 "起來,把它們沉到幾米以下。
然后離道路中線接近的地方,在道路的高度和底層環(huán)境的高度之間插值,以實現(xiàn)無縫過渡。
除了以上,Anslo 還采用了一個額外的 3x3 網(wǎng)格,渲染離道路中線更近的地方,優(yōu)化細(xì)節(jié),實現(xiàn)更精細(xì)的體驗。
在圖形細(xì)節(jié)中,這名開發(fā)者在游戲中的地面紋理使用世界坐標(biāo)的 UV,并與 perlin 噪聲混合,以改變草的顏色。另外,在樹葉地圖下應(yīng)用了一個暗色的紋理,用來產(chǎn)生樹影的感官。
正如上文所述,這款游戲還采用了一些物理學(xué)的基礎(chǔ)知識,如汽車每個輪子的動力學(xué)都是獨立計算的,使用圍繞重力、表面摩擦力和地面法線的常規(guī)運動學(xué)方程式。
最后
目前這款游戲已經(jīng)基本完成,不過,Anslo 認(rèn)為也還有不少需要優(yōu)化的地方,后續(xù)可能會改善天氣效果、更多的車輛類型和控制器支持。
作為一款沒有使用如 Unity、UE5 等游戲引擎,而僅是使用了 JavaScript 實現(xiàn)的游戲而言,它的輕量級獲得了不少好評:
火星地圖很有趣。另外,我發(fā)現(xiàn)汽車在倒擋時候可以同樣快!
如果能教會自動駕駛漂移會很酷。
現(xiàn)在的我沒有駕照,但是也能通過瀏覽器獲得駕駛通信證了,榮譽!
期待后續(xù)可以加上背景音樂!
也有不少網(wǎng)友感嘆似乎回到了高中時期玩《Geep Simulator》的年代。不過,目前《Slow Roads》暫時還沒有開源版本的計劃,但作者表示將來不排除有這種可能性。同時根據(jù)游戲的頁面顯示,Anslo 稱正在致力于保持《Slow Roads》免費提供且沒有廣告,「享受這作為逃離資本主義的喘息之機(jī)」。
試玩地址:slowroads.io
參考資料:
https://anslo.medium.com/slow-roads-tl-dr-a664ac6bce40
https://twitter.com/anslogen
https://arstechnica.com/gaming/2022/10/slow-roads-offers-a-chill-endless-driving-experience-in-your-browser/
https://twitter.com/anslogen/status/1583850492463296517
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。