整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

HTML DOM Style 对象

Style 对象

Style 对象表示一个个别的样式声明。

访问 Style 对象

Style 对象可以从文档的头部区域访问,或者从指定的 HTML 元素访问。

从文档的头部区域访问 style 对象:

var x = document.getElementsByTagName("STYLE");尝试一下

访问一个指定元素的 style 对象:

var x = document.getElementById("myH1").style;

创建 Style 对象

您可以使用 document.createElement() 方法来创建 <style> 元素:

var x = document.createElement("STYLE");尝试一下

您也可以设置一个已有元素的 style 属性:

document.getElementById("myH1").style.color = "red";

Style 对象属性

"CSS" 列表示该属性是在哪一个 CSS 版本中定义的(CSS1、CSS2 或 CSS3)。

属性描述CSS
alignContent设置或返回当灵活容器内的各项没有占用所有可用的空间时各项之间的对齐方式(水平)。3
alignItems设置或返回灵活容器内的各项的对齐方式。3
alignSelf设置或返回灵活容器内被选中项目的对齐方式。3
animation是下面除了 animationPlayState 属性之外的其他属性的速记属性。3
animationDelay设置或返回动画何时开始。3
animationDirection设置或返回是否循环交替反向播放动画。3
animationDuration设置或返回动画完成需花费的秒数或毫秒数。3
animationFillMode设置或返回当动画不播放时(当动画完成时,或当动画有一个延迟未开始播放时),要应用到元素的样式。3
animationIterationCount设置或返回动画的播放次数。3
animationName设置或返回关键帧 @keyframes 动画的名称。3
animationTimingFunction设置或返回动画的速度曲线。3
animationPlayState设置或返回动画是运行的还是暂停的。3
background设置或返回在一个声明中的所有背景属性。1
backgroundAttachment设置或返回背景图像是否固定或随页面滚动。1
backgroundColor设置或返回元素的背景色。1
backgroundImage设置或返回元素的背景图像。1
backgroundPosition设置或返回的背景图像的起始位置。1
backgroundRepeat设置或返回如何重复背景图像。1
backgroundClip设置或返回背景的绘制区域。3
backgroundOrigin设置或返回背景图像的定位区域。3
backgroundSize设置或返回背景图像的大小。3
backfaceVisibility设置或返回当一个元素背对屏幕时是否可见。3
border设置或返回在一个声明中的 borderWidth、borderStyle 和 borderColor。1
borderBottom设置或返回在一个声明中的所有 borderBottom* 属性。1
borderBottomColor设置或返回下边框的颜色。1
borderBottomLeftRadius设置或返回左下角边框的形状。3
borderBottomRightRadius设置或返回右下角边框的形状。3
borderBottomStyle设置或返回下边框的样式。1
borderBottomWidth设置或返回下边框的宽度。1
borderCollapse设置或返回表格的边框是否被折叠为一个单一的边框。2
borderColor设置或返回元素边框的颜色(最多可以有四个值)。1
borderImage一个用于设置或返回所有的 borderImage* 属性的速记属性。3
borderImageOutset设置或返回边框图像区域超出边界框的量。3
borderImageRepeat设置或返回图像边框是重复拼接图块还是延伸图块。3
borderImageSlice设置或返回图像边框的向内偏移。3
borderImageSource设置或返回要作为边框使用的图像。3
borderImageWidth设置或返回图像边框的宽度。3
borderLeft设置或返回在一个声明中的所有 borderLeft* 属性。1
borderLeftColor设置或返回左边框的颜色。1
borderLeftStyle设置或返回左边框的样式。1
borderLeftWidth设置或返回左边框的宽度。1
borderRadius一个用于设置或返回四个 border*Radius 属性的速记属性。3
borderRight设置或返回在一个声明中的所有 borderRight* 属性。1
borderRightColor设置或返回右边框的颜色。1
borderRightStyle设置或返回右边框的样式。1
borderRightWidth设置或返回右边框的宽度。1
borderSpacing设置或返回表格中单元格之间的距离。2
borderStyle设置或返回元素边框的样式(最多可以有四个值)。1
borderTop设置或返回在一个声明中的所有 borderTop* 属性。1
borderTopColor设置或返回上边框的颜色。1
borderTopLeftRadius设置或返回左上角边框的形状。3
borderTopRightRadius设置或返回右上角边框的形状。3
borderTopStyle设置或返回上边框的样式。1
borderTopWidth设置或返回上边框的宽度。1
borderWidth设置或返回元素边框的宽度(最多可以有四个值)。1
bottom设置或返回定位元素的底部位置。2
boxDecorationBreak设置或返回分页处元素的背景和边框行为,或者换行处内联元素的背景和边框行为。3
boxShadow设置或返回元素的下拉阴影。3
boxSizing允许您以特定的方式定义匹配某个区域的特定元素。3
captionSide设置或返回表格标题的位置。2
clear设置或返回元素相对浮动对象的位置。1
clip设置或返回定位元素的可见部分。2
color设置或返回文本的颜色。1
columnCount设置或返回元素应该被划分的列数。3
columnFill设置或返回如何填充列。3
columnGap设置或返回列之间的间隔。3
columnRule一个用于设置或返回所有的 columnRule* 属性的速记属性。3
columnRuleColor设置或返回列之间的颜色规则。3
columnRuleStyle设置或返回列之间的样式规则。3
columnRuleWidth设置或返回列之间的宽度规则。3
columns一个用于设置或返回 columnWidth 和 columnCount 的速记属性。3
columnSpan设置或返回一个元素应横跨多少列。3
columnWidth设置或返回列的宽度。3
content与 :before 和 :after 伪元素一起使用,来插入生成的内容。2
counterIncrement增加一个或多个计数器。2
counterReset创建或重置一个或多个计数器。2
cursor设置或返回鼠标指针显示的光标类型。2
direction设置或返回文本的方向。2
display设置或返回元素的显示类型。1
emptyCells设置或返回是否显示表格中的空单元格的边框和背景。2
filter设置或返回图片滤镜(可视效果,如:高斯模糊与饱和度)3
flex相对于同一容器其他灵活的项目,设置或返回项目的长度。3
flexBasis设置或灵活项目的初始长度。3
flexDirection设置或返回灵活项目的方向。3
flexFlow是 flexDirection 和 flexWrap 属性的速记属性。3
flexGrow设置或返回项目将相对于同一容器内其他灵活的项目进行扩展的量。3
flexShrink设置或返回项目将相对于同一容器内其他灵活的项目进行收缩的量。3
flexWrap设置或返回灵活项目是否拆行或拆列。3
cssFloat设置或返回元素的水平对齐方式。1
font设置或返回一个声明中的 fontStyle、fontVariant、fontWeight、fontSize、lineHeight 和 fontFamily。1
fontFamily设置或返回文本的字体。1
fontSize设置或返回文本的字体尺寸。1
fontStyle设置或返回字体样式是否是 normal(正常的)、italic(斜体)或 oblique(倾斜的)。1
fontVariant设置或返回是否以小型大写字母显示字体。1
fontWeight设置或返回字体的粗细。1
fontSizeAdjust当使用备用字体时,确保文本的可读性。3
fontStretch从字体库中选择一种正常的、浓缩的或扩大的字体。3
hangingPunctuation规定一个标点符号是否可以放置在线框外。3
height设置或返回元素的高度。1
hyphens设置如何拆分单词来提高段落布局。3
icon向作者提供为一个带有等价于图标的元素定义样式的功能。3
imageOrientation规定一个用户代理应用到图像上的顺时针方向的旋转。3
justifyContent设置或返回当灵活容器内的各项没有占用所有可用的空间时各项之间的对齐方式(垂直)。3
left设置或返回定位元素的左部位置。2
letterSpacing设置或返回文本中字符之间的空间。1
lineHeight设置或返回在文本中行之间的距离。1
listStyle设置或返回一个声明中的 listStyleImage、listStylePosition 和 listStyleType。1
listStyleImage设置或返回作为列表项标记的图像。1
listStylePosition设置或返回列表项标记的位置。1
listStyleType设置或返回列表项标记的类型。1
margin设置或返回元素的外边距(最多可以有四个值)。1
marginBottom设置或返回元素的的下外边距。1
marginLeft设置或返回元素的左外边距。1
marginRight设置或返回元素的右外边距。1
marginTop设置或返回元素的上外边距。1
maxHeight设置或返回元素的最大高度。2
maxWidth设置或返回元素的最大宽度。2
minHeight设置或返回元素的最小高度。2
minWidth设置或返回元素的最小宽度。2
navDown设置或返回当使用向下箭头导航键时要导航到哪里。3
navIndex设置或返回元素的显示顺序。3
navLeft设置或返回当使用向左箭头导航键时要导航到哪里。3
navRight设置或返回当使用向右箭头导航键时要导航到哪里。3
navUp设置或返回当使用向上箭头导航键时要导航到哪里。3
opacity设置或返回元素的不透明度。3
order设置或返回一个灵活的项目相对于同一容器内其他灵活项目的顺序。3
orphans设置或返回当元素内有分页时,必须在页面底部预留的最小行数。2
outline设置或返回在一个声明中的所有 outline 属性。2
outlineColor设置或返回一个元素周围的轮廓颜色。2
outlineOffset对轮廓进行偏移,并在边框边缘进行绘制。3
outlineStyle设置或返回一个元素周围的轮廓样式。2
outlineWidth设置或返回一个元素周围的轮廓宽度。2
overflow设置或返回如何处理呈现在元素框外面的内容。2
overflowX规定如果内容溢出元素的内容区域,是否对内容的左/右边缘进行裁剪。3
overflowY规定如果内容溢出元素的内容区域,是否对内容的上/下边缘进行裁剪。3
padding设置或返回元素的内边距(最多可以有四个值)。1
paddingBottom设置或返回元素的下内边距。1
paddingLeft设置或返回元素的左内边距。1
paddingRight设置或返回元素的右内边距。1
paddingTop设置或返回元素的上内边距。1
pageBreakAfter设置或返回元素后的分页行为。2
pageBreakBefore设置或返回元素前的分页行为。2
pageBreakInside设置或返回元素内的分页行为。2
perspective设置或返回 3D 元素被查看的视角。3
perspectiveOrigin设置或返回 3D 元素的底部位置。3
position设置或返回用于元素定位方法的类型(static、relative、absolute 或 fixed)。2
quotes设置或返回嵌入引用的引号类型。2
resize设置或返回是否可由用户调整元素的尺寸大小。3
right设置或返回定位元素的右部位置。2
tableLayout设置或返回表格单元格、行、列的布局方式。2
tabSize设置或返回制表符(tab)字符的长度。3
textAlign设置或返回文本的水平对齐方式。1
textAlignLast设置或返回当 text-align 属性设置为 "justify" 时,如何对齐一个强制换行符前的最后一行。3
textDecoration设置或返回文本的修饰。1
textDecorationColor设置或返回文本修饰的颜色。3
textDecorationLine设置或返回文本修饰要使用的线条类型。3
textDecorationStyle设置或返回文本修饰中的线条样式。3
textIndent设置或返回文本第一行的缩进。1
textJustify设置或返回当 text-align 属性设置为 "justify" 时,要使用的对齐方法。3
textOverflow设置或返回当文本溢出包含它的元素,应该发生什么。3
textShadow设置或返回文本的阴影效果。3
textTransform设置或返回文本的大小写。1
top设置或返回定位元素的顶部位置。2
transform向元素应用 2D 或 3D 转换。3
transformOrigin设置或返回被转换元素的位置。3
transformStyle设置或返回被嵌套的元素如何呈现在 3D 空间中。3
transition一个用于设置或返回四个过渡属性的速记属性。3
transitionProperty应用过渡效果的 CSS 属性的名称。3
transitionDuration设置或返回完成过渡效果需要花费的时间(以秒或毫秒计)。3
transitionTimingFunction设置或返回过渡效果的速度曲线。3
transitionDelay设置或返回过渡效果何时开始。3
unicodeBidi设置或返回文本是否被重写,以便在同一文档中支持多种语言。2
verticalAlign设置或返回元素中内容的垂直对齐方式。1
visibility设置或返回元素是否应该是可见的。2
whiteSpace设置或返回如何处理文本中的制表符、换行符和空格符。1
width设置或返回元素的宽度。1
wordBreak设置或返回非 CJK 语言的换行规则。3
wordSpacing设置或返回文本中单词之间的空间。1
wordWrap允许长单词或 URL 地址换行到下一行。3
widows设置或返回一个元素必须在页面顶部的可见行的最小数量。2
zIndex设置或返回定位元素的堆叠顺序。2

如您还有不明白的可以在下面与我留言或是与我探讨QQ群308855039,我们一起飞!

三部分 附录(因为暂时不支持插入超链接所以部分内容无法显示


附录一 DIV命名规范


  • 企业DIV使用频率高的命名方法
  • 网页内容类
  • 标题: title
  • 摘要: summary
  • 箭头: arrow
  • 商标: label
  • 网站标志: logo
  • 转角/圆角:corner
  • 横幅广告: banner
  • 子菜单: subMenu
  • 搜索: search
  • 搜索框: searchBox
  • 登录: login
  • 登录条:loginbar
  • 工具条: toolbar
  • 下拉: drop
  • 标签页: tab
  • 当前的: current
  • 列表: list
  • 滚动: scroll
  • 服务: service
  • 提示信息: msg
  • 热点:hot
  • 新闻: news
  • 小技巧: tips
  • 下载: download
  • 栏目标题: title
  • 热点: hot
  • 加入:joinus
  • 注册: regsiter
  • 指南: guide
  • 友情链接: friendlink
  • 状态: status
  • 版权: copyright
  • 按钮: btn
  • 合作伙伴: partner
  • 投票: vote
  • 左右中:left right center


  • 注释的写法: /* Footer */ 内容区/* End Footer */
  • id的命名:
  • 页面结构
  • 容器: container
  • 页头:header
  • 内容:content/container
  • 页面主体:main
  • 页尾:footer
  • 导航:nav
  • 侧栏:sidebar
  • 栏目:column
  • 页面外围控制整体布局宽度:wrapper
  • 左右中:left right center

  • 导航
  • 导航:nav
  • 主导航:mainbav
  • 子导航:subnav
  • 顶导航:topnav
  • 边导航:sidebar
  • 左导航:leftsidebar
  • 右导航:rightsidebar
  • 菜单:menu
  • 子菜单:submenu
  • 标题: title
  • 摘要: summary

  • 功能
  • 标志:logo
  • 广告:banner
  • 登陆:login
  • 登录条:loginbar
  • 注册:regsiter
  • 搜索:search
  • 功能区:shop
  • 标题:title
  • 加入:joinus
  • 状态:status
  • 按钮:btn
  • 滚动:scroll
  • 标签页:tab
  • 文章列表:list
  • 提示信息:msg
  • 当前的:current
  • 小技巧:tips
  • 图标: icon
  • 注释:note
  • 指南:guild
  • 服务:service
  • 热点:hot
  • 新闻:news
  • 下载:download
  • 投票:vote
  • 合作伙伴:partner
  • 友情链接:link
  • 版权:copyright

  • class的命名:
  • 颜色:使用颜色的名称或者16进制代码,如
  • .red { color: red; }
  • .f60 { color: #f60; }
  • .ff8600 { color: #ff8600; }
  • 字体大小,直接使用”font+字体大小”作为名称,如
  • .font12px { font-size: 12px; }
  • .font9px {font-size: 9pt; }
  • 对齐样式,使用对齐目标的英文名称,如
  • .left { float:left; }
  • .bottom { float:bottom; }
  • 标题栏样式,使用”类别+功能”的方式命名,如
  • .barnews { }
  • .barproduct { }

  • 注意事项::
  • 一律小写;
  • 尽量用英文;
  • 不加中杠和下划线;
  • 尽量不缩写,除非一看就明白的单词.


  • 推荐的 CSS 书写顺序:
  • 显示属性
  • display
  • list-style
  • position
  • float
  • clear
  • 自身属性
  • width
  • height
  • margin
  • padding
  • border
  • background
  • 文本属性
  • color
  • font
  • text-decoration
  • text-align
  • vertical-align
  • white-space
  • other text
  • content

附录二 CSS精灵


  • CSS精灵原理以及应用
  • CSS雪碧的基本原理是把你的网站上用到的一些图片整合到一张单独的图片中,从而减少你的网站的HTTP请求数量。
  • 该图片使用CSS background和background-position属性渲染,这也就意味着你的标签变得更加复杂了,图片是在CSS中定义,而非<img>标签。
  • 一个简单的例子:
  • 一张图片作出一个按钮的三个状态
  • 一个链接用CSS做成按钮的样式,我们可以使用同一张图片,完成按钮的三个状态,a:link,a:hover,a:active <a class="button" href="#">链接</a>
  • 加入右侧的图片为:200px 65px的三个按钮图拼合而成的图片button.png,从上到下一次为按钮的普通、鼠标滑过、鼠标点击的状态。则可以使用CSS进行定义。
a {
 display:block; 
 width:200px; 
 height:65px; 
 line-height:65px; /*定义状态*/
 text-indent:-2015px; /*隐藏文字*/
 background-image:url(button.png); /*定义背景图片*/
 background-position:0 0;
 /*定义链接的普通状态,此时图像显示的是顶上的部分*/
}
a:hover {
 background-position:0 -66px;
 /*定义链接的滑过状态,此时显示的为中间部分,向下取负值*/
}
a:active {
 background-position:0 -132px; 
 /*定 义链接的普通状态,此时显示的是底部的部分,向下取负值*/
}
  • 更多的CSS雪碧,图片更复杂,背景定位更精确。可能会用到大量的数值
  • 如:background:url(nav.png) -180px 24pxno-repeat; 来达到更精确的定位
  • 优点:
  • 减少加载网页图片时对服务器的请求次数
  • 可以合并多数背景图片和小图标,方便在任何位置使用,这样不同位置的请求只需要调用一个图片,从而减少对服务器的请求次数,降低服务器压力,同时提高了页面的加载速度,节约服务器的流量。
  • 提高页面的加载速度
  • sprite技术的其中一个好处是图片的加载时间(在有许多 sprite 时,单张图片的加载时间)。由所需图片拼成的一张 GIF图片的尺寸会明显小于所有图片拼合前的大小。单张的 GIF只有相关的一个色表,而单独分割的每一张 GIF 都有自己的一个色表,这就增加了总体的大小。因此,单独的一张 JPEG 或者 PNGsprite 在大小上非常可能比把一张图分成多张得来的图片总尺寸小。
  • 减少鼠标滑过的一些bug
  • IE6不会主动预加载鼠标滑过即a:hover中的背景图片,所以,如果使用多张图片,鼠标滑过会出现闪白的现象。使用CSS雪碧,由于一张图片即可,所以不会出现这种现象。
  • 不足:
  • CSS雪碧的最大问题是内存使用
  • 影响浏览器的缩放功能
  • 拼图维护比较麻烦
  • 使CSS的编写变得困难
  • CSS 雪碧调用的图片不能被打印
  • 错误得使用 Sprites 影响可访问性

附录三 一些tips解决方案


页面优化实践


  • 从下面的几个方面可以进行页面的优化:
  • 减少请求数
  • 图片合并
  • CSS文件合并
  • 减少内联样式
  • 避免在 CSS中使用 import
  • 减少文件大小
  • 选择适合的图片格式
  • 图片压缩
  • CSS 值缩写(Shorthand Property)
  • 文件压缩
  • 页面性能
  • 调整文件加载顺序
  • 减少标签数量
  • 调整选择器长度
  • 尽量使用CSS 制作显示表现
  • 增强代码可读性与可维护性
  • 规范化
  • 语义化
  • 模块化

写DIV+CSS 的一些常识


  • 不要使用过小的图片做背景平铺
  • 这就是为何很多人都不用 1px 的原因,这才知晓。宽高 1px 的图片平铺出一个宽高 200px 的区域,需要 200200=40, 000 次,占用资源
  • 无边框
  • 推荐的写法是 border:none;,哈哈,我一直在用这个。 border:0; 只是定义边框宽度为零,但边框样式、颜色还是会被浏览器解析,占用资源
  • 慎用 通配符
  • 所谓通配符,就是将CSS 中的所有标签均初始化,不管用的不用的,过时的先进的,一视同仁,这样,大大的占用资源。要有选择的初始化标签。
  • CSS的十六进制颜色代码缩写
  • 习惯了缩写及小写,这才知道,原来不是推荐的写法,为的是减少解析所占用的资源。但同时会增加文件体积。孰优孰劣,有待仔细考证。
  • 样式放头上,脚本放脚下。不内嵌,只外链
  • 坚决不用 CSS表达式
  • 使用 引用样式表,而不是通过@import 导入。
  • 一般来说,PNG比 GIF 要小,小得多。再者,GIF 中有多少颜色是被浪费的,很值得优化。
  • 千万不要在 HTML中缩放图片,一者不好看,二者占资源。
  • 正文字体最好用偶数
  • 12px、14px、16px,效果非常好。特例,15px。
  • block、ul、ol等上下留出至少一倍行距,左侧至少两倍行距,右侧随意。
  • 段落之间,至少要有一倍行距
  • 强行指定某些元素的 line-height,正文 1.6倍于文字大小,标题1.3倍。
  • 中文标点用全角
  • 英文夹杂在中文中,左右空格,半角。
  • 中文字体的粗体和斜体,远离较好

常用代码片段


  • 雅虎工程师提供的CSS初始化示例代码【仅供参考】
  • 可以在html头文件中直接引用,从而避免浏览器的不兼容带来的错误。
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; 
}
  • mobile meta标签
<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;
  • 清除浮动的几种方法
  • 方法一:投机取巧法 – 不推荐
  • 直接一个放到当作最后一个子标签放到父标签那儿,此方法屡试不爽,兼容性强
  • 方法二:overflow + zoom方法 –不推荐
  • .fix{overflow:hidden; zoom:1;}
  • 此方法优点在于代码简洁,涵盖所有浏览器
  • 方法三:after + zoom方法 -推荐–此方法可以说是综合起来最好的方法了
  • clearfix只应用在包含浮动子元素的父级元素上
.fix{zoom:1;}
.fix:after{
 display:block; 
 content:'clear'; 
 clear:both;
 line-height:0; 
 visibility:hidden;
}
  • 更多代码片段详情
  • 实用的60个CSS代码片段

一些总结


  • 自动继承属性:
  • color
  • font
  • text-align
  • list-style
  • 非继承属性:
  • background
  • border
  • position
  • 具有破坏性的元素:
  • float
  • display:none;
  • position:absoblute/fixed/sticky;
  • 具有包裹性的元素:
  • display:inline-block/table-cell
  • position:absolute/fixed/sticky
  • overflow:hidden/scroll
  • 消除图片底部间隙的方法
  • 图片块状化-无基线对齐
  • img{display:block;}
  • 图片底线对齐
  • img{vertical-align:bottom;}
  • 行高足够小 - 基线位置上移
  • .box{line-height:0;}

一些概念


  • BFC
  • BFC全称”Block Formatting Context” 中文为“块级格式化上下文”
  • 记住这么一句话:BFC元素特性表现原则就是,内部子元素再怎么翻江倒海,翻云覆雨都不会影响外部的元素
  • BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此
  • 优雅降级(graceful degradation)
  • 一开始就构建完整的功能,然后再针对低版本浏览器进行兼容
  • 渐进增强 progressive enhancement:
  • 是在浏览器开启JavaScript功能后,如果浏览器版本不支持某些 JavaScript 能力,我们解决这种问题的方式
  • 平稳退化
  • 是在浏览器没有JavaScript功能,或没有开启JavaScript功能情况下,我们解决这种问题的方式;

学习从来不是一个人的事情,要有个相互监督的伙伴,想要学习或交流前端问题的小伙伴可以私信“学习”小明加群获取2019web前端最新入门资料,一起学习,一起成长!

理 | 苏宓
出品 | CSDN(ID:CSDNnews)

有些人玩游戏,是为了寻求刺激;有些人玩游戏,是为了休闲安静地打发时间。二者的感受如何才能兼得,近日,苏格兰爱丁堡的一位开发者 Anslo 潜心开发了 16 个月,发布了一款名为 《Slow Roads》(slowroads.io)的免费、轻松的驾驶游戏,可以让玩家在电脑上体验《速度与激情》的感觉,还能欣赏由程序自动生成的优美风景。此外,这款游戏可以直接在浏览器中运行,无需登录或者安装,对于玩家而言,即开即玩。


玩法


《Slow Roads》一经推出之后,便受到了不少玩家的关注和试玩。和传统驾驶类游戏有所不同,这款游戏在玩法和技术实现上有着巨大的差异。

首先,在游戏玩法上,它没有撞车、没有失败更没有输赢。随着汽车的行驶,道路会一直在延伸,风景秀丽的景观在身边飞驰,最为值得关注无论是春夏秋冬,还是白天、傍晚、黑夜,亦或是森林、沙漠、环山,场景都可以一键“无缝切换”。

另外,驾驶的车也可以切换为轿车、长途汽车、自行车。

如果你的方向盘偏离了道路,也可以按一下「R」键将车重新定位到快速道上,甚至道路也是可以选择的。当然,如果你愿意,还可以驾驶越野车或者体验一下水下行驶的感觉。

当然,玩累了,还可以开启自动驾驶模式。

同时,这款游戏的操作也非常简单,W 键或向上箭头是加速,S 键或向下箭头是刹车。A 键和 D 键(或左右箭头)控制转向;玩家也可以通过按住 Shift 或双击 W 键来升级汽车;C 键可改变摄像机角度,Q 键和 E 键在可用的天气和照明条件下循环。如果你不喜欢键盘控制,也可以改用基于鼠标的转向。

在技术实现上,与使用传统游戏引擎开发的游戏不同,Anslo 表示,《Slow Roads》使用了 three.js 的 3D JavaScript 库构建,可直接在 Chrome、Firefox、Safari 和 Edge 浏览器中运行。与此同时,上述的场景切换都是由程序自动生成,通过技术实现,可以动态生成无限地图和处理事务。这是一个相当复杂且有趣的技术演示。用开发者 Anslo 自己的话来形容,「该游戏的实验正在挑战浏览器游戏的合理边界」。

接下来,我们不妨一起来看一下具体的技术原理。


技术实现


事实上,这一款游戏的制作不仅需要深厚的开发功底,也需要有设计、物理学等知识储备。在《Slow Roads》中,作者首先通过生成一个高度图,采用了类似于 Perlin 噪声的算法,并进行了修改优化,从而实现更真实的山丘景观。

继而使用一个 npm 包 Alea(https://www.npmjs.com/package/alea)用作 PRNG(伪随机数生成器,Preudo Random Number Generator),用于复制和粘贴实现。

当完成第一步开发之后,第二步便是进行车子行驶的道路规划。Anslo 选择采用了以下步骤:

  • 选择地图中一个不太陡峭、不太深的地方,作为行驶的起点。同时,这也是道路中线的第一个点。

  • 进而选择一个方向,并测量周围的高度图,以此评估横向和纵向的坡度。

  • 然后,道路中线最好是能向坡度下滑的方向移动 10 米。点被编码在一个双向链表中,每个点都使用元数据(如坡度、道路宽度和曲率)注释。

  • 上面这个过程是会一直重复的(以从车辆位置开始的 15 公里的地平线为界),但注意行驶的车道不要有自相交的情况,这也是游戏中道路规划最难的地方。

  • 中线点的高度用一个 9 个点的窗口进行追溯平滑,以避免海拔的突然急剧变化。

  • 在一个较短的地平线上,大概 10 米的中线被用二次贝塞尔曲线以 1 米的分辨率进行平滑点的注释。

当道路规划完成之后,第三步便是渲染环境。这里可以使用一个 5x5 的大粗网格(这款游戏中,作者采用的是 10 米的分辨率和 1 公里的最大视距)来渲染大型场景。这被称之为“远网格”。

在靠近道路的地方,是一个由更细的 5x5 网格组成的,每个网格拼接到一起,沿着道路中线行进,形成一个连续的 "走廊"。这就是 "近网格",从车辆的位置向前生成一个固定的水平线。

同时,远处网格现在重叠的顶点被粗略地 "隐藏 "起来,把它们沉到几米以下。

然后离道路中线接近的地方,在道路的高度和底层环境的高度之间插值,以实现无缝过渡。

除了以上,Anslo 还采用了一个额外的 3x3 网格,渲染离道路中线更近的地方,优化细节,实现更精细的体验。

在图形细节中,这名开发者在游戏中的地面纹理使用世界坐标的 UV,并与 perlin 噪声混合,以改变的颜色。另外,在树叶地图下应用了一个暗色的纹理,用来产生树影的感官。

正如上文所述,这款游戏还采用了一些物理学的基础知识,如汽车每个轮子的动力学都是独立计算的,使用围绕重力、表面摩擦力和地面法线的常规运动学方程式。


最后


目前这款游戏已经基本完成,不过,Anslo 认为也还有不少需要优化的地方,后续可能会改善天气效果、更多的车辆类型和控制器支持。

作为一款没有使用如 Unity、UE5 等游戏引擎,而仅是使用了 JavaScript 实现的游戏而言,它的轻量级获得了不少好评:

  • 火星地图很有趣。另外,我发现汽车在倒挡时候可以同样快!

  • 如果能教会自动驾驶漂移会很酷。

  • 现在的我没有驾照,但是也能通过浏览器获得驾驶通信证了,荣誉!

  • 期待后续可以加上背景音乐!

有不少网友感叹似乎回到了高中时期玩《Geep Simulator》的年代。不过,目前《Slow Roads》暂时还没有开源版本的计划,但作者表示将来不排除有这种可能性。同时根据游戏的页面显示,Anslo 称正在致力于保持《Slow Roads》免费提供且没有广告,「享受这作为逃离资本主义的喘息之机」。

试玩地址: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