DPI、DPR、屏幕尺寸等释义

物理分辨率 & 设备分辨率 (Device resolution)
单位:
像素密度 DPI ( Dots per inch ),单位像素/尺寸。是打印机、鼠标等设备分辨率的单位。
 
一平方英寸面积内像素的多少。dpi越小,扫描的清晰度越低,由于受网络传输速度的影响,web上使用的图片都是72dpi。
 
冲洗照片不能使用这个参数,必须是300dpi或者更高350dpi。
 
 
屏幕尺寸:
是指屏幕对角线的尺寸,一般用英寸来表示。1英寸=2.54厘米
 
设备像素比 DPR( devicePixelRatio ):
提供了设备像素个数和理想视口的比。
浏览器厂商决定了设备的理想视口,DPR也由他们决定,单位是dppx。
 
dppx 每一个像素的点数。一英寸对应了css中的96像素,1dppx等于96dpi。
 
resolution 设备的分辨率,如:96dpi, 300dpi
 
设备像素dp(device pixels):
ppi就是设备像素dp(device pixels)的单位。
 
ppi(pixels per inch)表示每英寸所拥有的像素(pixel)数目,数值越高,代表屏幕能以更高的密度显示图像。
计算公式:ppi=像素数量/物理尺寸(英寸数)
 
 
注:
写代码的时候只要关注dpr就可以了,网页的视口的大小是设备分辨率/dpr

修改swiper 2.7.6版本在ie8下点击后停止自动切换的问题

前文“Swiper 循环切换回调实例”中介绍过一些用法。
Swiper 是个优秀的滑动插件插件,有两个版本。3.x版本兼容高版本浏览器 chrome、ie9+ (推测),2.x版本兼容ie8等。
目前2.x已停止维护了,最新版本为 2.7.6.

问题描述:由于要兼容ie8故采用2.7.6版本。测试发现ie8下点击后停止自动切换的问题,chrome正常。
分析:
插件根据这个值 autoplayDisableOnInteraction 来决定用户操作后是否自动切换。在代码中找到,

            if (internal && !params.autoplayDisableOnInteraction) {
                _this.wrapperTransitionEnd(function () {
                    autoplay();
                });
            }

发现能正确执行到if条件中。但ie8下没有执行到autoplay(),继续分析_this.wrapperTransitionEnd,是由ie8不支持 transitionend 事件导致的。修改如下:

    _this.stopAutoplay = function (internal) {
        if (_this.support.transitions) {
            if (!autoplayTimeoutId) return;
            if (autoplayTimeoutId) clearTimeout(autoplayTimeoutId);
            autoplayTimeoutId = undefined;
            if (internal && !params.autoplayDisableOnInteraction) {
                _this.wrapperTransitionEnd(function () {
                    autoplay();
                });
            }
            _this.callPlugins('onAutoplayStop');
            if (params.onAutoplayStop) _this.fireCallback(params.onAutoplayStop, _this);
        }
        else {
            if (autoplayIntervalId) clearInterval(autoplayIntervalId);
            autoplayIntervalId = undefined;
            if (internal && !params.autoplayDisableOnInteraction) {
                _this.startAutoplay();
            }
            _this.callPlugins('onAutoplayStop');
            if (params.onAutoplayStop) _this.fireCallback(params.onAutoplayStop, _this);
        }
    };

swiper-2-7-7

移动设备上的viewport

像素是网页布局的基础。一个像素就是计算机屏幕能显示一种特定颜色的最小区域。

有两种像素:
设备像素:设备屏幕的物理像素,任何设备的物理像素的数量都是固定的。
css像素:为web开发者创造的,在css和javascript中使用的一个抽象的层。

css像素相当于多少个设备像素取决于屏幕的特性(是否是高密度)和用户的缩放。
用户放大得越大,一个css像素覆盖的设计像素就越多。
如果用户缩小到足够的程度,一个css像素会变得明显比一个设备像素小。

ppk把移动设备上的viewport分为:

layout viewport 布局视口
visual viewport 视觉视口
ideal viewport 理想视口

其中的ideal viewport是最适合移动设备的viewport,ideal viewport的宽度等于移动设备的屏幕宽度,只要在css中把某一元素的宽度设为ideal viewport的宽度(单位用px),那么这个元素的宽度就是设备屏幕的宽度了,也就是宽度为100%的效果。ideal viewport 的意义在于,无论在何种分辨率的屏幕下,那些针对ideal viewport 而设计的网站,不需要用户手动缩放,也不需要出现横向滚动条,都可以完美的呈现给用户。

移动设备默认的viewport是layout viewport。
在进行移动设备网站的开发时,我们需要的是ideal viewport。那么怎么才能得到ideal viewport呢?这就该轮到meta标签出场了。


要得到ideal viewport就必须把默认的layout viewport的宽度设为移动设备的屏幕宽度。
缩放是相对于 ideal viewport来进行缩放的,当对ideal viewport进行100%的缩放,也就是缩放值为1的时候,不就得到了 ideal viewport吗?


也可以把当前的的viewport变为 ideal viewport。

要把当前的viewport宽度设为ideal viewport的宽度,既可以设置 width=device-width,也可以设置 initial-scale=1,但这两者各有一个小缺陷,就是iphone、ipad以及IE 会横竖屏不分,通通以竖屏的ideal viewport宽度为准。所以,最完美的写法应该是,两者都写上去,这样就 initial-scale=1 解决了 iphone、ipad的毛病,width=device-width则解决了IE的毛病:


配套网站:
http://www.quirksmode.org/blog/archives/the_mobile_web_handbook/

常用媒体查询 ( css media ) 条件

通过媒体查询为不同的设备和大小配置不同的样式。

@media 媒体类型 and (媒体特性){你的样式}

注意:使用Media Queries必须要使用“@media”开头,然后指定媒体类型(也可以称为设备类型),随后是指定媒体特性(也可以称之为设备特性)。
媒体特性的书写方式和样式的书写方式非常相似,主要分为两个部分,第一个部分指的是媒体特性,第二部分为媒体特性所指定的值,而且这两个部分之间使用冒号分隔。
与CSS属性不同的是,媒体特性是通过min/max来表示大于等于或小于做为逻辑判断。

1、最大宽度max-width

@media screen and (max-width:480px){
 .ads {
   display:none;
  }
}

2、最小宽度min-width

@media screen and (min-width:900px){
.wrapper{width: 980px;}
}

3、多个媒体特性使用,使用关键词”and”将多个媒体特性结合在一起,每个条件包含在圆括号中。例:

@media screen and (min-width:600px) and (max-width:900px){
  body {background-color:#f5f5f5;}
}

4、设备屏幕的输出宽度Device Width

5、not关键词,表示对后面的表达式执行取反操作

6、only关键词,指定某种特定的媒体类型

7、使用逗号(,)被用来表示并列或者表示或

@media screen and (max-width:480px), screen and (min-width:960px){
  body {background-color:#f00;}
}

8、在Media Query中如果没有明确指定Media Type,那么其默认为all

9、非常喜欢Lyza的建议尽可能少。这绝对是符合我们的利益以及追求简单的页面格局。

常用媒体查询 ( css media ) 条件

/* media */
/* 横屏 */
@media screen and (orientation:landscape){
}
/* 竖屏 */
@media screen and (orientation:portrait){
}
/* 窗口宽度<960,设计宽度=768 */
@media screen and (max-width:959px){
}
/* 窗口宽度<768,设计宽度=640 */
@media screen and (max-width:767px){
}
/* 窗口宽度<640,设计宽度=480 */
@media screen and (max-width:639px){
}
/* 窗口宽度<480,设计宽度=320 */
@media screen and (max-width:479px){
}
/* windows UI 贴靠 */
@media screen and (-ms-view-state:snapped){
}
/* 打印 */
@media print{
}

参考:
http://nec.netease.com/framework/css-media.html
https://developer.mozilla.org/zh-CN/docs/Web/Guide/CSS/Media_queries

注:
使用媒体查询的优秀网站:http://mediaqueri.es/

Swiper 循环切换回调实例

Swiper 是一款优秀的滑动插件,支持手机端和pc端。现为3.x版本,2.x版本兼容ie8浏览器。
插件原版地址:
http://idangero.us/swiper/
中文版地址为:
http://www.swiper.com.cn/

实例地址:
15-infinite-loop-2

核心代码:

    var swiper = new Swiper('.swiper-container', {
        pagination: '.swiper-pagination',
        slidesPerView: 1,
        paginationClickable: true,
        spaceBetween: 30,
        loop: true,
        onSlideChangeEnd: function(swiper){
          console.log(swiper.activeIndex) //每次切换时,提示现在是第几个slide
          changeBg((swiper.activeIndex) % 5);
        }
    });

    // 回调切换背景
    function changeBg(index){
        $('#main').removeClass().addClass(function(){
            switch (index) {
                case 0:
                    return 'bg-5';
                    break;
                case 6:
                    return 'bg-1';
                    break;
                default:
                    return 'bg-'+index;
                    break
            }
        });
    }

loop模式:
会在wrapper前后生成若干个slides让slides看起来是衔接的,用于无限循环切换。
loop模式下会在slides前后复制若干个slide,,前后复制的个数不会大于原总个数。
默认为0,前后各复制1个。

例:
0,1,2 --> 2,0,1,2,0
实例中index为0和6时,做相应处理。

注:
activeIndex
返回当前活动块的索引。loop模式下注意该值会被加上复制的slide数。

paginationClickable
此参数设置为true时,点击分页器的指示点分页器会控制Swiper切换。

autoplayDisableOnInteraction
用户操作swiper之后,是否禁止autoplay。默认为true:停止。
如果设置为false,用户操作swiper之后自动切换不会停止,每次都会重新启动autoplay。
操作包括触碰,拖动,点击pagination等。

scrollIntoView的用法

scrollIntoView
作用(功能),将一个对象显示在当前window窗口的可视范围之内。
这个是W3C定义的DOM方法,各浏览器均支持,包括:IE5.5+、FF2.0+….

可以到PPK的博客中查看更详细的介绍:http://www.quirksmode.org/dom/w3c_cssom.html

可以点击链接查看Demo:http://www.quirksmode.org/dom/tests/scrollintoview.html

不过上面并未介绍它的参数,具体参数说明可以看这里:

http://msdn.microsoft.com/en-us/library/ms536730(VS.85).aspx

语法:

object.scrollIntoView( [bAlignToTop])

参数:

bAlignToTop 布尔型:true/false,默认参数不传则为true

它们分别代表不同的含义。

true:如果滚动条足够长,则将对象的顶端与当前窗口的顶部对齐

false:对象的底端与当前窗口的顶端对齐

参考:http://www.cnblogs.com/meteoric_cry/archive/2011/10/01/2197172.html

说说focus /focusin /focusout /blur 事件

事件触发时间:

focus:当focusable元素获得焦点时,不支持冒泡;
focusin:和focus一样,只是此事件支持冒泡;
blur:当focusable元素失去焦点时,不支持冒泡;
focusout:和blur一样,只是此事件支持冒泡;

以前一直以为所有事件都是支持冒泡的,都是可以cancel的,查阅了[MDN上相关资料](https://developer.mozilla.org/en-US/docs/Web/Events)后,才发现有些事件支持冒泡,有些事件并不支持冒泡;有些事件有默认行为(这类事件可以cancel),有些事件压根儿就没有默认行为(这类事件就不能 cancel )。

从 MDN 上可以清楚的看到 focus和blur这2种事件不支持冒泡,支持冒泡的事件是focusin和focusout。

事件触发顺序:

对于同时支持这4个事件的浏览器,事件执行顺序为focusin > focus > focusout > blur

转自:
https://segmentfault.com/a/1190000003942014

在 Velocity 中判断对象为 null 或空字符串

在写 Java 项目时,很多时候我们都必须判断一下对象是否为 null。这个在 Java 代码中,很容易实现。在使用 Velocity 的 Java Web 项目中,很多时候,需要在 Velocity 的模板中,判断一个对象是否为空。那么这时,该如何判断呢?今天D瓜哥就来给大家简单介绍介绍!

方式一

事实上,在 Velocity 中 null 对象是作为 false来进行进行计算的。那么,判断是否为空就很简单了:

#if(!$diguage )
    "地瓜哥"博客网
#end

如果 $diguage 的值为 false,那么,也能通过这个测试。所以,这种方式检查的是引用是否为 nullfalse

方式二

在静默引用(Quiet References)中,如果引用为 null,则会被计算为空字符串 ""。那么,我们也可以里中这个特性来完成我们的需求:

#if( "$!diguage" == "" )
    "地瓜哥"博客网
#end

这种检查方式,如果 $diguage 为空字符串,则也能通过检查。所以,这个检查方式,实际检查的是引用是否为 null 或者为空字符串 ""

值得一提的是,如果仅仅需要检查引用是否为空字符串 "",可以这样写:

#if( "$diguage" == "" )
    "地瓜哥"博客网
#end

方式三

结合 方式一方式二,可以做到仅仅检查一个用是否为 null

#if( (! $diguage ) && ("$!diguage" == "") )
    "地瓜哥"博客网
#end

这里的逻辑是这样的: (null or false) and (null or > empty-string),从这里就能一眼看出,如果结果想为 true, 则引用 $diguage 必须为 null。因为 false 和空字符串 ""永远不可能为 true。在D瓜哥看来,这样写,未免有点太复杂了。

方式四

不要直接检查对象对象是否为空,而是使用一个能自解释的方法(self-explaining method)。例如:

#if( $car.empty )
    "地瓜哥"博客网
#end

这是 Shinobu Kawai’s 推荐的解决方案。前提就是必须实现一个如下的一个方法,但是,带来的好处就是可以使模板易读性更强!

public boolean isEmpty()
{
    // 如果值为空,则返回 true
}

参考资料中,还有其他方法。但是,这些方法相关的类,D瓜哥找了一下,根本没有找到;尝试了一下#ifnull( $diguage ),模板解析直接就报错了。相比,这些方法都已经不再支持了。所以,D瓜哥就不再介绍了。

参考资料

  1. CheckingForNull – Velocity Wiki
  2. Conditionals – Velocity User Guide
  3. Quiet Reference Notation – Velocity User Guide

转自:
http://www.diguage.com/archives/142.html