打造纯CSS的无侵入的卡盘(幻灯片)

October 1, 2008 - by Macji - HTML/CSS/JS/PHP - css, unobtrusive, 幻灯片

卡盘,也就是幻灯片,它应该是自动播放,但目前css是无法做到自动播放(可能会让你失望),所以它不应该叫幻灯片,但我扔这么称呼它为幻灯片。如果你认为可以用脚本来实现,嗯,地球人都知道,显然违背了我们的主题,纯css的,无侵入的。似乎我标题党了,但请你耐下性子来听我说。

今天无意在经典论坛看到一个帖子,纯CSS的图片展示效果,它是利用锚点来实现,创意非常好,但马上令我兴奋,因为该效果有缺点。


  1. Opera无效

  2. 无法记录状态

  3. 没有hover效果

这些正是我想说的,我想补充的。

首先,我们让它来兼容所有A级浏览器。其实原理很简单,既然使用锚点,我们应该记得css3有个伪类:target(非IE内核浏览器都支持),让它来控制,不就更好?

<style>
.macji ul{
    width:250px;
    height:260px;
    overflow:hidden;
}
#b:target{
    margin:-260px 0 0;
}
#c:target{
    margin:-520px 0 0;
}
</style>
<div class="macji">
    <ul>
        <li id="a">
            <img src="http://pics.taobaocdn.com/bao/album/chl/digital/3Cpj_250X260_080904_fox.jpg" />
        </li>
        <li id="b">
            <img src="http://pics.taobaocdn.com/bao/album/chl/smbzb_250x260_080818_ng.jpg" />
        </li>
        <li id="c">
            <img src="http://pics.taobaocdn.com/bao/album/b2cdigital/guoqin_080919_250x260_xy.jpg" />
        </li>
    </ul>
    <ol>
        <li><a href="#a">a</a></li>
        <li><a href="#b">b</a></li>
        <li><a href="#c">c</a></li>
    </ol>
</div>

测试地址

问题2,实现记录状态,那我们同样可以用伪类:target来实现,IE系列浏览器不支持。

<style>
/*  省略一些css,下面这行是最关键的  */
a.item:hover, :target a.item{
	background:#f60;
}
</style>
<div class="macji">
    <ul>
        <li id="a">
            <a href="#a" class="item">1</a>
            <a href="#"><img src="http://pics.taobaocdn.com/bao/album/chl/digital/3Cpj_250X260_080904_fox.jpg" /></a>
        </li>
	<li id="b">
            <a href="#b" class="item">2</a>
            <a href="#"><img src="http://pics.taobaocdn.com/bao/album/chl/smbzb_250x260_080818_ng.jpg" />
        </li>
        <li id="c">
            <a href="#c" class="item">3</a>
            <a href="#"><img src="http://pics.taobaocdn.com/bao/album/b2cdigital/guoqin_080919_250x260_xy.jpg" /></a>
        </li>
    </ul>
</div>

测试地址

最后一个问题,hover效果,这可不是简单的:hover就可以实现,我们不能在li上给hover(这样当鼠标经过li就hover了),我们只能在数字上hover(<a href="#a" class="item">1</a>)然后来影响它对于的图片,貌似不可能纯CSS实现,但确实可以实现,用“ + ”来实现。由于用到:target和“+”,所以只有Firefox、Opera支持。-__-

<style>
.macji{
	position:relative;
}
.macji ul{
	width:250px;
	height:260px;
	overflow:hidden;
}
ul li{
	height:260px;
}
.macji a{
	position:absolute;
	left:0;
	top:0;
	z-index:2;
}
a.item{
	z-index:10!important;
	left:10px;
	top:230px;
	display:block;
	width:20px;
	height:20px;
	border:solid 1px #777;
	line-height:20px;
	text-align:center;
	color:#fff;
	background:#aaa;
}

#b a.item{
	left:31px;
}
#c a.item{
	left:51px;
}
a.item:hover,:target a.item{
	background:#f60;
}
#a:target a.pic,#b:target a.pic,#c:target a.pic{
	z-index:3;
}
/* 原理是用绝对定位z-index来显示,另 “ + ” 只对节点的下一个兄弟节点有效 */
a.item:hover + a.pic{
	z-index:9!important;
}
/* for ie */
a.pic{
	* position:static;
}
</style>
<div class="macji">
    <ul>
        <li id="a">
            <a href="#a" class="item">1</a>
            <a href="#" class="pic"><img src="http://pics.taobaocdn.com/bao/album/chl/digital/3Cpj_250X260_080904_fox.jpg" />
        </li>
        <li id="b">
            <a href="#b" class="item">2</a>
            <a href="#" class="pic"><img src="http://pics.taobaocdn.com/bao/album/chl/smbzb_250x260_080818_ng.jpg" /></a>
        </li>
        <li id="c">
            <a href="#c" class="item">3</a>
            <a href="#" class="pic"><img src="http://pics.taobaocdn.com/bao/album/b2cdigital/guoqin_080919_250x260_xy.jpg" /></a>
        </li>
    </ul>
</div>

最终演示,代码实现是很简单,关键是是否联想到原理。举一反三,将会得到更多你想要的结果。不知不觉已是国庆节了,祝大家节日快乐!

扩展阅读:css3伪类:target

本博客所有文章遵循创作共用版权协议,要求署名、非商业、保持一致。转载时请先阅读以上许可协议,并以超链接形式注明出处。
这篇文章发表于2008年10月01日 12:20:11, 并被分类于HTML/CSS/JS/PHP. 您可以通过订阅 RSS 2.0 跟踪对这篇文章的评论, 也可以发表你的评论, 或者在您自己的网站中引用(trackback)该篇日志.

已有 3 条评论

  1. Progressive Enhancement 的 Tab - 麦鸡(Macji) : October 1, 2008 - Permalink

    [...] 貌似不能实现,可仔细想想是可以实现的,连这个都能实现,何况一个tab呢。。。 [...]

  2. webgmae : October 1, 2008 - Permalink

    点击数字时会跳到网页顶部,不知道这个如何解决?

    还有,能不能做成鼠标onmouse图片显示?

  3. Macji : October 1, 2008 - Permalink

    点击数字时会跳到网页顶部,这只能通过js来取消链接的默认事件,如果纯css是无法做到(锚点)。

    mouse事件,Firefox、Opera支持。 其他浏览器可以通过js来实现。

发表评论

添加新评论