यह मानते हुए कि आप 90 डिग्री को घुमाना चाहते हैं, यह संभव है, यहां तक कि गैर-पाठ तत्वों के लिए भी - लेकिन CSS में कई दिलचस्प चीजों की तरह, इसमें थोड़ी चालाक की आवश्यकता होती है। मेरा समाधान तकनीकी रूप से CSS 2 युक्ति के अनुसार अपरिभाषित व्यवहार को भी आमंत्रित करता है - इसलिए जब मैंने क्रोम, फ़ायरफ़ॉक्स, सफारी और एज में काम किया है और पुष्टि की है, तो मैं आपसे वादा नहीं कर सकता कि यह भविष्य में नहीं टूटेगा ब्राउज़र रिलीज़।
संक्षिप्त जवाब
HTML को इस तरह दिया गया है, जहाँ आप घुमाना चाहते हैं .element-to-rotate
...
<div id="container">
<something class="element-to-rotate">bla bla bla</something>
</div>
... जिस तत्व को आप घुमाना चाहते हैं उसके चारों ओर दो आवरण तत्व लगाएं:
<div id="container">
<div class="rotation-wrapper-outer">
<div class="rotation-wrapper-inner">
<something class="element-to-rotate">bla bla bla</something>
</div>
</div>
</div>
... और फिर एंटी-क्लॉकवाइज़ को घुमाने के लिए (या टिप्पणी करने के transform
लिए एक घड़ी के रोटेशन में बदलने के तरीके के लिए बाहर देखें) निम्न सीएसएस का उपयोग करें :
.rotation-wrapper-outer {
display: table;
}
.rotation-wrapper-inner {
padding: 50% 0;
height: 0;
}
.element-to-rotate {
display: block;
transform-origin: top left;
/* Note: for a CLOCKWISE rotation, use the commented-out
transform instead of this one. */
transform: rotate(-90deg) translate(-100%);
/* transform: rotate(90deg) translate(0, -100%); */
margin-top: -50%;
/* Not vital, but possibly a good idea if the element you're rotating contains
text and you want a single long vertical line of text and the pre-rotation
width of your element is small enough that the text wraps: */
white-space: nowrap;
}
ढेर स्निपेट डेमो
p {
/* Tweak the visuals of the paragraphs for easier visualiation: */
background: pink;
margin: 1px 0;
border: 1px solid black;
}
.rotation-wrapper-outer {
display: table;
}
.rotation-wrapper-inner {
padding: 50% 0;
height: 0;
}
.element-to-rotate {
display: block;
transform-origin: top left;
/* Note: for a CLOCKWISE rotation, use the commented-out
transform instead of this one. */
transform: rotate(-90deg) translate(-100%);
/* transform: rotate(90deg) translate(0, -100%); */
margin-top: -50%;
/* Not vital, but possibly a good idea if the element you're rotating contains
text and you want a single long vertical line of text and the pre-rotation
width of your element is small enough that the text wraps: */
white-space: nowrap;
}
<div id="container">
<p>Some text</p>
<p>More text</p>
<div class="rotation-wrapper-outer">
<div class="rotation-wrapper-inner">
<p class="element-to-rotate">Some rotated text</p>
</div>
</div>
<p>Even more text</p>
<img src="https://i.stack.imgur.com/ih8Fj.png">
<div class="rotation-wrapper-outer">
<div class="rotation-wrapper-inner">
<img class="element-to-rotate" src="https://i.stack.imgur.com/ih8Fj.png">
</div>
</div>
<img src="https://i.stack.imgur.com/ih8Fj.png">
</div>
यह कैसे काम करता है?
मेरे द्वारा ऊपर उपयोग किए गए विसंगतियों के सामने भ्रम उचित है; बहुत कुछ चल रहा है, और समग्र रणनीति सीधी नहीं है और समझने के लिए सीएसएस ट्रिविया के कुछ ज्ञान की आवश्यकता है। चलिए इसके माध्यम से कदम से कदम मिलाते हैं।
हम जिस समस्या का सामना कर रहे हैं उसका मूल यह है कि transform
लेआउट के लागू होने के बाद इसकी सीएसएस संपत्ति का उपयोग करते हुए किसी तत्व पर लागू होने वाले परिवर्तन । दूसरे शब्दों में, transform
किसी तत्व का उपयोग उसके माता-पिता या किसी अन्य तत्व के आकार या स्थिति को बिल्कुल भी प्रभावित नहीं करता है। इस तथ्य को बदलने का कोई तरीका नहीं है कि कैसे transform
काम करता है। इस प्रकार, किसी तत्व को घुमाने और उसके माता-पिता की ऊँचाई को घूर्णन का सम्मान करने के लिए, हमें निम्नलिखित चीजों को करने की आवश्यकता है:
- किसी तरह कुछ अन्य तत्व का निर्माण करें जिसकी ऊँचाई चौड़ाई के बराबर हो
.element-to-rotate
- हमारे परिवर्तन को
.element-to-rotate
ऐसे लिखें जैसे कि चरण 1 से तत्व पर इसे ओवरले करना है।
चरण 1 से तत्व होगा .rotation-wrapper-outer
। लेकिन हम अपने पैदा कर सकता है ऊंचाई के बराबर होना चाहिए .element-to-rotate
की चौड़ाई ?
हमारी रणनीति में प्रमुख घटक यहाँ है padding: 50% 0
पर .rotation-wrapper-inner
। इस कारनामे के लिए युक्तिpadding
का एक विलक्षण विवरण है : वह प्रतिशत पैडिंग, यहां तक कि padding-top
और padding-bottom
हमेशा तत्व के कंटेनर की चौड़ाई के प्रतिशत के रूप में परिभाषित किया जाता है । यह हमें निम्नलिखित दो चरण चाल करने में सक्षम बनाता है:
- हमने सेट
display: table
किया .rotation-wrapper-outer
। इसका कारण यह है कि इसमें फिट-टू-फिट चौड़ाई है , जिसका अर्थ है कि इसकी चौड़ाई इसकी सामग्री की आंतरिक चौड़ाई के आधार पर निर्धारित की जाएगी - यानी आंतरिक चौड़ाई पर आधारित है .element-to-rotate
। (समर्थन करने वाले ब्राउज़र पर, हम के साथ और अधिक सफाई से इस लक्ष्य को हासिल कर सकता है width: max-content
, लेकिन दिसंबर 2017 के रूप में, max-content
है अभी भी एज में समर्थित नहीं ।)
- हम 0
height
से सेट करते हैं .rotation-wrapper-inner
, फिर इसकी पैडिंग 50% 0
(यानी 50% ऊपर और 50% नीचे) करते हैं। इसके कारण यह अपने माता-पिता की चौड़ाई के 100% के बराबर ऊर्ध्वाधर स्थान लेता है - जो कि चरण 1 में चाल के माध्यम से, की चौड़ाई के बराबर है .element-to-rotate
।
इसके बाद, जो कुछ भी बचता है वह बाल तत्व की वास्तविक रोटेशन और स्थिति का प्रदर्शन करना है। स्वाभाविक रूप से, transform: rotate(-90deg)
रोटेशन करता है; हम transform-origin: top left;
घुमाए गए तत्व के शीर्ष-बाएँ कोने के चारों ओर होने के कारण रोटेशन का उपयोग करते हैं, जो बाद के अनुवाद को कारण के लिए आसान बनाता है, क्योंकि यह घुमाए गए तत्व को सीधे ऊपर छोड़ देता है जहां इसे अन्यथा खींचा जाता था। हम तत्पश्चात translate(-100%)
इसके पूर्व-घूर्णन चौड़ाई के बराबर दूरी द्वारा तत्व को नीचे की ओर खींचने के लिए उपयोग कर सकते हैं ।
वह अभी भी स्थिति को ठीक नहीं करता है, क्योंकि हमें अभी भी 50% शीर्ष पैडिंग के लिए ऑफसेट करने की आवश्यकता है .rotation-wrapper-outer
। हम सुनिश्चित करना है कि द्वारा प्राप्त .element-to-rotate
है display: block
(ताकि मार्जिन उस पर ठीक से काम करेंगे) और फिर एक -50% लागू करने margin-top
पर ध्यान दें कि प्रतिशत मार्जिन कर रहे हैं - यह भी पेरेंट तत्व की चौड़ाई के सापेक्ष परिभाषित किया।
और बस!
यह पूरी तरह से युक्ति-संगत क्यों नहीं है?
निम्नलिखित नोटों की वजह से कल्पना में प्रतिशत पैडिंग और मार्जिन की परिभाषा (मेरा खदान)
प्रतिशत के संबंध में गणना की जाती है चौड़ाई उत्पन्न बॉक्स के धारक ब्लॉक भी के लिए, 'गद्दी-टॉप' और 'padding-bottom' । यदि युक्त ब्लॉक की चौड़ाई इस तत्व पर निर्भर करती है, तो परिणामस्वरूप लेआउट CSS 2.1 में अपरिभाषित है।
चूँकि यह पूरी तरकीब घूमती है कि आंतरिक आवरण तत्व की पैडिंग उसके कंटेनर की चौड़ाई के सापेक्ष हो, जो कि उसके बच्चे की चौड़ाई पर निर्भर था, हम इस स्थिति को मार रहे हैं और अपरिभाषित व्यवहार को लागू कर रहे हैं। यह वर्तमान में सभी 4 प्रमुख ब्राउज़रों में काम करता है, हालांकि - कुछ प्रतीत होता है कि कल्पना करने के विपरीत-संगत टवीट्स जो मैंने कोशिश की हैं, जैसे कि माता-पिता .rotation-wrapper-inner
के .element-to-rotate
बजाय भाई-बहन बनना ।