यदि css3 एक विकल्प है, तो यह css calc()
फ़ंक्शन का उपयोग करके किया जा सकता है ।
केस 1: एकल लाइन ( FIDDLE) पर बॉक्स को सही ठहराना )
मार्कअप सरल है - कुछ कंटेनर तत्व के साथ divs का एक गुच्छा।
सीएसएस इस तरह दिखता है:
div
{
height: 100px;
float: left;
background:pink;
width: 50px;
margin-right: calc((100% - 300px) / 5 - 1px);
}
div:last-child
{
margin-right:0;
}
जहाँ IE9 + कैल्क / गोलाई बग को ठीक करने के लिए -1px - यहाँ देखें
केस 2: कई लाइनों पर बॉक्स को सही ठहराना ( FIDDLE )
यहां, calc()
फ़ंक्शन के अतिरिक्त , media queries
आवश्यक हैं।
मूल विचार प्रत्येक #columns राज्यों के लिए एक मीडिया क्वेरी सेट करना है, जहाँ मैं तब तत्वों में से प्रत्येक (अंतिम कॉलम में लोगों को छोड़कर) पर मार्जिन-राइट का काम करने के लिए calc () का उपयोग करता हूं।
यह बहुत काम की तरह लगता है, लेकिन यदि आप LESS या SASS का उपयोग कर रहे हैं तो यह काफी आसानी से किया जा सकता है
(यह अभी भी नियमित सीएसएस के साथ किया जा सकता है, लेकिन फिर आपको सभी गणना मैन्युअल रूप से करनी होगी, और फिर यदि आप अपने बॉक्स की चौड़ाई बदलते हैं - तो आपको फिर से सब कुछ काम करना होगा)
नीचे LESS का उपयोग करके एक उदाहरण दिया गया है: (आप इसके साथ खेलने के लिए इस कोड को यहाँ कॉपी / पेस्ट कर सकते हैं , [यह भी कोड है जिसका उपयोग मैंने उपर्युक्त फिडेल को उत्पन्न करने के लिए किया था])
@min-margin: 15px;
@div-width: 150px;
@3divs: (@div-width * 3);
@4divs: (@div-width * 4);
@5divs: (@div-width * 5);
@6divs: (@div-width * 6);
@7divs: (@div-width * 7);
@3divs-width: (@3divs + @min-margin * 2);
@4divs-width: (@4divs + @min-margin * 3);
@5divs-width: (@5divs + @min-margin * 4);
@6divs-width: (@6divs + @min-margin * 5);
@7divs-width: (@7divs + @min-margin * 6);
*{margin:0;padding:0;}
.container
{
overflow: auto;
display: block;
min-width: @3divs-width;
}
.container > div
{
margin-bottom: 20px;
width: @div-width;
height: 100px;
background: blue;
float:left;
color: #fff;
text-align: center;
}
@media (max-width: @3divs-width) {
.container > div {
margin-right: @min-margin;
}
.container > div:nth-child(3n) {
margin-right: 0;
}
}
@media (min-width: @3divs-width) and (max-width: @4divs-width) {
.container > div {
margin-right: ~"calc((100% - @{3divs})/2 - 1px)";
}
.container > div:nth-child(3n) {
margin-right: 0;
}
}
@media (min-width: @4divs-width) and (max-width: @5divs-width) {
.container > div {
margin-right: ~"calc((100% - @{4divs})/3 - 1px)";
}
.container > div:nth-child(4n) {
margin-right: 0;
}
}
@media (min-width: @5divs-width) and (max-width: @6divs-width) {
.container > div {
margin-right: ~"calc((100% - @{5divs})/4 - 1px)";
}
.container > div:nth-child(5n) {
margin-right: 0;
}
}
@media (min-width: @6divs-width){
.container > div {
margin-right: ~"calc((100% - @{6divs})/5 - 1px)";
}
.container > div:nth-child(6n) {
margin-right: 0;
}
}
तो मूल रूप से आपको पहले बॉक्स-चौड़ाई और एक न्यूनतम मार्जिन तय करना होगा जो आप बक्से के बीच चाहते हैं।
इसके साथ, आप यह पता लगा सकते हैं कि आपको प्रत्येक राज्य के लिए कितनी जगह चाहिए।
फिर, अंतिम कॉलम में बक्से से सही मार्जिन को हटाने के लिए सही मार्जिन और एनटीएच-बच्चे को शांत करने के लिए कैल्क () का उपयोग करें।
स्वीकृत उत्तर पर इस उत्तर का लाभ जो उपयोग करता text-align:justify
है वह यह है कि जब आपके पास एक से अधिक बॉक्स हैं - अंतिम पंक्ति के बक्से को 'उचित' नहीं मिलता है जैसे: यदि अंतिम पंक्ति पर 2 बॉक्स शेष हैं - मैं नहीं चाहते हैं कि पहला बॉक्स बाईं ओर हो और अगला एक दाईं ओर हो - लेकिन इसके बजाय कि बॉक्स क्रम में एक दूसरे का अनुसरण करते हैं।
ब्राउज़र समर्थन के बारे में : यह IE9 +, फ़ायरफ़ॉक्स, क्रोम, Safari6.0 + पर काम करेगा (- अधिक विवरण के लिए यहां देखें) हालांकि मैंने देखा कि IE9 + पर मीडिया क्वेरी राज्यों के बीच थोड़ी गड़बड़ है। [अगर कोई जानता है कि इसे कैसे ठीक करना है तो मैं वास्तव में जानना चाहूंगा :)] <- FIXED HERE
display:inline-block;
फ्लोट के बजाय क्यों नहीं ?