2013-08-28 3 views
0

Когда дело доходит до загрузки браузера, поддержки браузера, что-либо, о чем я, возможно, и не думал, и т. Д. Имеет ли подавляющее большинство или все ваши стили, объявленные в Javascript, повредит конечный пользователь, CSS stylesheet?Javascript Styling vs CSS stylesheets

я бросил вместе быстрый пример, показанный ниже, и так же, как это Fiddle

HTML:

<body onload="init();"> 
    <div class="container"> 
     <div class="row"> 
      <div class="col"></div> 
      <div class="col"></div> 
      <div class="col"></div> 
     </div> 
     <div class="row"> 
      <div class="col"></div> 
      <div class="col"></div> 
     </div> 
    </div> 
</body> 

Javascript:

var init = function() { 
    // Using window object to set global variables 
    // since global variables are attached to the window object anyway 
    window.container = document.getElementsByClassName("container"); 
    window.row = document.getElementsByClassName("row"); 
    // Initialize variables 
    window.rows = []; 
    window.cols = []; 

    // Get chidren counts but also setup for future use 
    window.setCounts(); 
    // Now lets calculate the widths 
    window.setWidths(); 
}; 

window.setCounts = function() { 
    for (var c = 0; c < window.row.length; c++) { 
     window.rows.push(window.row[c]); 
     window.rows[c].row_count = 0; 
     for (var i = 0; i < window.row[c].children.length; i++) { 
      if (window.row[c].children[i].className === 'col') { 
       window.rows[c].row_count += 1; 
      } 
     } 
    } 
}; 

// When the screen is resized we need to refactor the widths 
window.onresize = function(event) { 
    window.setWidths(); 
}; 

window.setWidths = function() { 
    window.wWidth = window.innerWidth; 
    window.wHeight = window.innerHeight; 
    var container_width = window.wWidth * 0.95; 
    var row_width = container_width * 0.98; 

    for (var i = 0; i < window.container.length; i++) { 
     window.container[i].style.width = (window.wWidth * 0.97) + "px"; 
     window.container[i].style.height = ((window.wHeight * 0.90)) + "px"; 
    } 

    for (var c = 0; c < window.rows.length; c++) { 
     window.rows[c].style.width = row_width + "px"; 
     for (var i = 0; i < window.rows[c].children.length; i++) { 
      if (window.rows[c].children[i].className === 'col') { 
       window.rows[c].children[i].style.width = (row_width/window.rows[c].row_count) + "px"; 
       window.rows[c].children[i].innerText = (row_width/window.rows[c].row_count) + "px"; 
      } 
     } 
    } 
}; 

И наконец CSS (временный, созерцая применяя все стилей в Javascript):

div { 
    overflow: hidden; 
} 
.container { 
    margin: auto; 
    margin-top: 5px; 
    border: 1px solid red; 
} 
.row { 
    margin: auto; 
    margin-top: 5px; 
    border: 1px solid black; 
    clear: both; 
} 
.col { 
    float: left; 
    text-align: center; 
} 

Обратите внимание:
Я хотел бы избежать реализации внешних библиотек, как JQuery, я знаю, что код я выше будет легче сделать с JQuery. До сих пор я ограничивал свои внешние библиотеки AngularJS, поскольку он является основой приложения, что позволяет сократить время обновления и возможные перерывы в моем webapp. Это вопрос предпочтения и долголетия (на мой взгляд), пожалуйста, не пытайтесь убедить меня в противном случае.

+1

Css лучше и быстрее. –

+1

Есть ли у вас какие-либо ресурсы, способные поддержать это? Это вопрос предпочтения или легче для вас, вот почему? – jnthnjns

+1

Выполнение всего, что работает в обработчике «resize», приведет к ** очень-очень-очень медленному приложению. – Pointy

ответ

5

Листы стилей CSS могут быть загружены до того, как DOM будет полностью загружен, что означает, что они могут применяться мгновенно до отображения объектов DOM.

CSS-стиль, применяемый непосредственно к объекту с помощью javascript, часто применяется ПОСЛЕ того, как объект DOM изначально отображается и никогда не может быть применен до анализа объекта DOM. Например, если вы хотите, чтобы на вашей странице был скрыт объект, указав, что в правиле CSS, загруженном из раздела <head>, вы гарантируете, что объект никогда не будет виден. Назначение CSS с помощью javascript для скрытия объекта может привести к тому, что объект будет первоначально отображаться, а затем будет запущен javascript, который скрывает его.


Кроме того, есть общая концепция, что разделение между представлением и поведением часто желательно (представление под контролем CSS и поведение под контролем JavaScript). Хотя я бы утверждал, что эти два редко полностью разделяемы, в проекте часто бывают разные люди, которые в основном работают над «взглядом» и «представлением» сайта, а также работой над «интерактивностью» или «поведением» сайта и сохранение основных аспектов, которые контролируют эти различные аспекты в отдельных местах, может быть очень полезно для поддержания сайта. Например, компания может решить изменить свою цветовую схему, и было бы намного проще найти и изменить некоторые CSS, а не искать все возможные javascript, чтобы найти все ссылки на цвет.


И, наконец, если есть ситуации, когда вам необходимо указать, какие объекты получить определенный стиль с помощью JavaScript, то вы можете поместить информацию о стайлинг в правилах CSS и использовать JavaScript, чтобы добавить классы объектов динамически. Таким образом, презентация по-прежнему указана в «более удобном для обслуживания» правилах CSS.


Все, что сказал, CSS не может все. В частности, он не может выполнять вычисления, и иногда сложная компоновка может быть более простой или более надежной для использования некоторого javascript для помощи в достижении вашей цели. Идея здесь заключается в том, чтобы выбрать самый простой и удобный способ достижения вашей цели с максимальным разделением между представлением и поведением.

3

CSS намного удобнее, чем JavaScript, и вы можете делать что-то с CSS, которые очень сложно имитировать с помощью JavaScript.

Механика, такая как add/remove_class, позволяет вам в полной мере использовать динамику CSS.

Ваш пример кода выглядит так, как будто он выполняет некоторые измерения. CSS не всегда может справиться с этим, поэтому, возможно, для этого ограниченного использования кода JavaScript лучше.

+1

Вот где я склоняюсь. Этот вопрос возник, когда я решил, что хочу избежать чрезмерного количества объявлений класса/id, например 'span1' через' span12', и сделать его максимально автоматическим. Вот почему мой пример был сфокусирован на этом аспекте. Спасибо за ваш вклад. +1 – jnthnjns