08

Menu với CSS

Bài viết này sẽ hướng dẫn các bạn trang trí một menu trên web với CSS. Sau khi đọc xong hướng dẫn này các bạn sẽ thu được kỹ thuật làm menu với tên gọi là Slide door và một số kinh nghiệm khác. Kết quả sau khi thực hiện xong sẽ như hình dưới đây

Đầu tiên chúng ta tạo đoạn code HTML xây dựng menu như sau

<div class="container">
      <ul id="menu">
        <li class="active"><a href="#">Trang chủ</a></li>
        <li><a href="#">Diễn đ&agrave;n</a></li>
        <li><a href="#">Giới thiệu</a></li>
        <li><a href="#">Điều khoản</a></li>
        <li><a href="#">Gallery</a></li>
        <li><a href="#">My gallery</a></li>
        <li><a href="#">Th&agrave;nh vi&ecirc;n</a></li>
        <li><a href="#">B&aacute;o lỗi</a></li>
      </ul>
    </div>

Tiếp theo chúng ta sẽ chỉnh CSS để có được menu hiển thị như mong muốn.

/* MENU */
ul#menu{
  line-height:50px;
  margin:0;
  list-style:none;
}
  ul#menu li{
    float: left;
    margin-right:20px;
    text-transform:uppercase;
    padding-right: 10px;
  }
 
  ul#menu li.active, ul#menu li:hover, ul#menu li.sfhover{
    background: transparent url(images/button-right.png) no-repeat right;
  }
 
  ul#menu li a{
    color:#FFFFFF;
    text-decoration: none;
    display:block;
    padding-left: 10px;
  }
 
  ul#menu li.active a, ul#menu li:hover a, ul#menu li.sfhover a{
    background: transparent url(images/button-left.png) no-repeat left;
  }
 
/* END MENU */

Ở đây tôi giải thích qua một số thuộc tính, chúng ta sử dụng line-height: 50px để ép chiều cao của menu bằng 50px và chữ sẽ được tự động căn giữa theo chiều dọc. Nếu chúng ta sử dụng thuộc tính height thì sẽ phải sử dụng margin hoặc padding để căn lại vị trí cho chữ của menu. Với thuộc tính list-style: none; để bỏ các bullet của các item li. Tiếp nữa nếu để mặc định thì chúng ta sẽ thấy các li hiển thị theo từng dòng một từ trên xuống dưới, ở đây chúng ta muốn hiển thị menu theo chiều ngang nên sẽ dùng float:left để các li hiển thị trên cùng một dòng ngang. Và để các mục cách nhau chúng ta sử dụng margin-right: 20px; để làm việc này.

Bây giờ để thay đổi style khi một item được chọn hoặc chuột di chuyển qua ta chỉnh lại thuộc tính của ul#menu li.active, ul#menu li:hover. Nhìn lại đoạn mã CSS sẽ thấy chỉ khi item được chọn và chuột di chuyển qua chúng ta chỉ thay đổi ảnh của background cho item đó. Nhưng ở đây chắc ai đó sẽ thắc mắc sao lại phải thay đổi background cho cả tag a và li, sao không chỉ một thôi. Do độ dài của từng item là chưa biết trước và khác nhau nên chúng ta không thể tạo ra một cái background cố định để thay cho tất cả được. Do vậy ở đây chúng ta sẽ sử dụng một kỹ thuật với tên gọi cũng khá gợi hình tượng "slide door". Trước tiên vào Photoshop tạo một button có độ dài phù hợp rồi cắt ra làm 2 phần như hình dưới đây

Như vậy chúng ta sẽ cho background của li là cái ảnh bên phải, của thẻ a nằm trong li là ảnh bên trái. Do đó khi item có kích thước khác nhau thì hình ảnh nút vẫn được hiển thị hài hòa. (Ô thế tại sao không dùng ảnh li là ảnh bên trái, và của thẻ a là cái còn lại? đơn giản vì theo cách hiển thị trên trình duyệt thì thằng nào nằm trong thì background của nó đè lên thằng chứa nó, còn nếu ai vẫn thích vậy thì ta cắt lại cho hình bên phải nhỏ hơn...). Để hiểu rõ hơn có thể đọc thêm kỹ thuật này tại link này.

OK, vậy là sau những bước này chúng ta đã có một menu ngang rồi và chạy rất ok trên Firefox, nhưng khi sang thằng IE thì sự kiện di chuyển chuột qua item không thấy nó đổi background. Tại sao nhỉ? Đây chính là những lúc bực nhất đối với người thiết kế Web để đảm bảo trang web của mình chạy đúng đắn trên các trình duyệt. Bị hiện tượng như trên là do trong IE không có cái kiểu li:hover, cái này IE chỉ support cho tag a thôi. Để giải quyết vấn đề này chúng ta thêm đoạn javascript này ở đầu trang web.

<!--//--><![CDATA[/ /><! 
sfHover = function() {
  var sfEls = document.getElementById("menu").getElementsByTagName("LI");
  for (var i=0; i<sfEls.length; i++) {
    sfEls[i].onmouseover=function() {
      this.className+=" sfhover";
    }
    sfEls[i].onmouseout=function() {
      this.className=this.className.replace(new RegExp(" sfhover\\b"), "");
    }
  }
}
if (window.attachEvent) window.attachEvent("onload", sfHover);
//--><!--]]>

Đoạn mã này sẽ được chạy trong IE để khi ta di chuyển chuột qua một item thì sẽ thêm môt class sfhover vào li. Cho nên trong đoạn mã CSS ở trên chúng ta cũng có phần định nghĩa style cho ul#menu li.sfhover và ul#menu li.sfhover a.

Vậy chúng ta đã có một menu chạy ngon trên IE và firefox!

05

Giận hờn - Quang Lê

Trả lại em yêu chiếc khăn ngày nào,
Ngày còn bên nhau ái ân tràn đầy.
Trả lại em yêu những năm học trò,
Những đêm hẹn hò, ngày ta có nhau.

Giận hờn chi em, nét mi đượm buồn.
Giận hờn chi em trút thêm muộn phiền.
Giận hờn cho nhau nỗi đau ngập lòng,
vắng xa thật rồi người ơi biết chăng.

(Điệp khúc):

Trả lại cho em, trả lại cho em,
Lời nào yêu thương còn đọng trên môi và tình ta đó
Những đêm trăng tàn,
Để lần sau cuối khi nhìn thấy nhau
Để ngày mai đó duyên tình cách xa.
Tiếng yêu ban đầu còn đâu nữa em ?

Người đành xa ta, bỏ ta một mình,
Để rồi ra đi cách xa ngàn trùng.
Kỷ niệm năm xưa sẽ tan như bọt bèo,
Ái ân ngày nào giờ như giấc mơ.

03

Ngại ngùng - Quang Lê

Em đã biết cong môi từ chỗi, những điều anh muốn nói.
Em đã biết xa lâu thì nhớ, lân lựa chi mắc cỡ.
Ôi nụ cười, mắt liếc chua ngoa, ta về bên ấy buồn ba bốn ngày.

Em đã biết phố đông nhiều ngõ, đường yêu đương trắc trở.
Ai lắc léo chi từng câu nói cho ngày sau nên nỗi.
Để bây giờ chim cá bặt tăm, ta về bên ấy buồn năm sáu ngày.

Xưa đồi nắng chung đường lá đổ, tim trai tơ nín thở.
Biết bao giờ gặp lại em yêu, lòng bất chợt buồn thiu.

Chuyện tưởng đã nhiều năm xa lắc bỗng chan đầy trong mắt.
Xào xạc đưa chiếc lá bay xa, ngồi mà nhớ người ta.

Anh đã biết yêu thương từ đó mà ngại không giám nói.
Để bây giờ chim cá bặt tăm, ta về bên ấy buồn xong vẫn buồn.

07

Smush.it - Tối ưu ảnh online

Đối với những người phát triển Website, tốc độ hiển thị của trang web là một yêu cầu rất quan trọng và có nhiều yếu tố khác ràng buộc với yêu cầu đó, như là đường truyền mạng, máy chủ, cách lập trình cho trang web. Nhưng có một việc mà một người thiết kế phải quan tâm đó là tối ưu những hình ảnh trên trang web để có được những bức hình chất lượng vừa lòng mà dung lượng lại chấp nhận được. Photoshop là một công cụ đa năng và hữu ích cho công việc đó. Đôi lúc người thiết kế cũng phải phân vân xem nên dùng định dạng ảnh nào cho phù hợp: jpg, gif or png. Mỗi loại đều có đặc điểm và thế mạnh riêng, nếu lựa chọn đúng sẽ làm giảm dung lượng ảnh đáng kể mà chất lượng lại không thay đổi nhiều lắm.

Bên cạnh Photoshop còn có rất nhiều công cụ khác để chúng ta tối ưu ảnh như các chương trình pngcrush, jpegtran. Ngoài ra chúng ta có thể tối ưu online bằng công cụ Smush tại trang http://smush.it. Tại trang này chúng ta có thể:

  • Upload nhiều file lên để tối ưu
  • Cung cấp danh sách url các ảnh để tối ưu
  • Lấy một Extension cho Firefox
  • Tối ưu các ảnh mà không làm giảm chất lượng đối với file gốc
  • Thống kê
07

Cài đặt Redmine trên Centos 5.3

Hôm nay mới chính thức được setup Redmine trên hệ điều hành Centos. Cách đây một thời gian mình cũng đã cài thành công Redmine trên Dreamhost, hôm nay có được một máy chủ VPS nên phải tự lực cấu hình.

Cài Ruby on Rails

yum install ruby ruby-devel ruby-libs ruby-irb ruby-rdoc ruby-mysql

Tiếp theo là download và cài ruby gems

wget http://rubyforge.org/frs/download.php/57643/rubygems-1.3.4.tgz
tar xvf rubygems-1.3.4.tgz
cd rubygems-1.3.4
ruby setup.rb

Cài rails

gem install rails --include-dependencies

Cài đặt Phusion Passenger

gem install passenger

Cần cài thêm một số công cụ cho Apache

yum -y install httpd-devel apr-devel

Tiếp theo từ dòng lệnh chạy

passenger-install-apache2-module

Sau khi module Apache 2 cài đặt thành công, chúng ta mở file cấu hình Apache thêm đoạn giống như dưới đây vào cuối file đó

LoadModule passenger_module /usr/local/lib/ruby/gems/1.9.1/gems/passenger-2.2.2/ext/apache2/mod_passenger.so
PassengerRoot /usr/local/lib/ruby/gems/1.9.1/gems/passenger-2.2.2
PassengerRuby /usr/local/bin/ruby

Khởi động lại Apache bằng lệnh

service httpd restart

Sau khi Apache khởi động xong thì để triển khai các ứng dụng Ruby on Rails trên Web thì chúng ta trỏ DocumentRoot vào thư mục public của các RoR project.

Để hoàn tất việc cài redmine, ví dụ tôi muốn cái Redmine lên subdomain http://a.xyz.com. Đầu tiên tôi tạo một thư mục projects trên server rồi download phiên bản mới nhất của Redmine về và giải nén vào thư mục projects đó. Sau đó tạo một subdomain http://a.xyz.com có DocumentRoot trở vào thư mục public trong projects. Như vậy khi chúng ta vào trang http://a.xyz.com thì module Passenger sẽ được kích hoạt để chạy ứng dụng RoR.

Các bước cấu hình Redmine thì làm giống như trên trang hướng dẫn cài đặt.

PS:

Các lỗi thường gặp:

/usr/local/apache/include/apr_file_info.h:200: error: 'apr_ino_t' does not name a type ..."

Lỗi này xuất hiện là do cài 2 thư viện apr trên server. Một cái cài mặc định và một cái cài Cpanel. Để khắc phục ta tạo một symbolic link như hướng dẫn dưới đây.

#ln -s /usr/local/apache/include/ /usr/include/apr-1

Flickr recent photos

Cu Ti - 3 tuoiCao sơn quái xếTrên đỉnh núiCu PitLộ hàngWhat the hell do I

Syndicate

Syndicate content