Effective前端1---chapter 1 HTML/CSS优化

最近在读高效前端:web高效编程与优化实践,借此本书的感觉总结下前端代码与性能优化,纯属本身看法,若有错误,欢迎指出。css

1.能用HTML/CSS解决的问题就不要用js

场景1:鼠标悬浮时显示

鼠标悬浮在菜单上时,显示子菜单。html

实现思路:刚开始隐藏掉子菜单,信息框做为hover目标的子元素或者相邻元素,才方便使用CSS控制。前端

.menu{
    display:none;  
} 

当导航hover时结合相邻选择器,把子菜单显示出来;web

.find:hover + .menu{
     display:list-item;
}
//保证menu自己在hover的时候也要显示,
.menu:hover{
  display:list-item;
}

.menu菜单的位置可使用绝对定位显示在你想要显示的位置。编程

场景2:自定义radio/checkbox的样式

在咱们使用原生的单选或者复选框时,不能知足咱们的需求时,须要本身定制其样式。移动web开发

两种方法:(1)使用label元素的绑定选中,修改其样式浏览器

<label for="checkbox_1">
        <input type="checkbox" id="checkbox_1">
        <span class="checkbox"></span>
        HELLO WORLD
</label>
       /**
            复选样式(使用label选中)
        */
        label{
            cursor: pointer;
            display: block;
        }
     //隐藏input label input[type=checkbox]{ display: none; }
     //使用span的样式代替原生input样式 label input[type="checkbox"] + .checkbox{ box-sizing: border-box; display: inline-block; width: 16px; height: 16px; border: #ccc 1px solid; border-radius: 3px; position: relative; top: 2px; } input[type=checkbox]:checked + .checkbox{ border: #307bb5 1px solid; background-color: #307bb5; } input[type=checkbox]:checked + .checkbox::after{ content: '✔'; position: absolute; top: -3px; left: 1px; color: #fff; transition: all 0.3s linear; font-size: 14px; }
      /**
            单选样式(使用label选中)
        */
        label input[type=radio]{
            display: none;
        }
        label input[type="radio"] + .radiobox{
            box-sizing: border-box;
            display: inline-block;
            width: 16px;
            height: 16px;
            border: #ccc 1px solid;
            border-radius: 50%;
            position: relative;
            top: 2px;
        }
        input[type=radio]:checked + .radiobox{
            border: #307bb5 1px solid;
            background-color: #307bb5;
        }
        input[type=radio]:checked + .radiobox::after{
            content: '';
            width: 6px;
            height: 6px;
            background-color: #fff;
            border-radius: 50%;
            position: absolute;
            top: 4px;
            left: 4px;
            color: #fff;
        }

上述作法必需要保证label绑定对应input的值,不然不会生效;性能优化

效果以下图:app

(2)直接使用input的伪类实现ide

<input type="checkbox" id="">
//隐藏原生复选框样式       
input[type=checkbox]{ appearance: none; -webkit-appearance: none; outline: none; margin: 0; /* 将 */ position: relative; top: 2px;
}
//显示的复选框样式 input[type=checkbox]:after { box-sizing: border-box; display: block; content: ""; width: 16px; height: 16px; background: #fff; border-radius: 3px; border: 1px solid #aaa; }
//选中后复选框样式 input[type=checkbox]:checked:after{ box-sizing: border-box; border: #307bb5 1px solid; background-color: #307bb5; text-align: center; content: '✔'; color: #fff; transition: all 0.3s linear; font-size: 12px; position: relative; top: -2px;
}

效果以下:

此种方法的好处就是不须要多余的标签,能够实现改变原生样式。可是也存在一个小问题,感兴趣的小伙伴能够去试一下。(以上content里用到的对号是搜狗输入法的特殊符号)

场景3:使用表单提交

表单提交存在两种方式,一个AJAX,另外一种是表单提交。以下:若是点击搜索按钮后要跳转到列表页,咱们就可使用表单提交

<form action="/search" id="search-form">
        <input type="search" name="keyword">
        <input type="email">
</form>

把全部的字段的名字写在input的name里面,而后form的action做为搜索页的连接,这样就能够实习那不用一行js实现搜索跳转。

若是须要表单验证的话,那就监听submit事件作验证,验证经过后调用原生表单元素的submit函数就能够实现表单提交,不须要手动获取form的值。

场景4:巧用CSS3伪类元素

CSS3的伪类提供了状态切换特性,除了以上实现的单选复选样式的:checked以外,还有focus,invalid等等。以下:

input获取焦点后,width发生改变。

实现:

.search{
    width:100px;  
}
//input获取焦点后样式 input[type=search]:foucs + .search{ width:200px; }

还有一些输入框输入不合法时,例如提交按钮置灰,下一步按钮置灰等等操做,可使用input的type和pattern等属性约束合法性,而后触发:invalid,实现以上操做。

场景5:用CSS3的attr属性实现简单的tooltip效果

当要实现一个hover的时候显示提示信息,若是使用title属性以为效果很差看,又不想使用JS写,这时可使用CSS3的attr属性实现。

<p>
      hello,
      <span data-title='Effective Frontend Development'>EFED</span>
 </p>
 span[data-title]{
         position: relative;
 }
//定义显示框的样式 span[data-title]:hover::before{ content: attr(data-title); position: absolute; top: 150%; left: 50%; transform: translateX(-50%); white-space: nowrap; border: 1px solid #ccc; padding: 5px 10px; border-radius: 5px; }

效果以下图:另外,你也可使用after画一个三角形,指向要显示的元素位置。

 

 JS是万能的,几乎能够作任何事情,但有时候会显得笨拙,咱们要学会在JS/HTML/CSS之间选择适合的开发形式,尽量的简化开发,提高本身。

另外,这样的场景还有不少,像自动监听回车事件用于提交,导航悬浮,多列等高等等,这里就再也不赘述。

 2.HTML语义化(优化HTML标签)

HTML5提供了许多语义化标签,每一个标签都有相应的做用,浏览器会根据不一样语义做出相应的反应。

就像input标签,在移动web开发的是,不一样type值,会调用不一样的键盘,以下:

不一样的标签表明有着不一样的做用:

div: 做为一个普通的容器使用;

section:做为一个普通的章节使用;

article:适用于独立性比较强的内容,如网页的主题就可使用article标签;

nav:适用于导航内容;

aside:用做和页面主题相关的容器,像侧边栏,评论等辅助的元素

相关文章
相关标签/搜索