1.0 HTML/CSS 优化--《高效前端》学习笔记

切图的三个境界:

  • 长得好看
  • 灵活
  • 友好的交互

高效前端1:能用 HTML/CSS 解决的问题就不要用 JS

导航高亮

给不同页面添加不同类,标识不同页面,然后设置当前页面样式,覆盖掉默认样式。

演示-导航高亮

显示代码

自己的想法:这种方式虽然好,但是,需要为每个导航都写一个默认和高亮样式,如果不是同一个人写的代码,在新增导航的时候,很容易会忘记去加上。

看到后面的时候,发现书中有这个问题相关的回答,可以用 sass 进行 for 循环实现。同时,还可以定义主题色变量。

鼠标悬浮时显示

hover 到某个菜单时,显示子菜单。

演示-使用相邻元素

显示代码

自己的想法:书中提到,可以通过 absolute 给 .menu 定位,我想了好久,都想不出来怎么实现,如果有实现方法的,请告知,谢谢!

对上面的 demo 做了布局的改变,现在可以简单的通过 absolute 来定位了,参考:

演示-使用相邻元素-改变布局

显示代码

演示-使用相邻元素-改变布局- hover 和 mouse 事件 同时存在

显示代码

可以看到,加了 mouse 事件后,鼠标悬浮后,会在元素的 style 中加上 display: none;,导致 css 中的样式失效:

img

意外情况:移动端 Safari 上,触摸会触发 CSS 的 hover,hover 会很高概率地先于 touchstart 事件,此时会判断当前是显示还是隐藏状态,由于 CSS 的 hover 发挥了作用,所以判断为显示,然后又把它隐藏了。也就是说,点一次不出来,要点两次。所以最好别两个同时写。

演示-使用子元素

显示代码

使用子元素的话,hover 可直接加在父容器上,隐藏元素本身不需要加 hover。

自定义 radio/checkbox 的样式

可以使用 :checked 代替鼠标点击事件。

演示-自定义 radio/checkbox

显示代码

使用 :checked 属性时,要注意兼容性

img

多列等高

padding 补偿法

设置一个很大的 padding-bottom,这样容器被最大的子元素撑开时,其他的子元素使用可以用 padding-bottom 来补偿缺少的高度。然后设置一个同方向的 margin-bottom 负值,可以抵消设置的 padding-bottom。 同时设置父容器的 overflow: hidden;,将多余的部分裁剪(隐藏)掉。

演示-多列等高-padding

苹果

苹果,是水果中的一种,是蔷薇科苹果亚科苹果属植物,其树为落叶乔木。

香蕉

香蕉(学名:Musa nana Lour.)芭蕉科芭蕉属植物,又指其果实,热带地区广泛种植。

水蜜桃

水蜜桃(学名:Prunus persica 、meltingfleshed peach):蔷薇科、桃属植物。南方品种群中肉质柔软多汁呈软溶质的一类品种。果实顶部平圆,熟后易剥皮,多粘核。

菠萝

菠萝(学名:Ananas comosus),是热带水果之一。

显示代码

缺点:底部的 border 没有了,底部圆角也不显示了。

table 布局

table 中的每个 td 都是等高的,所以可以设置容器 display: table;,设置里面的子元素 display: table-cell;。将子元素的宽度设大点,可以实现等分。

演示-多列等高-table

苹果

苹果,是水果中的一种,是蔷薇科苹果亚科苹果属植物,其树为落叶乔木。

香蕉

香蕉(学名:Musa nana Lour.)芭蕉科芭蕉属植物,又指其果实,热带地区广泛种植。

水蜜桃

水蜜桃(学名:Prunus persica 、meltingfleshed peach):蔷薇科、桃属植物。南方品种群中肉质柔软多汁呈软溶质的一类品种。果实顶部平圆,熟后易剥皮,多粘核。

菠萝

菠萝(学名:Ananas comosus),是热带水果之一。

显示代码

注意:虽然 table 布局可以实现等分,但是有一种情况需要注意,就是英文单词很长,没有设置 word-break 的时候,这种情况是不会自动等分的。

这种布局的另一个好处,就是可以在媒体查询时,实现响应式。

可以尝试拉伸屏幕,观察下面的布局变化。(大屏显示每行四列,中屏显示每行两列,小屏显示每行一列。)

演示-多列等高-table-响应式

苹果

苹果,是水果中的一种,是蔷薇科苹果亚科苹果属植物,其树为落叶乔木。

香蕉

香蕉(学名:Musa nana Lour.)芭蕉科芭蕉属植物,又指其果实,热带地区广泛种植。

水蜜桃

水蜜桃(学名:Prunus persica 、meltingfleshed peach):蔷薇科、桃属植物。南方品种群中肉质柔软多汁呈软溶质的一类品种。果实顶部平圆,熟后易剥皮,多粘核。

菠萝

菠萝(学名:Ananas comosus),是热带水果之一。

显示代码

可以看到,从一行两列布局拉伸到宽屏时,.tr 的 display: none; 不起作用了。因为 table 布局已经计算好了。要解决这个问题,需要借助 JavaScript。

演示-多列等高-flex

苹果

苹果,是水果中的一种,是蔷薇科苹果亚科苹果属植物,其树为落叶乔木。

香蕉

香蕉(学名:Musa nana Lour.)芭蕉科芭蕉属植物,又指其果实,热带地区广泛种植。

水蜜桃

水蜜桃(学名:Prunus persica 、meltingfleshed peach):蔷薇科、桃属植物。南方品种群中肉质柔软多汁呈软溶质的一类品种。果实顶部平圆,熟后易剥皮,多粘核。

菠萝

菠萝(学名:Ananas comosus),是热带水果之一。

显示代码

根据个数显示不同样式

需求:

例如有 1 ~ 3 个 item 显示在同一行,但 item 的个数不一定,如果只有 1 个,那 item 占宽 100%;如果有 2 个,每个占 50%;如果有 3 个,每个占 33%。

:nth-last-child(an+b) 这个 CSS 伪类匹配文档树中在其之后具有 an+b-1 个兄弟节点的元素,其中 n 为正值或零值。它基本上和 :nth-child 一样,只是它从结尾处反序计数,而不是从开头处。MDN

演示-根据个数显示不同样式1

  • 一行 1 个
  • 一行 2 个
  • 一行 2 个
  • 一行 3 个
  • 一行 3 个
  • 一行 3 个
显示代码

需要注意的是,如果 item 有 border,这样设置是不行的,因为 border 也会占据一定的宽度。设置一下 box-sizing: border-box; 即可。

需求:

手机屏幕比较小,左边图标比较多,一行排不下,把右边的电话换行,隐藏竖线。(左边图标个数不定)

感觉需求描述不完整,想象不出这种场景,无法实现代码。

演示-根据个数显示不同样式2

  • Phone: 12345678
显示代码

使用表单提交

请求提交方式:

  • AJAX
  • 表单提交

假设:

首页有一个搜索的表单,单击 SEARCH 跳到列表页。

演示省略...

自动监听回车事件

略...

巧用 CSS3 伪类(pseudo class)

  • :focus
  • :invalid

演示-CSS3 伪类

利用 :focus 伪类实现 focus 时,放大镜颜色加深。

利用 :invalid 伪类进行校验。

Next
显示代码

其他

需求:

hover 时显示提示信息。不想用 title,也不想用 JavaScript,更不想引入第三方库。

演示-attr

Hello FED

显示代码
Last Updated: 6/2/2019, 12:44:39 PM