همانطور که میدانید می توان ظاهر فرم های HTML را، مانند عناصر دیگر HTML، با استفاده از CSS بسیار زیباتر نشان داد. کد زیر یک فرم عادی HTML بدون استایل دهی است:
<!DOCTYPE html> <html> <body> <h3>Using CSS to style an HTML Form</h3> <div> <form action="/action_page.php"> <label for="fname">First Name</label> <input type="text" id="fname" name="firstname" placeholder="Your name.."> <label for="lname">Last Name</label> <input type="text" id="lname" name="lastname" placeholder="Your last name.."> <label for="country">Country</label> <select id="country" name="country"> <option value="australia">Australia</option> <option value="canada">Canada</option> <option value="usa">USA</option> </select> <input type="submit" value="Submit"> </form> </div> </body> </html>
همانطور که می بینید ظاهر این فرم بسیار زشت است اما اگر به کدهای بالا کمی استایل CSS اضافه کنیم می توانیم چنین کد زیبایی را پدید بیاوریم:
<!DOCTYPE html> <html> <style> input[type=text], select { width: 100%; padding: 12px 20px; margin: 8px 0; display: inline-block; border: 1px solid #ccc; border-radius: 4px; box-sizing: border-box; } input[type=submit] { width: 100%; background-color: #4CAF50; color: white; padding: 14px 20px; margin: 8px 0; border: none; border-radius: 4px; cursor: pointer; } input[type=submit]:hover { background-color: #45a049; } div { border-radius: 5px; background-color: #f2f2f2; padding: 20px; } </style> <body> <h3>Using CSS to style an HTML Form</h3> <div> <form action="/action_page.php"> <label for="fname">First Name</label> <input type="text" id="fname" name="firstname" placeholder="Your name.."> <label for="lname">Last Name</label> <input type="text" id="lname" name="lastname" placeholder="Your last name.."> <label for="country">Country</label> <select id="country" name="country"> <option value="australia">Australia</option> <option value="canada">Canada</option> <option value="usa">USA</option> </select> <input type="submit" value="Submit"> </form> </div> </body> </html>
در این مقاله میخواهیم برخی از مواردی را که میتواند ظاهر فونت ها را اینچنین زیبا کند به شما نشان دهیم.
همانطور که میدانید از خصوصیت width
برای تعیین عرض عناصر استفاده می شد. از طرفی یکی از دلایل زشتی فرم های پیش فرض کوچک بودن input هایشان است بنابراین ما می توانیم به این input ها width
مناسب بدهیم:
<!DOCTYPE html> <html> <head> <style> input { width: 100%; } </style> </head> <body> <p>A full-width input field:</p> <form> <label for="fname">First Name</label> <input type="text" id="fname" name="fname"> </form> </body> </html>
در کد بالا این مقدار را 100 درصد تعیین کرده ایم تا تمام عرض صفحه گرفته شود. همچنین به نوع سلکتورمان دقت کنید؛ این سلکتور تمام <input> ها را هدف میگیرد. اگر بخواهیم به جای هدف گرفتن تمام input ها، فقط input های خاصی هدف گرفته شوند می توانستیم از کد هایی مانند کد های زیر استفاده کنیم:
[input[type=text
: تنها فیلد های متنی را انتخاب می کند[input[type=password
: تنها فیلد های مربوط به رمز کاربری را انتخاب می کند[input[type=number
: تنها فیلد های عددی را انتخاب می کندیکی دیگر از مشکلات ظاهری فرم های پیش فرض این است که آن ها به متن داخلشان میچسبند و جای تنگی دارند. برای حل این مشکل می توانیم از padding
استفاده کنیم:
<!DOCTYPE html> <html> <head> <style> input[type=text] { width: 100%; padding: 12px 20px; box-sizing: border-box; } </style> </head> <body> <p>Padded text fields:</p> <form> <label for="fname">First Name</label> <input type="text" id="fname" name="fname"> <label for="lname">Last Name</label> <input type="text" id="lname" name="lname"> </form> </body> </html>
همانطور که میبینید فیلد های مربوطه بزرگ تر و جا دار تر شده اند اما هنوز مشکلی هست! دو فیلدی که پشت سر هم گذاشته ایم به هم چسبیده اند بنابراین می توانیم به آن ها یک margin
نیز اضافه کنیم تا از هم کمی فاصله بگیرند:
<!DOCTYPE html> <html> <head> <style> input[type=text] { width: 100%; padding: 12px 20px; margin: 8px 0; box-sizing: border-box; } </style> </head> <body> <p>Padded text fields:</p> <form> <label for="fname">First Name</label> <input type="text" id="fname" name="fname"> <label for="lname">Last Name</label> <input type="text" id="lname" name="lname"> </form> </body> </html>
سوال: دلیل اضافه کردن خاصیت box-sizing
به کد بالا چیست؟
پاسخ: در قسمت های قبلی همین دوره توضیح داده ایم که اگر خاصیت box-sizing
روی مقدار border-box تنظیم نشده باشد باعث بروز مشکلی می شود؛ با زیاد شدن padding عرض عنصر نیز زیاد می شود! در CSS خصوصیتی به نام box-sizing
وجود دارد و باعث می شود عناصر عرض خود را ثابت نگه دارند. اگر از box-sizing
با مقدار border-box استفاده کنید و سپس مقدار padding را افزایش دهید به جای زیاد شدن عرض، فضای content کمتر می شود.
از مشکلات دیگر فرم های پیش فرض، زیبا نبودن مرز دور هر فیلد است. برای رنگی کردن و مشخص تر کردن این مرز ها می توان از خاصیت border
استفاده کرد. همچنین برای آنکه فیلد هایمان زیبا تر شوند و زاویه ی دور آنها گِرد باشد می توانیم از خاصیت border-radius
نیز استفاده کنیم:
<!DOCTYPE html> <html> <head> <style> input[type=text] { width: 100%; padding: 12px 20px; margin: 8px 0; box-sizing: border-box; border: 2px solid red; border-radius: 4px; } </style> </head> <body> <p>Text fields with borders:</p> <form> <label for="fname">First Name</label> <input type="text" id="fname" name="fname"> <label for="lname">Last Name</label> <input type="text" id="lname" name="lname"> </form> </body> </html>
حتما دیده اید که برخی از فرم ها تنها مرز پایین دارند. برای طراحی چنین فیلدی می توانید از خصوصیت border-bottom
استفاده کنید:
<!DOCTYPE html> <html> <head> <style> input[type=text] { width: 100%; padding: 12px 20px; margin: 8px 0; box-sizing: border-box; border: none; border-bottom: 2px solid red; } </style> </head> <body> <p>Text fields with only a bottom border:</p> <form> <label for="fname">First Name</label> <input type="text" id="fname" name="fname"> <label for="lname">Last Name</label> <input type="text" id="lname" name="lname"> </form> </body> </html>
البته باید ذکر کنیم که شما می توانید با استفاده از background-color
به فیلد ها رنگ نیز بدهید. همچنین با استفاده از خاصیت color
میتوانیم رنگ متن درون آن فیلد را مشخص کنیم. به طور مثال به کد زیر دقت کنید:
<!DOCTYPE html> <html> <head> <style> input[type=text] { width: 100%; padding: 12px 20px; margin: 8px 0; box-sizing: border-box; border: none; background-color: #3CBC8D; color: white; } </style> </head> <body> <p>Colored text fields:</p> <form> <label for="fname">First Name</label> <input type="text" id="fname" name="fname" value="John"> <label for="lname">Last Name</label> <input type="text" id="lname" name="lname" value="Doe"> </form> </body> </html>
خیلی از طراحان front end به درستی نمی دانند که حالت focus (در لغت به معنی «تمرکز» و «مرکز توجه») در عناصر به چه صورت است. به زبان ساده می توان گفت که هر عنصری با کلیک کردن یا شروع تعامل با آن به حالت focus در می آید؛ یعنی توجه شما و مرورگر روی آن عنصر است. ما می توانیم از این خاصیت برای زیباسازی فرم هایمان استفاده کنیم.
یکی از رفتار های پیش فرض مرورگر ها در مواجهه با فرم های HTML این است که دور فیلد هایمان یک خط آبی اضافه می کنند. اگر شما از این خاصیت خوشتان نمی آید می توانید از دستور ;outline: none
استفاده کنید. همچنین استفاده از focus:
نیز می تواند بسیار به نفع ما باشد.
مثال اول: در این مثال به مرورگر گفته ایم که هنگام focus شدن یک عنصر باید به فیلد ما رنگ پس زمینه ی آبی اضافه کند:
<!DOCTYPE html> <html> <head> <style> input[type=text] { width: 100%; padding: 12px 20px; margin: 8px 0; box-sizing: border-box; border: 1px solid #555; outline: none; } input[type=text]:focus { background-color: lightblue; } </style> </head> <body> <p>In this example, we use the :focus selector to add a background color to the text field when it gets focused (clicked on):</p> <form> <label for="fname">First Name</label> <input type="text" id="fname" name="fname" value="John"> <label for="lname">Last Name</label> <input type="text" id="lname" name="lname" value="Doe"> </form> </body> </html>
مثال دوم: در این فیلد کار جالب تری انجام داده ایم. به مرورگر گفته ایم زمانی که فیلد به حالت focus در می آید رنگ border آن را پر رنگ تر کن تا کاربر متوجه فعال بودن فیلد بشود:
<!DOCTYPE html> <html> <head> <style> input[type=text] { width: 100%; padding: 12px 20px; margin: 8px 0; box-sizing: border-box; border: 3px solid #ccc; outline: none; } input[type=text]:focus { border: 3px solid #555; } </style> </head> <body> <p>In this example, we use the :focus selector to add a black border color to the text field when it gets focused (clicked on):</p> <form> <label for="fname">First Name</label> <input type="text" id="fname" name="fname" value="John"> <label for="lname">Last Name</label> <input type="text" id="lname" name="lname" value="Doe"> </form> </body> </html>
حتی می توانیم این فیلد را از این هم بهتر کنیم! می توانیم با اضافه کردن خاصیت transition به آن حالت انیمیشن بدهیم:
<!DOCTYPE html> <html> <head> <style> input[type=text] { width: 100%; padding: 12px 20px; margin: 8px 0; box-sizing: border-box; border: 3px solid #ccc; -webkit-transition: 0.9s; transition: 0.9s; outline: none; } input[type=text]:focus { border: 3px solid #555; } </style> </head> <body> <p>In this example, we use the :focus selector to add a black border color to the text field when it gets focused (clicked on):</p> <p>Note that we have added the CSS transition property to animate the border color (takes 0.5 seconds to change the color on focus).</p> <form> <label for="fname">First Name</label> <input type="text" id="fname" name="fname" value="John"> <label for="lname">Last Name</label> <input type="text" id="lname" name="lname" value="Doe"> </form> </body> </html>
همانطور که می بینید هنگامی که روی فیلد مورد نظر کلیک کنید پر رنگ شدن border به آرامی انجام می شود و حالت انیمیشن گونه ای دارد. در دوره ی CSS پیشرفته با دستوراتی مانند transition آشنا خواهیم شد.
حتما مشاهده کرده اید که برخی از فیلد ها (مانند فیلد های جست و جو در سایت) دارای آیکون خاصی هستند. برای اضافه کردن آن ها می توانید از خصوصیت background-image
استفاده کرده و سپس آن را با background-position
موقعیت دهی کنید:
<!DOCTYPE html> <html> <head> <style> input[type=text] { width: 100%; box-sizing: border-box; border: 2px solid #ccc; border-radius: 4px; font-size: 16px; background-color: white; background-image: url('https://www.w3schools.com/css/searchicon.png'); background-position: 10px 10px; background-repeat: no-repeat; padding: 12px 20px 12px 40px; } </style> </head> <body> <p>Input with icon:</p> <form> <input type="text" name="search" placeholder="Search.."> </form> </body> </html>
در کد بالا باید توجه داشته باشید که padding از سمت چپ را زیاد داده ایم تا نوشته ی جست و جو روی آیکون نوشته نشود! حالا نوبت انیمیشن است. ساده ترین حالت ایجاد انیمیشن در فیلد ها این است که عرض آن ها را کوتاه قرار دهید و سپس در کد ها به مرورگر بگویید اگر فیلد وارد حالت Focus شد عرض اش را زیاد کن و در عین حال به آن خاصیت transition
را نیز بدهیم:
<!DOCTYPE html> <html> <head> <style> input[type=text] { width: 130px; box-sizing: border-box; border: 2px solid #ccc; border-radius: 4px; font-size: 16px; background-color: white; background-image: url('https://www.w3schools.com/css/searchicon.png'); background-position: 10px 10px; background-repeat: no-repeat; padding: 12px 20px 12px 40px; -webkit-transition: width 0.4s ease-in-out; transition: width 0.4s ease-in-out; } input[type=text]:focus { width: 100%; } </style> </head> <body> <p>Animated search input:</p> <form> <input type="text" name="search" placeholder="Search.."> </form> </body> </html>
با کلیک کردن روی فیلد جست و جو تغییر زیبا را مشاهده می کنید!
فرم های HTML تنها از فیلد های متنی تشکیل نشده اند بلکه برخی اوقات از نوع textarea هستند. البته پیچیدگی خاصی ندارند و می توانیم آن ها را دقیقا مانند فیلد ها استایل دهی کنیم اما یکی از ویژگی های textarea ها این است که قابل resize شدن هستند بنابراین کاربر می تواند اندازه شان را برای خودش تغییر دهد. این قابلیت به شما ضرر نمی زند بلکه ممکن است کاربران آن را دوست داشته باشند اما اگر به هر دلیلی خواستید جلوی این کار را بگیرید باید از خاصیت resize
استفاده کنید:
<!DOCTYPE html> <html> <head> <style> textarea { width: 100%; height: 150px; padding: 12px 20px; box-sizing: border-box; border: 2px solid #ccc; border-radius: 4px; background-color: #f8f8f8; font-size: 16px; resize: none; } </style> </head> <body> <p><strong>Tip:</strong> Use the resize property to prevent textareas from being resized (disable the "grabber" in the bottom right corner):</p> <form> <textarea>Some text...</textarea> </form> </body> </html>
منو های SELECT از مواردی هستند که می توانند استایل دهی شوند. به این منو نگاه کنید:
<!DOCTYPE html> <html> <head> <style> select { width: 100%; padding: 16px 20px; border: none; border-radius: 4px; background-color: #f1f1f1; } </style> </head> <body> <p>A styled select menu.</p> <form> <select id="country" name="country"> <option value="au">Australia</option> <option value="ca">Canada</option> <option value="usa">USA</option> </select> </form> </body> </html>
دکمه ها نیز قابل استایل دهی هستند:
<!DOCTYPE html> <html> <head> <style> input[type=button], input[type=submit], input[type=reset] { background-color: #4CAF50; border: none; color: white; padding: 16px 32px; text-decoration: none; margin: 4px 2px; cursor: pointer; } </style> </head> <body> <p>Styled input buttons.</p> <input type="button" value="Button"> <input type="reset" value="Reset"> <input type="submit" value="Submit"> </body> </html>
در دوره ی CSS پیشرفته یاد خواهیم گرفت که با استفاده از media query ها فرم هایمان را واکنش گرا کنیم تا در گوشی های همراه نیز به خوبی نمایش داده شوند:
<!DOCTYPE html> <html> <head> <style> * { box-sizing: border-box; } input[type=text], select, textarea { width: 100%; padding: 12px; border: 1px solid #ccc; border-radius: 4px; resize: vertical; } label { padding: 12px 12px 12px 0; display: inline-block; } input[type=submit] { background-color: #4CAF50; color: white; padding: 12px 20px; border: none; border-radius: 4px; cursor: pointer; float: right; } input[type=submit]:hover { background-color: #45a049; } .container { border-radius: 5px; background-color: #f2f2f2; padding: 20px; } .col-25 { float: left; width: 25%; margin-top: 6px; } .col-75 { float: left; width: 75%; margin-top: 6px; } /* Clear floats after the columns */ .row:after { content: ""; display: table; clear: both; } /* Responsive layout - when the screen is less than 600px wide, make the two columns stack on top of each other instead of next to each other */ @media screen and (max-width: 600px) { .col-25, .col-75, input[type=submit] { width: 100%; margin-top: 0; } } </style> </head> <body> <h2>Responsive Form</h2> <p>Resize the browser window to see the effect. When the screen is less than 600px wide, make the two columns stack on top of each other instead of next to each other.</p> <div class="container"> <form action="/action_page.php"> <div class="row"> <div class="col-25"> <label for="fname">First Name</label> </div> <div class="col-75"> <input type="text" id="fname" name="firstname" placeholder="Your name.."> </div> </div> <div class="row"> <div class="col-25"> <label for="lname">Last Name</label> </div> <div class="col-75"> <input type="text" id="lname" name="lastname" placeholder="Your last name.."> </div> </div> <div class="row"> <div class="col-25"> <label for="country">Country</label> </div> <div class="col-75"> <select id="country" name="country"> <option value="australia">Australia</option> <option value="canada">Canada</option> <option value="usa">USA</option> </select> </div> </div> <div class="row"> <div class="col-25"> <label for="subject">Subject</label> </div> <div class="col-75"> <textarea id="subject" name="subject" placeholder="Write something.." style="height:200px"></textarea> </div> </div> <div class="row"> <input type="submit" value="Submit"> </div> </form> </div> </body> </html>
امیدوارم از این قسمت لذت برده باشید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.