ბლოგი → განუსაზღვრელი სიგანის CSS მენიუს ცენტრირება
მენიუს შექმნა CSS-ის გამოყენებით, ზოგადად სირთულეს არ წარმოადგენს. ვისაც პირველი რამოდენიმე თავი მაინც წაუკითხავს ნებისმიერი საშუალო სირთულის წიგნში მარკაპზე, მათთვის, მენიუს გაკეთება ჩვეულებრივი, ტრივიალური ამოცანაა. ამიტომ, ჩემი აზრით ამ თემისადმი პოსტის მიძღვნას დიდი აზრი არ ექნებოდა.
ალბათ პოსტს არც დავწერდი, რომ არა შედარებით არასტრანდარტული ამოცანა, რომლის გადაწყვეტაც ბოლოს მომიხდა.
ჩვენმა ძვირფასმა :D დიზაინერმა დახატა ლეიაუთი, რომელშიც გათვალისწინებული იყო ჩვეულებრივი ჰორიზონტული მენიუ (როგორიც ხშირად გვიკეთებია), ოღონდ (!) ცენტრირებული. მე თვითონაც გამიკვირდა, რომ აქამდე მსგავსი შემთხვევა არასოდეს მქონია. გარკვეულ გარემოებათა გამო, მომიწია ცოტათი მეტი ფიქრი და გუგლში სეირნობა, რომ ჩვენი დიზაინერის „პრეტენზიები“ დაკმაყოფილებულიყო :D.
ახლა, რაც შეეხება საკითხს და პრობლემას :).
ზოგადად, არც ბლოკური ობიექტის ცენტრირება წარმოადგენს რაიმე სირთულეს. ცნობილია, რომ თუკი ბლოკურ ობიექტს CSS-ით განვუსაზღვრავთ margin: 0 auto; მაშინ ეს ობიექტი პოზიცირდება ჰორიზონტულად ცენტრში მისი მშობლის მიმართ. ეს ფაქტი ეფუძნება CSS2-ის წესს, რომ ობიექტისთვის, რომელსაც განსაზღვრული აქვს მარცხნივ და მარჯვნივ საზღვარი auto მნიშნელობით (margin-left: auto; margin-right: auto;) — ავტომატურად დაითვლება ტოლი სიდიდის მნიშვნელობები. აი ეს არის „ფილოსოფია“ ბლოკური ობიექტის ცენტრირებისა :) მოთხოვნა ამ შემთხვევაში არის ერთადერთი, მაგრამ პრინციპული(!); ობიექტის სიგანე უნდა იყოს წინასწარ განსაზღვრული!
ზუსტად აქ "წამოვკარი ფეხი" :D.
ე.ი. მე მჭირდება მენიუ, რომელიც იქნება ცენტრირებული და არ ექნება ზუსტად განსაზღვრული სიგანე, რათა შესაძლებელი იყოს მისი დინამიური მართვა CMS-იდან.
პრობლემაც აქ არის — ცენტრირების სტანდარტული მეთოდით აქ ფონს ვერ გავალთ, იმიტომ რომ სიგანე არ ვიცით და შესაბამისად არაფერიც არ დაიცენტრება.
ფაქტია, რომ ამ შემთხვევაში გვჭირდება სხვა მიდგომა, რომელიც ობიექტის ცენტრირებისთვის არ გულისხმობს მისი სიგანის ზუსტად განსაზვრას.
ზემოთხსენებულ გუგლში სეირნობის შემდეგ, ვიპოვე ამ ყველაფრის მარტივი CSS გადაწყვეტა. ასევე ცნობილი, როგორც „Shrink Wrap“ მეთოდი. Shrink Wrapping-ის იდეა მარტივია და მდგომარეობს შემდეგში: ბლოკურ ობიექტს უნდა მივუდგეთ როგორც ცხრილს.
შესაბამისად, კონტეინერს, რომელშიც გვაქვს მენიუს ელემენტები, საჭიროა განვუსაზღვროთ display: table; ხოლო ელემენტებს — display: table-cell;
ul.menu { display: table; margin: 0 auto; } ul.menu li { display: table-cell; }
ვაშა! :D
ამის შემდეგ ჩვენი განუსაზღვრელი სიგანის მენიუ ცენტრში ექცევა :)
ახლა, რა თქმა უნდა პრობლემა გვაქვს ბრაუზერად წოდებულ IE-სთან. აბა სხვანაირად როგორ იქნება :D ცნობილია, რომ IE-ს არ აქვს display: table; მნიშვნელობის მხარდაჭერა მე-7 ვერსიის ჩათვლითაც კი :) ამ პრობლემის მოსაგვარებლად საჭიროა, რომ კონტეინერს განვუსაზღვროთ text-align: center; ხოლო მენიუს აითემს მივუდგეთ, როგორც inline ელემენტს.
ul.menu { display: block; margin: 0 auto; text-align: center; } ul.menu li { display: inline; }
ამ უკანასკნელს გავაფორმებთ IE conditional comment-ში <!--[if IE]>....<![endif]--> და საბოლოოდ, რომ შევაჯამოთ მივიღებთ დაახლოებით ასეთ რამეს:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>Omedia, Horizontal CSS Menu</title> </head> <body> <ul> <li>ელემენტი 1</li> <li>ელემენტი 2</li> <li>ელემენტი 3</li> <li>ელემენტი 4</li> <li>ელემენტი 5</li> <li>ელემენტი 6</li> <li>ელემენტი 7</li> </ul> </body> </html>
<style type="text/css"> ul.menu { display: table; margin: 0 auto; } ul.menu li { display: table-cell; } </style> <!--[if IE]> <style type="text/css"> ul { display: block; margin: 0; text-align: center; } ul li { display: inline; } </style> <![endif]-->
ყველაფერი ნათელია &mdash გვაქვს ტრადიციული <ul> </ul> კონტეინერი და <li> </li> მენიუს ელემენტები. მათზე კი მოქმედებს შესაბამისი სტილები რაზეც ზემოთ იყო საუბარი. დანარჩენი კი უკვე თქვენი გემოვნების, ხასიათის და კონკრეტული ამოცანის ამბავია :).
22 კომენტარი:
კომენტარის დამატება:
იგზავნება
გმადლობ, კომენტარი დამატებულია.

<style type="text/css">
.container{
width: 100%;
height: 200px;
}
.left{
float: left;
width: 250px;
height: 200px;
}
.middle{
float: left;
width: 100%; --- :(( ისე რომ ცენტრში შეავსოს( ანუ მარცხენა და მარჯვენა დივებს შორის ადგილი დაიკავოს მთლიანად)
height: 200px;
}
.right{
float: right;
width: 250px;
height: 200px;
}
</style>
-----------------------
<div class="container">
<div class="left"></div>
<div class="middle"></div>
<div class="right"></div>
</div>
<style type="text/css">
#menu {
text-align:center;
margin:0 auto;
}
#menu ul li {
display:inline;
}
</style>
<div id="menu">
<ul>
<li>ელემენტი 1</li>
<li>ელემენტი 2</li>
<li>ელემენტი 3</li>
<li>ელემენტი 4</li>
<li>ელემენტი 5</li>
</ul>
</div>
საუბარია იმ შემთხვევაზე, როდესაც საჭიროა, რომ <li> ელემენტი იყოს ბლოკური და არა ინლაინი.
ვითვლიდი გამოსაყვანი მენიუს ასოების რაოდენობას, ვამრავლებდი საშუალო ასოების width-ზე და ვსვამდი ფიქსირებული სიგანის ბლოკებს, სლავა ბოგუ, თუ დააკვირდებით სულ სილფაენში არის სამი სიგანის ასოები, "მონო სიგანის" - წიპა ა, ბ, ი, 1.5 სიგანის: დ, ფ, რ და ა.შ. და ორმაგი სიგანის ასო ბგერა 'ლ' :D
ბავშობიდან მიყვარდა შუბლით კედლის მტვრევა.
ერთმა მირჩია ვებსტუდია გამეხსნა თქვენსავით, მაგრამ მუღამი დამეკარგა ამ უინტერნეტობაში. აბა თქვენ იცით. გამიხარდა ასეთი ქართული ვებ სტუდიას ნახვა. წარმატებები.
ბიჭებო CSS and HTML სად ვისწავლო? არ ამზადებთ თქვეენ?
და თუ რუსული მაშინ http://htmlbook.ru/ ;) იმედია ასეთი ტიპის საიტიც იქნება მშობლიურ ენაზე გი ნეტში :)