SASS #2
متغیرها (Variables)
متغیرها در SASS با استفاده از $ در ابتدای نام آن، به عنوان یک مقدار مورد استفادهی در CSS تعریف میشوند. شما در SASS میتوانید متغیرهایی را برای margin ،font-size و یا padding و غیره، تعریف کنید. استفاده از متغیرها این امکان را به شما میدهد که خیلی راحتتر از styleهای تعریف شده، مجدد استفاده کنید.
شما 6 نوع مختلف متغیر را میتوانید با استفاده از SASS بکار ببرید.
- Strings (مثال: ;"myString: "your text here$ )
- Numbers (مثال: ;myNum: 16px$)
- Colors (مثال: ;myColor: aqua$)
- Booleans (مثال: ;myBool: true$)
- Lists (مثال: ;myItemList: 1px solid red$)
- Nulls (مثال: ;myVar: null$)
برای مثالی از استفادهی از این متغیرها، یک فایل را با نام styles.scss ایجاد کرده و کدهای زیر را در آن وارد کنید:
$myColor: #FFF726; $myBackColor: #2B14FF; $myString: "I Love "; $myFontSize: 13px; $myMargin: 0px auto; $myWidth: 300px; h1 { color: $myColor; margin: 0; padding: 0; } h1:before{ content: $myString; } #container { width: $myWidth; margin: $myMargin; background-color:$myBackColor; text-align:center; }
ریاضی (Math)
برخلاف SASS ،CSS به ما امکان استفاده از عبارات ریاضی را میدهد. عملگرهای جمع + ، تفریق - ، تقسیم / ، ضرب * ، باقیمانده % ، مساوی == ، نامساوی =! را SASS پشتیبانی میکند. در هنگام استفاده از عبارات ریاضی چند نکته وجود دارد که باید رعایت کنید:
نکته1: چون علامت / در CSS به عنوان یک کوتاه کننده استفاده میشود مانند font: 14px/16px، در صورتیکه بخواهید عمل تقسیم را بر روی مقدار ثابتی انجام دهید باید آنها را درون پرانتر قرار دهید.
$fontDiff: (14px/16px);
$container-width: 100% - 20px;
حال میخواهیم براساس عرض container، ستونهای پویایی را ایجاد کنیم:
$container-width: 100%; .container { width: $container-width; } .col-4 { width: $container-width / 4; }
.container { width: 100%; } .col-4 { width: 25%; }
مشاهدهی پیاده سازی مثال بالا اینجا.
توابع (Functions)
یکی از بهترین قسمتهای SASS، توابع پیاده سازی شدهی آن است. شما میتوانید لیست بزرگی از توابع SASS را در اینجا مشاهده کنید.برای نمونه برخی از توابع مربوط به کار با رنگها را توضیح میدهیم:
- (darken ($color, $amount: این تابع برای تیرهتر کردن یک کد رنگ میباشد. شما برای استفادهی از این تابع باید دو مقدار را به آرگومانهای ورودی این تابع که به ترتیب کد رنگ و میزان تیرهتر شدن آن به صورت درصد از %0 تا %100 میباشند، ارسال کنید و خروجی آن کد رنگ تولید شده است. توجه داشته باشید نوع سیستم رنگی ارسال شده به عنوان پارامتر color$، خروجی این تابع نیز همان نوع میباشد.
darken(hsl(25, 100%, 80%), 30%) => hsl(25, 100%, 50%) darken(#800, 20%) => #200
- (lighten ($color, $amount: این تابع برای روشنتر کردن یک رنگ میباشد و دقیقا برعکس تابع darken عمل میکند.
lighten(hsl(0, 0%, 0%), 30%) => hsl(0, 0, 30) lighten(#800, 20%) => #e00
- (alpha ($color) / opacity($color: با استفاده از این دو تابع میتوانید میزان شفافیت/کدری را مشخص کنید.
- (mix ($color1, $color2, $weight:50% : با استفاده از این تابع
میتوانید دو رنگ را با هم ترکیب کنید. مقدار پیش فرض آرگومان weight$
برابر %50 میباشد و تعیین آن اختیاری است. محدودهی پذیرش مقدار weight$
هرچه به %0 نزدیکتر باشد، باعث نزدیکتر بودن رنگ خروجی به رنگ دوم و
هرچه به %100 نزدیکتر باشد رنگ خروجی به رنگ اول نزدیکتر میشود. توجه:
میزان شفافیت/کدری را نیز میتواند تشخیص دهد.
mix(#f00, #00f) => #7f007f mix(#f00, #00f, 25%) => #3f00bf mix(rgba(255, 0, 0, 0.5), #00f) => rgba(63, 0, 191, 0.75)
تو در تو (Nesting)
SASS امکان تعریف استایلهای تو در تو را به شما میدهد که باعث خواناتر شدن استایلهای نوشته شده میشود. به عنوان مثال به کد CSS زیر توجه کنید:
#container { width: 500px; margin: 0 auto; } #container p { font-family: Arial; font-size: 13px; } #container h1 { font-family: Tahoma; font-size: 15px; } #container h2 { font-family: Helvetica; font-size: 14px; }
$myFontsize1: 13px; $myFontsize2: 18px; $myFontsize3: 25px; $myWidth: 500px; $myMargin: 0px auto; #container { width: $myWidth; margin: $myMargin; p { font-family: Arial; font-size: $myFontsize1; } h1 { font-family: Tahoma; font-size: $myFontsize3; } h2 { font-family: Helvetica; font-size: $myFontsize2; } }
در صورتیکه نیاز به دسترسی به والد داشته باشید کافیست از علامت & استفاده کنید.
a.myAnchor { color: blue; &:hover { text-decoration: underline; } &:visited { color: purple; } }
at-root@
قبل استایلی که میخواهید به صورت تو در تو تعریف نشود، استفاده کنید..first-component { .text { font-size: 1.4em; } .button { font-size: 1.7em; } .second-component { .text { font-size: 1.2em; } .button { font-size: 1.4em; } } }
.first-component .text { font-size: 1.4em; } .first-component .button { font-size: 1.7em; } .first-component .second-component .text { font-size: 1.2em; } .first-component .second-component .button { font-size: 1.4em; }
at-root@
به صورت زیر میشود:.first-component .text { font-size: 1.4em; } .first-component .button { font-size: 1.7em; } .second-component .text { font-size: 1.2em; } .second-component .button { font-size: 1.4em; }
ASP.NET MVC #4
- خطای 404 دریافت میکنید. متد دیگری انتخاب نمیشود. اولویتی برای انتخاب اکشن متد بعدی وجود ندارد؛ بجز مواردی که صریحا به صورت مقدار پیش فرض مسیریابی مشخص شدن.
- اولویت فقط در مورد خود مسیریابیها وجود دارد. برای توضیحات بیشتر مراجعه کنید به مطلب:
«چطور مسیریابیهای ASP.NET MVC را دیباگ کنیم؟»
ASP.NET MVC #15
مشکلی که در دراز مدت با SQLDom وجود خواهد داشت، مواردی مانند SelectStarExpression و CreateProcedureStatement و امثال آن هستند. اینها را از کجا باید تشخیص داد؟ همچنین مراحل بررسی این اجزاء، نسبتا طولانی هستند و نیاز به یک راه حل عمومیتر در این زمینه وجود دارد.
راه حلی برای این مشکل در مطلب «XML ‘Visualizer’ for the TransactSql.ScriptDom parse tree» ارائه شدهاست. در اینجا تمام اجزای TSqlFragment توسط Reflection مورد بررسی و استخراج قرار گرفته و نهایتا یک فایل XML از آن حاصل میشود.
اگر نکات ذکر شده در این مقاله را تبدیل به یک برنامه با استفاده مجدد کنیم، به چنین شکلی خواهیم رسید:
این برنامه را از اینجا میتوانید دریافت کنید:
DomToXml.zip
همانطور که در تصویر مشاهده میکنید، اینبار به سادگی، SelectStarExpression قابل تشخیص است و تنها کافی است در T-SQL پردازش شده، به دنبال SelectStarExpressionها بود. برای اینکار جهت ساده شدن آنالیز میتوان با ارث بری از کلاس پایه TSqlFragmentVisitor شروع کرد:
using System; using System.Linq; using Microsoft.SqlServer.TransactSql.ScriptDom; namespace DbCop { public class SelectStarExpressionVisitor : TSqlFragmentVisitor { public override void ExplicitVisit(SelectStarExpression node) { Console.WriteLine( "`Select *` detected @StartOffset:{0}, Line:{1}, T-SQL: {2}", node.StartOffset, node.StartLine, string.Join(string.Empty, node.ScriptTokenStream.Select(x => x.Text)).Trim()); base.ExplicitVisit(node); } } }
مرحلهی بعد، اجرای این کلاس Visitor است:
public static class GenericVisitor { public static void Start(string tSql, TSqlFragmentVisitor visitor) { IList<ParseError> errors; TSqlScript sqlFragment; using (var reader = new StringReader(tSql)) { var parser = new TSql120Parser(initialQuotedIdentifiers: true); sqlFragment = (TSqlScript)parser.Parse(reader, out errors); } if (errors != null && errors.Any()) { var sb = new StringBuilder(); foreach (var error in errors) sb.AppendLine(error.Message); throw new InvalidOperationException(sb.ToString()); } sqlFragment.Accept(visitor); } }
مثالی از نحوهی استفاده از کلاس GenericVisitor فوق را در اینجا ملاحظه میکنید:
var tsql = @"WITH ctex AS ( SELECT * FROM sys.objects ) SELECT * FROM ctex"; GenericVisitor.Start(tsql, new SelectStarExpressionVisitor());