查错工具Bootlint

CSS检查工具Bootlint,它是bootstrap官方提供的一个js工具库,用于检测使用Bootstrap的页面中常见的HTML错误、class使用方式的错误,通常这些错误浏览器是检查不出来的。

使用过程中发现,这玩意儿似乎不能指出错误位置,略不爽。

使用时机: 开发、测试阶段

用法:在页面底部写入引入bootlint的脚本:

<script>
    (function () {
        var s = document.createElement("script");
        s.onload = function () {
            bootlint.showLintReportForCurrentDocument([]);
        };
        s.src = "js/bootlint.js";
        document.body.appendChild(s)
    })();
</script>

错误积累

1.
Bootstrap经典错误:

bootlint:  E027  `.table-responsive` is supposed to be used on the table's parent wrapper `<div>`, not on the table itself

table-responsive属性是用于table的父元素而不是用于table元素的

  1. glyphicon图标字体所加的元素必须是一个空元素,否则报错:

    ootlint:  E031  Glyphicon classes must only be used on elements that contain no text content and have no child elements.
    

3.

bootlint:  W012  `.container` or `.container-fluid` should be the first child inside of a `.navbar`
 jQuery.fn.init[1]

4.
如果没有panel-collapse样式,会报错:

<div id="c1" class="collapse panel-collapse">
    <div class="panel-body">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Consequatur odio officiis quae quis sit veritatis voluptates. At atque beatae, cum distinctio, dolor eaque eos eveniet ex, exercitationem inventore iure totam?</div>
</div>

5.轮播图内部只允许有一个子元素样式为carousel-inner:

bootlint:  E041  `.carousel` must have exactly one `.carousel-inner` child.
 jQuery.fn.init[1]

6.

7.轮播没写id:

bootlint:  W014  Carousel controls and indicators should use `href` or `data-target` to reference an element with class `.carousel`.
 [a.carousel-control.left, context: a.carousel-control.left, jquery: "2.1.3", constructor: function, selector: "", toArray: function…]
bootlint.js:11521 bootlint:  W014  Carousel controls and indicators should use `href` or `data-target` to reference an element with class `.carousel`.
 [a.carousel-control.right, context: a.carousel-control.right, jquery: "2.1.3", constructor: function, selector: "", toArray: function…]

8.轮播下边的小列表没加轮播的id:

bootlint:  W014  Carousel controls and indicators should use `href` or `data-target` to reference an element with class `.carousel`.

1.插件——概述

Bootstrap基于jQuery提供了十几个插件函数(类似于jQueryUI插件库),每个插件对应一个.js文件,可以单独引用,也可以整体引用(bootstrap.js)。
调用上述十几个插件可以用两种格式:

  1. 传统的JS方式调用: $(...).dropdown(); $().tab(...);
  2. 使用data-*扩展属性方式调用: <a data-toggle="dropdown">

2.插件——下拉菜单

  1. $().dropdown( );
  2. <a data-toggle="dropdown">

3.插件——标签页(tab)

  1. $().tab();
  2. <a data-toggle="tab">

4.插件——Bootstrap提供的弹出框

(1)工具提示框(tooltip)
data-toggle="tooltip"

(2)弹出框(popover)
data-toggle="popover"

(3)警告框(alert) —— 常见

<div class="alert  alert-四种颜色 alert-dismissible">
    <span class="close" data-dismiss="alert">&times;</span>
    xxxx
</div>

(4)模态对话框(modal) —— 常见

模态框定义:在父窗体中弹出一个子窗体,子窗体若不关闭,父窗体就无法获得焦点,同时父子窗体间还可以传递数据。window.alert()/confirm()/prompt()就是典型例子。模态框必需的结构:

<div class="modal">                   <!--半透明的黑色遮罩层-->
  <div class="modal-dialog">         <!--宽/定位-->
<div class="modal-content">     <!--边框/背景色/阴影-->
  <div class="modal-header">头部</div>
  <div class="modal-body">主体</div>
  <div class="modal-footer">尾部</div>
</div>
  </div>
</div>

显示一个模态框:

  1. <a href="#模态框ID" data-toggle="modal">
  2. <button data-toggle="modal" data-target="#模态框ID">

5.插件——折叠效果(collapse)

触发一个折叠效果:

  1. <a href="#折叠元素ID" data-toggle="collapse">
  2. <button data-toggle="collapse" data-target="#折叠元素ID">

    in样式效果:

    <div id="折叠元素ID" class="collapse in"></div>

折叠组件的两个扩展用途:

  1. Accordion(手风琴)
  2. 响应式导航条在手机屏幕中的效果

6.插件——轮播广告(carousel)——比较重要

本身结构较复杂,编写时只需要记住根class: .carousel

<div class="carousel">
  <div class="carousel-inner">
      <div class="item active">
          <img>
      </div>
  </div>
</div>

7.插件——附加导航(Affix)

<div data-spy="affix" data-offset-top="100">
    <ul class="nav nav-pills">
</div>

9.插件——滚动监听(scrollspy)——比较好玩

随着页面内容的滚动,某个导航中的项目,会自动的更改.active位置。
实现思路:

  1. 页面中必须首先有一个导航菜单(.nav)——其中可以定义一个菜单项为.active
  2. 导航菜单中的超链接的href属性值必须和页面中的某个锚点名一样
  3. 为页面添加滚动事件的监听函数
body.onscroll= function(){
    if(body滚动的距离 === 某个锚点距离顶端的距离){
        此锚点对应的超链接的父元素li添加.active;
    }
}

Bootstrap全局CSS之栅格布局系统

WEB开发中页面布局方式演进:

  1. Table布局
  2. CSS+DIV布局
  3. Bootstrap栅格布局系统

栅格系统特点

  1. 所有的行必须放在容器中:.container或者.contain-fluid
  2. 分为多行,一行平均分为12个col;
  3. 网页内容只能放在col中,不能直接放在row中

.container的宽度问题:

  • 超大屏,屏宽>1200px():容器宽1170px
  • 普通大屏,屏宽>992px():容器宽950px
  • 小屏,屏宽>768px():容器宽750px
  • 超小屏,屏宽<768px():容器宽auto

.container-fluid的宽度问题:

  • width永远100%

Bootstrap布局的特点是什么?

  1. 宽度做了媒体查询,适应不同的屏幕;
  2. 添加了前置和后置内容生成,可防止子元素margin越界、浮动造成的影响;

回顾CSS的经典问题一:父元素下第一个子元素的margin-top越界问题以及末个子元素margin-bottom的越界问题?

  1. 为父元素加边框,防止子元素延伸。副作用是边框;
  2. 将margin换做padding;副作用是padding-top的值要加padding;
  3. 父元素overflow,副作用是将溢出部分隐藏掉可能不满足需求;
  4. 将父元素的第一个元素之前加一个无高度的display:table元素,无副作用!!!

    .parent:before{
        content:' ';
        display:table;
    }
    

回顾CSS的经典问题二:如何解决所有子元素浮动以后,父元素高度为0的问题?

  1. 为父元素设置固高,副作用:如果子元素是动态数据,没法确定子元素高;
  2. 为父元素指定overflow:hidden;副作用:
  3. 为父元素添加后置内容生成选择器,无副作用。

    .parent:after{
        content:' ';
        display:table;
        clear:both;
    }
    

1. 什么是响应式网页?

塞班、黑莓时代的手机浏览器只适合由WML(HMTL的子集)编写的功能简单的wap页面,若浏览HTML编写的页面,只能看到按比例强行缩小的页面,无法正常浏览。

到了2010年5月提出,有前端设计师提出了响应式概念。网页内容能够随着显示设备的尺寸而调整布局,优化用户浏览体验。

响应式设计特点

  • 流式网格布局(Fluid:流式、流动式、液态)
  • 可伸缩的图片和文字
  • CSS3 Media Query

    2. 如何编写响应式网页?

  1. 设置viewport标签

    IOS率先入了viewport视口/视窗概念,用于显示网页的内容的一个逻辑概念,其宽度/高度都可以任意指定,可以大到2000px都可以,网页不是仅仅显示在物理窗口,而是显示视口中——就可以实现大网页不经缩放,直接显示在手机中——只是需要用户左右滑动窗口即可。后来Android也引入了该概念。举个栗子:

    <meta name="viewport" content="width=100%,initial-scale=1.0,user-scalable=no"/>
    

    解释:

    • name固定为viewport
    • content属性中有以下属性:

      • width 通常不要用绝对宽度,因为要自适应
      • initial-scale 初始缩放比例
      • user-scalable 是否允许用户缩放

  2. 避免使用绝对单位(px),使用相对单位(%、auto、em)

  3. 使用流式定位:float
  4. 图片大小实现自适应
    • img{width:80%}//图片宽始终占父容器宽度的80%
    • img{max-width:80%}//图片最大宽度占父容器宽度的80%;若缩小,效果与width无异;但若放大超过自身大小就停止放大,保持自身大小,保持分辨率
  5. 使用CSS3的媒体查询,根据浏览器屏幕的特征,有选择性地执行某些CSS样式。而且严格来说,使用媒体查询之后,前四条均可不必遵循。

3. 介绍一下 MediaQuery 媒体查询

Media:指浏览网页的设备,指浏览网页的设备,如screen(pc/pad/phone)、print、tv、projection、屏幕阅读器…..

Query:查询出当前浏览设备的特性,如类型、宽度、高度、分辨率、色彩位深、方向Orientation(Landscape/Portrait),根据这些特性,执行特定的CSS样式。

用法一:在link元素中使用media属性

<link media="screen and (min-width:990px)" rel="stylesheet" href="css/pc.css"/>
<link media="screen and (max-width:989px) and (min-width:768px)" rel="stylesheet" href="css/pad.css"/>
<link media="screen and (MAX-width:767px)" rel="stylesheet" href="css/phone.css"/>

上边三个link标签分别适配了三种不同的设备,能够自动识别设备屏幕尺寸从而自动执行。(缺点:)但是如果打开F12 NetWork就会发现,虽然当前只会有一种设备的条件被满足,即只执行了其中一个CSS文件,但是3个CSS文件全部被浏览器请求到客户端加载,性能不好,所以这种用法并不常用。

用法二:在样式表中嵌入@media注解

body{
    font-family:"Microsoft YaHei";
    margin: 0;
}


@media screen and (min-width:990px){
    /**屏幕宽度大于990px*/
    h1 {
        font-size:3em;
        border-bottom: 3px solid #ccc;
    }

    .box{
        border:1px solid #3a3;
        background: #dfd;
        color: #282;
        padding:8px;
    }
}

@media screen and (min-width:767px) and (max-width:989px){
    h1 {
        font-size:2em;
        border-bottom: 3px solid #ccc;
    }

    .box{
        border:1px solid #a33;
        background: #fdd;
        color: #822;
        padding:6px;
    }
}


@media screen and (max-width:767px){
    /*h1 {*/
        /*font-size:1.5em;*/
        /*border-bottom: 3px solid #ccc;*/
    /*}*/
    h1 {
        display:none;
    }

    .box{
        border:1px solid #33a;
        background: #ddf;
        color: #228;
        padding:4px;
    }
}

:media属性在样式切换时,并不是覆盖,而是未生效的css并没有被执行。

4. 如何测试响应式网页?

  1. 使用真实物理设备——效果可靠但任务量太大
    • 局域网:只要手机/平板/PC在同一个局域网(联同一个wifi)即可通过局域网IP访问
    • 互联网:免费或试用主机/云主机可实际测试,阿里云、SAE等
  2. 使用第三方工具测试
  3. 浏览器自带模拟器,F12调试工具。
    • 优势:可以模拟常见的设备、网速、经纬度、加速度….
    • 不足:效果有待进一步的验证

Tip:ChromeF12中按ESC,选择emulation标签,可以配置网络、触屏、经纬度和3D,重力加速度等等效果

5. 响应式设计的优缺点

优点:

  • 跨平台
  • 节省开发升本
  • 表现力一致

    缺点:

  • 为了照顾到所有屏幕,自由度低,局限性大
  • 代码冗余,加载较慢
  • 浏览器兼容性问题,低版本的IE内核会跪,用第三方兼容脚本又增加负载

这里是知乎上有人给出的响应式设计优缺点答案


参考:觉唯设计有一篇文章讲得很好《响应式设计这点小事儿》

缘起

今天本地运行hexo博客的时候,突然Chrome访问localhost:4000打不开了,一直在那儿转圈儿圈儿,换了FF也一样。问题是今天早些时候还好好的,也没想起这期间有什么特别的动作。

尝试

瞅那家架势跟tomcat的8080访问不了很像,第一反应怀疑是不是我开什么软件把4000端口给占了,那我改个端口好了,找到这个文件:

E:\hexo\node_modules\hexo-server\index.js

找到hexo.config.server配置项,port参数改为4400,果然正常启动了。

追根

好吧,这下我想知道是何方神圣占用了4000,看看这家伙什么来头,优先级多高,需不需hexo要给它让道。
CMD命令:

netstat -ano

果然有个进程在占用4000端口,进程号6616。于是在任务栏右键启动任务管理器找,可是找半天发现win8任务管理器下进程选项卡的查看菜单中好像没有显示进程ID的选项,好吧,这个命令不太熟,百度之:

tasklist /fi "pid eq 6616"

进程名FoxitProtect.exe,瞅那名字就知道是福昕阅读器,还是个service,进入服务列表查看它属性,启动方式居然是手动!

宣判

问题是我今儿没用福昕阅读器啊,根据其服务描述“福昕阅读器的服务项,提供内容与产品更新等服务”怀疑是程序更新搞的,果断停掉!给我大Hexo端口号改回4000(因为机器上装了xampp,所以就不把80让给hexo了),然后回到git bash,Ctrl+c快捷键停掉服务,然后hexo service命令启动服务,访问localhost:4000OK!