CSS Secret——User Experience

选择适当的鼠标指针

CSS3级别提供了更加丰富的鼠标样式,包括隐藏指针的none。善用他们。none在不支持的浏览器中可以使用这样的方式来fallback:

cursor: url('transparent.gif'); 
cursor: none;

扩大可点击区域

这样不仅对触摸设备更加友好,而且根据Fitts' Law,(用于估算用户移动光标点击链接或控件按钮所需的时间)目的地明确的移动可以细分为两个部分:首先一个大幅度的移动将光标移向与目标大致相同的方向和区域;紧接着是一系列精细的小幅度微调来将光标精确定位在目标中心。更大的点击区域会给用户提供更大的方便。

添加透明边框

border: 10px solid transparent; 
background-clip: padding-box;

如果这时你还想使用边框样式的话,可以用之前提到的box-shadow来模拟。

添加伪元素

有时不能添加边框,那么最保险的方法就是伪元素了:

#button::before {
  content: '';
  position: absolute;
  top: -10px;
  right: -10px;
  bottom: -10px;
  left: -10px;
}

定制的checkbox

各种用户代理对checkbox的限制都非常大,我们想要一个自由样式的checkbox很难,我们得想个办法来绕过这些限制。
我们隐藏原来的checkbox,使用一个在label前的伪元素替代它。

传统的checkbox

<div id="customCheckbox">
    <input type="checkbox" id="awesome" />
    <label for="awesome">Awesome!</label>
</div>
input[type="checkbox"] {
  position: absolute;
  clip: rect(0,0,0,0);
}

input[type="checkbox"] + label::before {
  content: '\a0'; /* non-break space */
  display: inline-block;
  width: .8em;
  height: .8em;
  margin-right: .2em;
  border-radius: .2em;
  background: silver;
  text-indent: .15em;
  line-height: .65;
}

我们隐藏它的方法并不能使用display: none,因为这样就失去了checkbox在form中的作用。我们换而使用clip来隐藏它。
在切换选中状态时,可以使用:

input[type="checkbox"]:checked + label::before {
  content: '\2713';
  background: yellowgreen;
}

被按下去的开关

思想是一样的,就是另一种样式咯。

#toggledButton{
  input[type="checkbox"] {
    position: absolute;
    clip: rect(0,0,0,0);
  }
  input[type="checkbox"] + label {
    display: inline-block;
    padding: .3em .5em;
    background: #ccc;
    background-image:
            linear-gradient(#ddd, #bbb);
    border: 1px solid rgba(0,0,0,.2);
    border-radius: .3em;
    box-shadow: 0 1px white inset;
    text-align: center;
    text-shadow: 0 1px 1px white;
  }
  input[type="checkbox"]:checked + label, input[type="checkbox"]:active + label {
    box-shadow: .05em .1em .2em rgba(0,0,0,.6) inset;
    border-color: rgba(0,0,0,.3);
    background: #bbb;
  }

}

弹出框加模糊背景

在弹出框弹出的同时,将其余的背景元素模糊掉。

<body>
    <main>
        <button id="blur-pop">弹出框</button>
        各种其他元素
    </main>
    <div class="model">啊哈哈哈哈哈哈</div>
</body>

点击按钮时,将main里的所有东西模糊掉,弹出弹出框。

main {
  transition: 1s all;
}
main.de-emphasized {
  -webkit-filter: blur(3px) contrast(.8) brightness(.2);
  filter: blur(3px) contrast(.8) brightness(.2);
}
.model{
  position: fixed;
  top:20%;
  bottom:20%;
  left:20%;
  right:20%;
  background-color: crimson;
  display:none;
}

可滚动提示

许多现代的浏览器对滚动条在未发生滚动的都是默认隐藏的,因为它们并不好看,而且现在人们都倾向于使用手势和滚轮来控制滚动,滚动条更多的起到的是一个指示的作用。
有时会出现这样的问题,有一块内容是可以滚动的,然而由于浏览器隐藏了滚动条,造成了用户并不知道这里是可以滚动的。

Google Reader的设计者给出了一个很好的设计方案,在整个内容的上下边界中可滚动的方向上,加上一个阴影,就好像表示滚动的内容被盖在了什么内容的下面,这样人们一看就知道要可以向哪个方向滚动。
我们在内容框的上下放上不随内容滚动的两个阴影:

#srollHint{
  overflow: auto;
  width: 10em;
  height: 8em;
  padding: .3em .5em;
  border: 1px solid silver;
  background: 
    radial-gradient(at top, rgba(0,0,0,.2), transparent 70%) 0 0 / 100% 15px,
    radial-gradient(at bottom, rgba(0,0,0,.2), transparent 70%) bottom / 100% 15px,
    #fff;
  background-repeat: no-repeat;
  background-attachment: scroll, scroll;
}

再在上下放上随内容滚动的白色渐变,当上下滚动到头的时候,白色渐变就盖住了两个阴影。

#srollHint{
  overflow: auto;
  width: 10em;
  height: 8em;
  padding: .3em .5em;
  border: 1px solid silver;
  background: linear-gradient(white 15px, hsla(0,0%,100%,0)) 0 0 / 100% 50px,
    radial-gradient(at top, rgba(0,0,0,.2), transparent 70%) 0 0 / 100% 15px,
    linear-gradient(to top, white 15px, hsla(0,0%,100%,0)) bottom / 100% 50px,
    radial-gradient(at bottom, rgba(0,0,0,.2), transparent 70%) bottom / 100% 15px,
    #fff;
  background-repeat: no-repeat;
  background-attachment: local, scroll, local, scroll;
}

图片比较

有两张图片,想要向用户展示两张图片的不同,有什么好的展现方式呢?
最简单的就是把两张图片并排放置,但这样有些微小的差别是不容易被发现的。
一个比较好的实现方式是,两张图重合放置,通过左右拖动上面那张图的右边界可以显示出下面这张图,这样用户慢慢的拖动就可以在这个过程中注意到图片的不同。

CSS实现

我们可以通过CSS的resize属性来实现这个想法。
原始的resize小图标太小,用伪元素加了个显眼的。

<div class="image-slider">
    <div>
        <img src="img/adamcatlace.jpg" alt="Before" />
    </div>
    <img src="img/tiger.jpg" alt="After" />
</div>
.image-slider {
  position:relative;
  display: inline-block;
}
.image-slider > div {
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  width: 50%; /* Initial width */
  overflow: hidden;
  resize: horizontal;
}
.image-slider > div::before {
  content: '';
  position: absolute;
  bottom: 0;
  right: 0;
  width: 12px;
  height: 12px;
  padding: 5px;
  background:
          linear-gradient(-45deg, white 50%, transparent 0);
  background-clip: content-box;
  cursor: ew-resize;
}

.image-slider img {
  display: block;
  width:400px;
}

input Range

另一种办法使用一点点小的JS

<div class="image-slider-range">
    <div>
        <img src="img/adamcatlace.jpg" alt="Before" />
    </div>
    <img src="img/tiger.jpg" alt="After" />
    <input type="range" />
</div>

大体的HTML没有什么变化,就是多了个range类型的input,给这个类型的input绑上一个事件,在它被拖动的时候带动上层的DIV的边界移动,就达到了我们想要的效果。

.image-slider-range {
  position:relative;
  display: inline-block;
}
.image-slider-range > div {
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  width: 50%;
  overflow: hidden;
}
.image-slider-range img {
  display: block;
  user-select: none;
  width:400px;
}
.image-slider-range input {
  position: absolute;
  left: 0;
  bottom: 10px;
  width: 100%;
  margin: 0;
}
$$(".image-slider-range input")[0].oninput = function() {
    $$(".image-slider-range>div")[0].style.width = this.value + '%';
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,837评论 25 707
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,737评论 1 92
  • 已过霜降,已进深秋。 今年的秋雨特别的多,数天以来,天未亮便被雨滴声敲醒,开门映入眼前是一片雨帘。 秋雨沥沥,可苦...
    李红珠阅读 173评论 0 0
  • 土著,像当地居民一样生活在本地。也许解释的不够好,但至少我的理解是这样,选择来云南,然后留在了这里。 09年的大学...
    小绿婷婷阅读 367评论 2 1
  • 昨天在奶奶家吃饭,聊到二姑姑给远房一个爷爷钱的事。二姑姑和五姑姑一起在奶奶家,远房爷爷也在,二姑姑觉得爷爷年纪大了...
    Lyn小恩阅读 203评论 0 0