存档

文章标签 ‘JavaScript’

「推荐」纯CSS打造下拉菜单

2010年8月20日 3 条评论

实现 submenu 的方法很多,很多人在使用结合JavaScript的下拉菜单,不过我还是喜欢单纯的CSS代码打造的下拉效果。在微软 Microsoft Expression Web 的相关站点上看到这个纯CSS下拉菜单的时候,我觉得很酷。这应该是最精简、最干净的纯CSS下拉菜单了。

先看一下效果:

下面是实现方法:

首先是菜单的XHTML代码:

<ul>
  <li><a href="#">菜单一</a></li>
  <li><a href="#">菜单二</a>
    <ul>
      <li><a href="#">子菜单一</a></li>
      <li><a href="#">子菜单二</a></li>
      <li><a href="#">子菜单三</a></li>
    </ul>
  </li>
  <li><a href="#">菜单三</a></li>
  <li><a href="#">菜单四</a>
    <ul>
      <li><a href="#">子菜单一</a></li>
      <li><a href="#">子菜单二</a></li>
      <li><a href="#">子菜单三</a></li>
    </ul>
  </li>
  <li><a href="#">菜单五</a></li>
</ul>

不设置任何CSS类,实在是干净到极点了(当然,考虑到实际应用的复杂性,我估计你不可能真的什么都不加。要么把这段代码放到一个特定的容器里,要么给第一层的ul加一个id或者class。

假设这是在一个新的HTML文档里,那么我们现在没有任何的CSS定义,这时候的网页显示效果是这样的:

在我们的下拉菜单中,不需要内补丁、外边距这些东西,即使需要,我们也要自己重新设置,所以我们首先添加第一条规则:

ul {
    margin: 0px;
    padding: 0px;
}

为了跨浏览器兼容,必须同时把外边距和内补丁都设置为0,因为有的浏览器默认使用外边距,有的则默认使用内补丁。这样设置以后,页面上可以看到两层列表项前面的缩进都没了,实心和空心的列表符号也不见了。然后设置第二条规则:

ul li {
    float: left;
    display: inline;
    font: 0.9em Arial, Helvetica, sans-serif;
    height: 30px;
    width: 100px;
    list-style: none;
}

这是让原本各占一行的li元素变成嵌入式(inline)显示,另一种说法是把list-item元素变成行内元素。总而言之就是让li不要各占一行,并列起来,这样才能成为菜单。设置后,效果如下:

这样就得到了下拉菜单的雏形,当然了,外观很丑陋,下拉功能也还没实现。这里要说明的是,最好给菜单项设置高度和宽度,否则有可能出现不可预料的结果(取决于页面或容器的宽度)。为了让菜单项看起来像菜单,我们继续添加规则:

ul li a {
    color: #FFF;
    text-decoration: none;
    line-height: 29px;
    width: 91px;
    margin: 0px;
    padding: 0px 0px 0px 8px;
    display: block;
    border-right: solid 1px #ccc;
    border-bottom:solid 1px #ccc;
    background: #808080;
}

这一条规则比较长,从作用上说呢,就是加上背景和菜单间的隔离线,把默认有下划线蓝色的文字变成白色无下划线。增加了规则后的效果:

从外观上,这就已经是我们最终的下拉菜单样式了。不过,我们还要在细节上修饰一下,比如让子菜单和一级菜单的样式有所区别(当然了,由于字体设置的 0.9em,所以在文字大小上已经有区别了,但是还不够,而且对于中文来说,很多时候我们未必能通过文字大小来区别,因为适合中文的常规文字大小就 12px和14px而已),所以我们修改一下子菜单的背景色,并且让子菜单比一级菜单的高度要小一些。规则:

ul li ul li { height:25px; }
ul li ul li a {
    background: #666;
    line-height:24px;
}

这里包含两条规则,第一条是将子菜单的列表项目高度由之前统一设置的30px减小为25,第二是将子菜单项的背景改为#666,并且文字行高对应地减小到24设置完成后(列表项高度-1,减去的1正好是上边框的1像素),效果如下:

通常我们鼠标滑过某个菜单项的时候,要让它跟其它项目有所区别(表示当前菜单处于激活状态,术语叫“高亮” ,所以我们对一级菜单的鼠标滑过样式做一下定义:

ul li a:hover { background: #666; }

注意,这里为鼠标滑过时设置的背景色和子菜单的背景色一样,原因?看效果就知道了:

这里的第二个菜单项就是鼠标滑过时候的样式,这样就跟弹出的(现在还不会弹出)子菜单背景色一致了。现在整个菜单的样式都设置完了,但是,这只是静态的菜单啊,我们要的是会动的。所以工作还没完成。接下来是什么呢?当然是默认情况下把二级菜单隐藏起来。我们要写JS来隐藏他们吗?No!样式如下:

ul li ul { visibility: hidden; }

这样,子菜单并不是像 display:none 一样不显示,它还是在那个位置,文档结构什么的都没有发生任何改变,只是看不到它而已,而且下拉菜单中的链接当然也没不可以点击。

最后一条规则,让鼠标滑过有下拉项的时候,显示下拉菜单。当然我们实际设置的是:如果某一个下拉菜单的父级元素(一级菜单项)被鼠标滑过,那么就让该下拉菜单可以被看见:

ul li:hover ul { visibility: visible; }

这样就完成了整个设置下拉菜单制作,当然你还可以进一步修饰这个菜单,比如我们应该让子菜单中的项目在鼠标滑过的时候也变色:

ul li ul li a:hover { background: #333; }

最终效果:

要强调的一点:这个下拉菜单在各主流浏览器(IE6以下的版本除外)中的外观及行为都是完全一致的。兼容性非常好。

如果IE6的兼容性对你的站点来说非常重要,那么你可以参考这篇文章「Whatever:hover – 无需javascript让IE支持丰富伪类」 :http://wukangrui.com/2009/06/22/whatever-hover-pseudo-class-without-javascript.html

站点演示效果请访问 Wheat Notes http://www.wheatnotes.com

参考文章:
whatever:hover http://www.xs4all.nl/~peterned/csshover.html
使用 Expression Web 以无代码方式实现纯 CSS 水平下拉菜单 http://www.microsoft.com/china/expression/newsletter/2008-11/article05.aspx

My Sweet Titles

2010年6月28日 没有评论

在看过无数博友的Sweet Titles文章介绍后,终于忍不住在另一个站点上使用了这个酷炫的显示!发现因为IE对alt代码标签的识别,会导致在IE下出现alt内容和Sweet Titles重叠的显示。说下我的解决办法,OK,从头开始:

1. 在站点上载入jQuery库
2. Sweet Titles效果JS代码:

var sweetTitles = {
	x : 10,								// @Number: x pixel value of current cursor position
	y : 20,								// @Number: y pixel value of current cursor position
	tipElements : "a",	    			// @Array: Allowable elements that can have the toolTip,split with ","
	init : function() {
		$(this.tipElements).mouseover(function(e){
			this.myTitle = this.title;
			this.myHref = this.href;
			this.myHref = (this.myHref.length > 30 ? this.myHref.toString().substring(0,30)+"..." : this.myHref);
			this.title = "";
			var tooltip = "<div id='tooltip'><p>"+this.myTitle+"<em>"+this.myHref+"</em>"+"</p></div>";
			$('body').append(tooltip);
			$('#tooltip')
				.css({
					"opacity":"0.8", // 0.8 为透明度可自行根据喜好调整数字
					"top":(e.pageY+20)+"px",
					"left":(e.pageX+10)+"px"
				}).show('fast');	
		}).mouseout(function(){
			this.title = this.myTitle;
			$('#tooltip').remove();
		}).mousemove(function(e){
			$('#tooltip')
			.css({
				"top":(e.pageY+20)+"px",
				"left":(e.pageX+10)+"px"
			});
		});
	}
};
$(function(){
	sweetTitles.init();
});

3. Sweet Titles的CSS样式

body div#tooltip { position:absolute;z-index:1000;max-width:240px;width:auto !important;width:240px;background:#000;text-align:left;padding:5px;min-height:1em;}
body div#tooltip p { margin:0;padding:0;color:#fff;font:12px verdana,arial,sans-serif; }
body div#tooltip p em { display:block;margin-top:3px;color:#f60;font-style:normal;font-weight:bold; }

4. 禁止IE显示图片alt标签的js代码(需放在所有图片后)

function RemoveAllAlt(){
	var oimg = document.getElementsByTagName("img");
	for(var i=0;i<oimg.length;i++){
		oimg[i].setAttribute("alt","");
	}
}
window.onload = RemoveAllAlt();

具体效果,请移步至 http://about.wheatime.com

分类: wordpress 标签: , , , ,

你的网站能在6秒之内打开吗?

2009年8月29日 34 条评论

互联网上有一个6秒定律:如果你的网站在6秒之内还没有被打开,那么绝大多数的人不会再继续等待,而是选择关闭,去浏览别的网页。所以保证良好、稳定的加载速度对于访客来说是非常重要的,无论你是要获得更多的读者还是要留住原有的访客这都是需要注意的重要元素之一。

要获得更快的加载速度,首先主机的选择很重要。比如说你的访客主要在国内,那么你的主机是否可以在国内各个线路获得良好的速度,你可以事先通过该主机商的现有用户网站检测一下。其次就是我们自身要对网站做好相关的优化了,我们以 WordPress 程序为例,随着你使用 WordPress 时间的增长,安装了不少插件、主题&页面中添加了图片,虽然你的WP功能越来越强大,但是速度似乎开始变慢……

拖慢WP加载速度的主要原因:
1.PHP命令的执行
2.图片,Javascript 的加载
3.从数据库调用信息
4.无用的代码

针对这几点,为你的WP提速可以采用以下6个方法:

1. 减少不必要的PHP请求
由于你所使用的主题作者写这个主题是给很多blogger使用的,因此通过这个php语句来统一调用,而作为我们使用者来说,把它替换成自己的静态HTML代码可以提高加载速度。

比如:

1
<link rel=”stylesheet” type=”text/css” media=”screen” href=”<?php bloginfo(’stylesheet_url’); ?>“/>

我们就可以替换成:

1
<link rel=”stylesheet” type=”text/css” media=”screen” href=”http://www.wheatime.com/wp-content/themes/style.css”/>

WP主题中通常 head.php foot.php sidebar.php 中的引入CSS、导航菜单、分类选项、页脚信息等都可以采用相应的 html 替换。

2. 删除不必要的插件
除了一些常用的插件,减少不必要插件的使用。另外,如果你的插件类表中有安装了但没有使用的插件,那么建议把它删除,因为即使那些没有被激活,加载的时候也会被检查。

3. 减少服务器请求
如果你提供一些资源供大家下载,比如图片,视频,电子书等建议不要放在自己的空间中,选择 Youtube flickr 等平台存放则是不错的做法。

4. 使用插件提速
比如 Object Cache, WP Widget Cache, Autoptimize, DB Cache, WP Super Cache 等
可以参考本站文章:两个让你的WP更快的插件

5. 优化博客中的图片
博客中图片的优化对于提高加载速度也很重要,图片文件大小,贴在网页中的图片不能过大,这样会延缓页面读取时间。因此每一张贴进网页的图片都需要进行瘦身和格式转换(转为Gif可以有效减少空间占用)。
另外对于图片欣赏类的文章,图片比较大,又不想降低质量影响效果,建议尽量外链到图片站上,贴进文章后调整图片在日志中的显示尺寸。(这一点主要针对空间不大的博主)

6.压缩精简你的代码
使用一些工具对 CSS JavaScript 等代码进行精简压缩,比如 Format CSS JS Compressor 等。

本文只是对优化的几个方面做了一个大概的介绍,具体的操作步骤可以使用Google搜索,如果你有其他的优化方法欢迎投稿或者留言与我交流。

iNove 中鼠标悬浮显示 @ 评论

2009年5月29日 2 条评论

1. 下载 commenttips.js 文件。该文件修改自 yinheli 的代码,我去除了一些无关代码,简化了效果,和修复了几个bug。下载请点 

2. 将 commenttips.js 文件放置到 inove/js 目录。

3. style.css 中追加样式代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#thecomments .tip {
	background:#FFF;
	border:1px solid #CCC;
	width:605px;
	padding:10px !important;
	padding:10px 10px 0;
	margin-top:0;
	position:absolute;
	z-index:3;
}
#thecomments .tip .act {
	display:none;
}
*+html #thecomments .tip {
	padding:10px 10px 0 !important;
}

4. 在主题中添加代码调用 JavaScript。打开 templates/end.php,在 </body> 前面一行添加以下代码:
(如果你有其他插件或者自己已经添加了 jQuery 的库,那第一行代码可以不必添加。)

1
2
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js"></script>
<script type="text/javascript" src="<?php bloginfo('template_url'); ?>/js/commenttips.js"></script>

5. 好了,刷新一下有 @ 回复的页面,等页面加载完,将鼠标悬停在 @ 回复上,你会看到效果的。

演示:http://www.wheatime.com/guestbook

via: http://www.neoease.com/inove-mouseover-to-show-comment-no/

[转载网络]保护你的JS代码

2009年2月8日 没有评论

1.PACKER2.0.2 — 一个加密JavaScript的开源工具

这是一个并非很复杂的编码工具,编码过后可以被浏览器直接识别。新浪在用。比如:http://comment4.news.sina.com.cn/comment/cmnt_xml.js (现已更新)

官网 http://dean.edwards.name/packer/

传说中的开发者

设置也很简单:

Numeric(Base 10): 所有的字符都被编码成数字

Normal(Base 62): 所有的字符都被编码成字母与数字符号构成的值。这是推荐的方式。

High ASCII(Base 95): 这种方式的压缩率较高。不推荐,会有兼容性问题。

2.Javascript Obfuscator

Javascript脚本混淆器。可混乱,混淆并打包你的Javascript脚本,将Javascript脚本转换成混乱的难以阅读的格式,使之无法进行分析。

网络上有很多软件版和在线版,可以自行搜索查找。

10种JavaScript特效实例让你的网站更吸引人

2008年12月11日 没有评论

我们有三种主要的方法(从难到易):自己动手写脚本;使用类似于jQuery和mooTools的JavaScript框架(可以让编写代码变得更容易些);使用能工作于现有的JavaScript框架下的提前预置好的脚本或那种从头开始开发的创建者。这篇文章适合那些打算提高工作效率或不愿意从头开发脚本的人阅读。

这里收集了10种强大的且容易上手的JavaScript特效来改进您的网页站界面,从而得到更多的用户体验。这10种javaScript特效回味你的网站带来意想不到的视觉盛宴,而且安装和使用都比较容易。

1.GreyBox

GreyBox 允许你以模式窗口的形式运行其它网站(类似于弹出式窗口,但又不运行新的浏览器窗口).如果你的网站上有一些其他网站的导出链接,但你又不想让你的用户离开你的网站或不想让他们打开另一个浏览器窗口的话,这真的是一个很好的解决方案。使用GreyBox 非常简单。

 

这里是关于GreyBox的关键页面:下载页面, 说明页面, 实例, 安装,和 高级用法(如果你是JavaScript高手,看完这个页面中的一些技巧说明,你就能扩展它的函数库了)

2.instant.js

instant.js 特效会为你的照片动态添加类似偏振(Polaroid-like)的效果(将照片倾斜并添加阴影和边框)。现在我们可以使用这个照片特效模拟Photoshop的数码照片处理了。

这个脚本技术可以用于在你的网站上有很多照片,但又不想一个个手动处理的情况。(也许你会使用批量处理,但那只是建立于单一的动作下的,如调整尺寸、裁剪等…)

3.mooTable

mooTable允许你为表格中的数据进行排序(不用刷新页面),利用DOM替代数据库的请求的新式排序方法。使用简单,仅需轻微的配置即可。

这个脚本库需要mooTools框架的支持,你可以在这里下载。你还可以在论坛中的mootools板块寻找一些创建mooTable的方法,会有很多mootools开发者的反馈。

4.FancyForm

FancyForm 可以取代单调乏味的表单控件如单选按钮和复选框。基本的使用仅需两步:(1)在页面中调用JavaScript文件 (2)为你的表单控件指定类名,如复选框指定class=”checked” 或 class=”unchecked”,单选框指定class=”selected” 和 class=”unselected”。非常不显眼的javaScript.

该脚本需要mootools的支持(版本1.1)

5.image menu

image menu,使用phatfusion开发而成。非常漂亮的横向菜单,当你悬停在某个菜单项上时,图片就会扩展开。

你可以使用这个技术为照片的隐藏部分使用蒙太奇效果,但当用户将鼠标悬停在上面是就会显示全部。

该脚本需要mootools的支持(版本1.1)

6.AmberJack: Site Tour Creator

这是一个轻量级的JavaScipt库,允许你为网站添加实施快速游览。允许用户事实的在浏览每个页面的时候查看简短的描述。

您可以利用这个技术来演示如何让用户使用这个网站,用户只需要点击下一步的按钮,就能了解需要做的每一步。

7.ImageFlow

灵感来源于iPod的“coverflow”,ImageFlow是一个用来展示图片集合的特效。用户可以拖动下方的滚动条来控制图片的显示。

用户点击图片以后,会转向到现实清晰大图的网页。

8.ShadowBox.js Media viewer

ShadowBox是”完全使用JavaScipt编写的跨浏览器、跨平台、代码简洁且文档完整的媒体查看应用程序”(怎么样?一口气说下来这么多优点。)

ShadowBox区别于其它Model Box(如Lightbox 2)的地方是,它还支持除图片以外的很多其它文件类型,如flash视频、内嵌式youtube视频、Apple.com预告片和网页(这样能让用户不用转到另一个页面就能完成登录、注册)。这是很有价值的脚本。

9.TJPzoom 3 - image magnifier

TJPzoom可以让你将某个高清图片的局部放大显示。按下并拖动鼠标的话,可以改变放大区域的尺寸。

10.mootools Tips

mootools Tips是mooTools框架的一部分,它可以让你为用户提供一个高度可配置的工具提示,当用户将鼠标悬停在某个链接或图片上时,一些关于这个元素的附加的提示信息就会在屏幕上显示出来。

一些可以调节的方法:CSS 样式(可以修改默认的黑背景白文字)、渐变速度、工具提示在屏幕上显示的风格、你希望工具提示显示多久。这个脚本需要mootools框架的支持。

via:10 JavaScript Effects to Boost Your Website’s Fanciness Factor

JavaScript编写的胸罩罩杯尺寸计算器

2008年12月10日 没有评论

JavaScript出能能为网页添加更多互动元素、为网页的视觉效果锦上添花之外,还能干些什么?今天这个答案也许会出乎你的意料,外国一位设计师Ed Spencer用JavaScript为一个内衣网站编写了胸罩罩杯尺寸计算器。我们在使用JavaScript完成日常工作之余,其实也能编写这种有趣的程序。

  只在周末放松一下。

  近来Ed Spencer为一个更具诱惑性网站中的一个工作,这家网站是专卖女性内衣的。 除了不得不一整天去看只穿内衣的女人的图片这个不值得羡慕的任务之外,Ed Spencer还被迫去写一个胸罩尺寸计算器。

  胸罩尺寸计算器背后的理论是有点神秘和神奇了。 让一个男人或野兽理解它并不容易,所以它是幸运的,Ed Spencer完全不属于那两类, 他通过了痛苦和折磨的考验节省了广大女性的麻烦。

  下面来学习学习这个JavaScript有趣实例吧…

 

  这里是JS源文件,点击查看

代码如下:

var BraCalculator = {
    /**
    * The string to be returned when the result could not be calculated. Overwrite to change this
    */

    unknownString: “Unknown”,
    cupSizes: ["A", "B", "C", "D", "DD", "E", "EE", "F", "FF", "G", "GG", "H", "HH",
"J", "JJ", "K", "KK", "L", "LL", "M", "MM", "N", "NN"],
    /**
    * Returns the correct bra size for given under bust and over bust measurements
    * @param {Number} underBust The measurement taken under the bust (in inches)
    * @param {Number} overBust The measurement taken over the bust (in inches)
    * @return {String} The correct bra size for the given measurements (e.g. 32C, 40DD, etc)
    */

    calculateSize: function(underBust, overBust) {
        var bandSize = this.calculateBandSize(underBust);
        var cupSize = this.calculateCupSize(bandSize, overBust);
        if (bandSize && cupSize) {
            return bandSize + cupSize;
        } else {
            return this.unknownString;
        };
    },
    /**
    * Calculates the correct band size for a given under bust measurement
    * @param {Number} underBust The measurement under the bust
    * @return {Number} The correct band size
    */

    calculateBandSize: function(underBust) {
        var underBust = parseInt(underBust, 10);
        return underBust + (underBust % 2) + 2;
    },
    /**
    * Calculates the Cup size required given the band size and the over bust measurement
    * @param {Number} bandSize The measured band size (should be an even number)
    * @param {Number} overBust The measurement taken over the bust
    * @return {String} The appropriate alphabetical cup size
    */

    calculateCupSize: function(bandSize, overBust) {
         var bandSize = parseInt(bandSize, 10);
         var overBust = parseInt(overBust, 10);
         var diff = overBust - bandSize;
         var result = this.cupSizes[diff];
         //return false if we couldn’t lookup a cup size
         return result ? result : false;
    }
};

点击这里使用胸罩罩杯尺寸计算器

via: JavaScript Bra Size Calculator